diff --git a/apps/engine/deps.nix b/apps/engine/deps.nix new file mode 100644 index 00000000..b15396f9 --- /dev/null +++ b/apps/engine/deps.nix @@ -0,0 +1,373 @@ +{ + pkgs, + lib, + beamPackages, + overrides ? (x: y: { }), + overrideFenixOverlay ? null, +}: + +let + buildMix = lib.makeOverridable beamPackages.buildMix; + buildRebar3 = lib.makeOverridable beamPackages.buildRebar3; + + workarounds = { + portCompiler = _unusedArgs: old: { + buildPlugins = [ pkgs.beamPackages.pc ]; + }; + + rustlerPrecompiled = + { + toolchain ? null, + ... + }: + old: + let + extendedPkgs = pkgs.extend fenixOverlay; + fenixOverlay = + if overrideFenixOverlay == null then + import "${ + fetchTarball { + url = "https://github.com/nix-community/fenix/archive/056c9393c821a4df356df6ce7f14c722dc8717ec.tar.gz"; + sha256 = "sha256:1cdfh6nj81gjmn689snigidyq7w98gd8hkl5rvhly6xj7vyppmnd"; + } + }/overlay.nix" + else + overrideFenixOverlay; + nativeDir = "${old.src}/native/${with builtins; head (attrNames (readDir "${old.src}/native"))}"; + fenix = + if toolchain == null then + extendedPkgs.fenix.stable + else + extendedPkgs.fenix.fromToolchainName toolchain; + native = + (extendedPkgs.makeRustPlatform { + inherit (fenix) cargo rustc; + }).buildRustPackage + { + pname = "${old.packageName}-native"; + version = old.version; + src = nativeDir; + cargoLock = { + lockFile = "${nativeDir}/Cargo.lock"; + }; + nativeBuildInputs = [ + extendedPkgs.cmake + ]; + doCheck = false; + }; + + in + { + nativeBuildInputs = [ extendedPkgs.cargo ]; + + env.RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true"; + env.RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required"; + + preConfigure = '' + mkdir -p priv/native + for lib in ${native}/lib/* + do + ln -s "$lib" "priv/native/$(basename "$lib")" + done + ''; + + buildPhase = '' + suggestion() { + echo "***********************************************" + echo " deps_nix " + echo + echo " Rust dependency build failed. " + echo + echo " If you saw network errors, you might need " + echo " to disable compilation on the appropriate " + echo " RustlerPrecompiled module in your " + echo " application config. " + echo + echo " We think you need this: " + echo + echo -n " " + grep -Rl 'use RustlerPrecompiled' lib \ + | xargs grep 'defmodule' \ + | sed 's/defmodule \(.*\) do/config :${old.packageName}, \1, skip_compilation?: true/' + echo "***********************************************" + exit 1 + } + trap suggestion ERR + ${old.buildPhase} + ''; + }; + }; + + defaultOverrides = ( + final: prev: + + let + apps = { + crc32cer = [ + { + name = "portCompiler"; + } + ]; + explorer = [ + { + name = "rustlerPrecompiled"; + toolchain = { + name = "nightly-2024-11-01"; + sha256 = "sha256-wq7bZ1/IlmmLkSa3GUJgK17dTWcKyf5A+ndS9yRwB88="; + }; + } + ]; + snappyer = [ + { + name = "portCompiler"; + } + ]; + }; + + applyOverrides = + appName: drv: + let + allOverridesForApp = builtins.foldl' ( + acc: workaround: acc // (workarounds.${workaround.name} workaround) drv + ) { } apps.${appName}; + + in + if builtins.hasAttr appName apps then drv.override allOverridesForApp else drv; + + in + builtins.mapAttrs applyOverrides prev + ); + + self = packages // (defaultOverrides self packages) // (overrides self packages); + + packages = + with beamPackages; + with self; + { + + elixir_sense = + let + version = "e3ddc403554050221a2fd19a10a896fa7525bc02"; + drv = buildMix { + inherit version; + name = "elixir_sense"; + appConfigPath = ./config; + + src = pkgs.fetchFromGitHub { + owner = "elixir-lsp"; + repo = "elixir_sense"; + rev = "e3ddc403554050221a2fd19a10a896fa7525bc02"; + hash = "sha256-Rs/c6uduC2xauSwO7FGEVYWiyhNbhSsIcw5s04d+A8M="; + }; + }; + in + drv; + + gen_lsp = + let + version = "0.11.0"; + drv = buildMix { + inherit version; + name = "gen_lsp"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "gen_lsp"; + sha256 = "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"; + }; + + beamDeps = [ + jason + nimble_options + schematic + typed_struct + ]; + }; + in + drv; + + jason = + let + version = "1.4.4"; + drv = buildMix { + inherit version; + name = "jason"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "jason"; + sha256 = "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"; + }; + }; + in + drv; + + nimble_options = + let + version = "1.1.1"; + drv = buildMix { + inherit version; + name = "nimble_options"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_options"; + sha256 = "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"; + }; + }; + in + drv; + + nimble_parsec = + let + version = "1.2.3"; + drv = buildMix { + inherit version; + name = "nimble_parsec"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_parsec"; + sha256 = "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"; + }; + }; + in + drv; + + path_glob = + let + version = "0.2.0"; + drv = buildMix { + inherit version; + name = "path_glob"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "path_glob"; + sha256 = "be2594cb4553169a1a189f95193d910115f64f15f0d689454bb4e8cfae2e7ebc"; + }; + + beamDeps = [ + nimble_parsec + ]; + }; + in + drv; + + refactorex = + let + version = "0.1.52"; + drv = buildMix { + inherit version; + name = "refactorex"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "refactorex"; + sha256 = "4927fe6c3acd1f4695d6d3e443380167d61d004d507b1279c6084433900c94d0"; + }; + + beamDeps = [ + sourceror + ]; + }; + in + drv; + + schematic = + let + version = "0.2.1"; + drv = buildMix { + inherit version; + name = "schematic"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "schematic"; + sha256 = "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"; + }; + + beamDeps = [ + telemetry + ]; + }; + in + drv; + + snowflake = + let + version = "1.0.4"; + drv = buildMix { + inherit version; + name = "snowflake"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "snowflake"; + sha256 = "badb07ebb089a5cff737738297513db3962760b10fe2b158ae3bebf0b4d5be13"; + }; + }; + in + drv; + + sourceror = + let + version = "1.10.0"; + drv = buildMix { + inherit version; + name = "sourceror"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "sourceror"; + sha256 = "29dbdfc92e04569c9d8e6efdc422fc1d815f4bd0055dc7c51b8800fb75c4b3f1"; + }; + }; + in + drv; + + telemetry = + let + version = "1.3.0"; + drv = buildRebar3 { + inherit version; + name = "telemetry"; + + src = fetchHex { + inherit version; + pkg = "telemetry"; + sha256 = "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"; + }; + }; + in + drv; + + typed_struct = + let + version = "0.3.0"; + drv = buildMix { + inherit version; + name = "typed_struct"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "typed_struct"; + sha256 = "c50bd5c3a61fe4e198a8504f939be3d3c85903b382bde4865579bc23111d1b6d"; + }; + }; + in + drv; + + }; +in +self diff --git a/apps/engine/mix.exs b/apps/engine/mix.exs index 9974a64e..9bf81c94 100644 --- a/apps/engine/mix.exs +++ b/apps/engine/mix.exs @@ -45,6 +45,7 @@ defmodule Engine.MixProject do defp deps do [ {:benchee, "~> 1.3", only: :test}, + {:deps_nix, "~> 2.4", only: :dev}, Mix.Credo.dependency(), Mix.Dialyzer.dependency(), {:elixir_sense, diff --git a/apps/engine/mix.lock b/apps/engine/mix.lock index 6bb509a3..64acb6c5 100644 --- a/apps/engine/mix.lock +++ b/apps/engine/mix.lock @@ -4,13 +4,16 @@ "castore": {:hex, :castore, "1.0.12", "053f0e32700cbec356280c0e835df425a3be4bc1e0627b714330ad9d0f05497f", [:mix], [], "hexpm", "3dca286b2186055ba0c9449b4e95b97bf1b57b47c1f2644555879e659960c224"}, "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, + "deps_nix": {:hex, :deps_nix, "2.4.0", "2be1ee54b25f7048e8974810a1dca2f1ff3d62ffaac64d83ef1f0d62e64c7cb4", [:mix], [{:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: false]}], "hexpm", "0f953f79b716d8627fd5a301615f1364d753e6c22e1380cdbd6a32f9e972370d"}, "dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"}, "elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "e3ddc403554050221a2fd19a10a896fa7525bc02", [ref: "e3ddc403554050221a2fd19a10a896fa7525bc02"]}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "gen_lsp": {:hex, :gen_lsp, "0.11.0", "9eda4d2fcaff94d9b3062e322fcf524c176db1502f584a3cff6135088b46084b", [:mix], [{:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.5 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:schematic, "~> 0.2.1", [hex: :schematic, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "patch": {:hex, :patch, "0.15.0", "947dd6a8b24a2d2d1137721f20bb96a8feb4f83248e7b4ad88b4871d52807af5", [:mix], [], "hexpm", "e8dadf9b57b30e92f6b2b1ce2f7f57700d14c66d4ed56ee27777eb73fb77e58d"}, diff --git a/apps/expert/deps.nix b/apps/expert/deps.nix new file mode 100644 index 00000000..205cc84a --- /dev/null +++ b/apps/expert/deps.nix @@ -0,0 +1,494 @@ +{ + pkgs, + lib, + beamPackages, + overrides ? (x: y: { }), + overrideFenixOverlay ? null, +}: + +let + buildMix = lib.makeOverridable beamPackages.buildMix; + buildRebar3 = lib.makeOverridable beamPackages.buildRebar3; + + workarounds = { + portCompiler = _unusedArgs: old: { + buildPlugins = [ pkgs.beamPackages.pc ]; + }; + + rustlerPrecompiled = + { + toolchain ? null, + ... + }: + old: + let + extendedPkgs = pkgs.extend fenixOverlay; + fenixOverlay = + if overrideFenixOverlay == null then + import "${ + fetchTarball { + url = "https://github.com/nix-community/fenix/archive/056c9393c821a4df356df6ce7f14c722dc8717ec.tar.gz"; + sha256 = "sha256:1cdfh6nj81gjmn689snigidyq7w98gd8hkl5rvhly6xj7vyppmnd"; + } + }/overlay.nix" + else + overrideFenixOverlay; + nativeDir = "${old.src}/native/${with builtins; head (attrNames (readDir "${old.src}/native"))}"; + fenix = + if toolchain == null then + extendedPkgs.fenix.stable + else + extendedPkgs.fenix.fromToolchainName toolchain; + native = + (extendedPkgs.makeRustPlatform { + inherit (fenix) cargo rustc; + }).buildRustPackage + { + pname = "${old.packageName}-native"; + version = old.version; + src = nativeDir; + cargoLock = { + lockFile = "${nativeDir}/Cargo.lock"; + }; + nativeBuildInputs = [ + extendedPkgs.cmake + ]; + doCheck = false; + }; + + in + { + nativeBuildInputs = [ extendedPkgs.cargo ]; + + env.RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true"; + env.RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required"; + + preConfigure = '' + mkdir -p priv/native + for lib in ${native}/lib/* + do + ln -s "$lib" "priv/native/$(basename "$lib")" + done + ''; + + buildPhase = '' + suggestion() { + echo "***********************************************" + echo " deps_nix " + echo + echo " Rust dependency build failed. " + echo + echo " If you saw network errors, you might need " + echo " to disable compilation on the appropriate " + echo " RustlerPrecompiled module in your " + echo " application config. " + echo + echo " We think you need this: " + echo + echo -n " " + grep -Rl 'use RustlerPrecompiled' lib \ + | xargs grep 'defmodule' \ + | sed 's/defmodule \(.*\) do/config :${old.packageName}, \1, skip_compilation?: true/' + echo "***********************************************" + exit 1 + } + trap suggestion ERR + ${old.buildPhase} + ''; + }; + }; + + defaultOverrides = ( + final: prev: + + let + apps = { + crc32cer = [ + { + name = "portCompiler"; + } + ]; + explorer = [ + { + name = "rustlerPrecompiled"; + toolchain = { + name = "nightly-2024-11-01"; + sha256 = "sha256-wq7bZ1/IlmmLkSa3GUJgK17dTWcKyf5A+ndS9yRwB88="; + }; + } + ]; + snappyer = [ + { + name = "portCompiler"; + } + ]; + }; + + applyOverrides = + appName: drv: + let + allOverridesForApp = builtins.foldl' ( + acc: workaround: acc // (workarounds.${workaround.name} workaround) drv + ) { } apps.${appName}; + + in + if builtins.hasAttr appName apps then drv.override allOverridesForApp else drv; + + in + builtins.mapAttrs applyOverrides prev + ); + + self = packages // (defaultOverrides self packages) // (overrides self packages); + + packages = + with beamPackages; + with self; + { + + burrito = + let + version = "1.4.0"; + drv = buildMix { + inherit version; + name = "burrito"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "burrito"; + sha256 = "0fa052e6f446cd3e5ff7e00813452b09eeadeddb5ec5174c2976eb0e4ad88765"; + }; + + beamDeps = [ + jason + req + typed_struct + ]; + }; + in + drv; + + finch = + let + version = "0.20.0"; + drv = buildMix { + inherit version; + name = "finch"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "finch"; + sha256 = "2658131a74d051aabfcba936093c903b8e89da9a1b63e430bee62045fa9b2ee2"; + }; + + beamDeps = [ + mime + mint + nimble_options + nimble_pool + telemetry + ]; + }; + in + drv; + + gen_lsp = + let + version = "0.11.0"; + drv = buildMix { + inherit version; + name = "gen_lsp"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "gen_lsp"; + sha256 = "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"; + }; + + beamDeps = [ + jason + nimble_options + schematic + typed_struct + ]; + }; + in + drv; + + hpax = + let + version = "1.0.3"; + drv = buildMix { + inherit version; + name = "hpax"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "hpax"; + sha256 = "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"; + }; + }; + in + drv; + + jason = + let + version = "1.4.4"; + drv = buildMix { + inherit version; + name = "jason"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "jason"; + sha256 = "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"; + }; + }; + in + drv; + + logger_file_backend = + let + version = "0.0.14"; + drv = buildMix { + inherit version; + name = "logger_file_backend"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "logger_file_backend"; + sha256 = "071354a18196468f3904ef09413af20971d55164267427f6257b52cfba03f9e6"; + }; + }; + in + drv; + + mime = + let + version = "2.0.7"; + drv = buildMix { + inherit version; + name = "mime"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "mime"; + sha256 = "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"; + }; + }; + in + drv; + + mint = + let + version = "1.7.1"; + drv = buildMix { + inherit version; + name = "mint"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "mint"; + sha256 = "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"; + }; + + beamDeps = [ + hpax + ]; + }; + in + drv; + + nimble_options = + let + version = "1.1.1"; + drv = buildMix { + inherit version; + name = "nimble_options"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_options"; + sha256 = "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"; + }; + }; + in + drv; + + nimble_parsec = + let + version = "1.2.3"; + drv = buildMix { + inherit version; + name = "nimble_parsec"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_parsec"; + sha256 = "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"; + }; + }; + in + drv; + + nimble_pool = + let + version = "1.1.0"; + drv = buildMix { + inherit version; + name = "nimble_pool"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_pool"; + sha256 = "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"; + }; + }; + in + drv; + + path_glob = + let + version = "0.2.0"; + drv = buildMix { + inherit version; + name = "path_glob"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "path_glob"; + sha256 = "be2594cb4553169a1a189f95193d910115f64f15f0d689454bb4e8cfae2e7ebc"; + }; + + beamDeps = [ + nimble_parsec + ]; + }; + in + drv; + + req = + let + version = "0.5.15"; + drv = buildMix { + inherit version; + name = "req"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "req"; + sha256 = "a6513a35fad65467893ced9785457e91693352c70b58bbc045b47e5eb2ef0c53"; + }; + + beamDeps = [ + finch + jason + mime + ]; + }; + in + drv; + + schematic = + let + version = "0.2.1"; + drv = buildMix { + inherit version; + name = "schematic"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "schematic"; + sha256 = "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"; + }; + + beamDeps = [ + telemetry + ]; + }; + in + drv; + + snowflake = + let + version = "1.0.4"; + drv = buildMix { + inherit version; + name = "snowflake"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "snowflake"; + sha256 = "badb07ebb089a5cff737738297513db3962760b10fe2b158ae3bebf0b4d5be13"; + }; + }; + in + drv; + + sourceror = + let + version = "1.10.0"; + drv = buildMix { + inherit version; + name = "sourceror"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "sourceror"; + sha256 = "29dbdfc92e04569c9d8e6efdc422fc1d815f4bd0055dc7c51b8800fb75c4b3f1"; + }; + }; + in + drv; + + telemetry = + let + version = "1.3.0"; + drv = buildRebar3 { + inherit version; + name = "telemetry"; + + src = fetchHex { + inherit version; + pkg = "telemetry"; + sha256 = "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"; + }; + }; + in + drv; + + typed_struct = + let + version = "0.3.0"; + drv = buildMix { + inherit version; + name = "typed_struct"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "typed_struct"; + sha256 = "c50bd5c3a61fe4e198a8504f939be3d3c85903b382bde4865579bc23111d1b6d"; + }; + }; + in + drv; + + }; +in +self diff --git a/apps/expert/mix.exs b/apps/expert/mix.exs index d0cfa286..2423ed1e 100644 --- a/apps/expert/mix.exs +++ b/apps/expert/mix.exs @@ -78,6 +78,7 @@ defmodule Expert.MixProject do defp deps do [ {:burrito, "~> 1.4", only: [:dev, :prod]}, + {:deps_nix, "~> 2.4", only: :dev}, Mix.Credo.dependency(), Mix.Dialyzer.dependency(), # In practice Expert does not hardly depend on Engine, only on its compiled diff --git a/apps/expert/mix.lock b/apps/expert/mix.lock index 714cc893..591e59f6 100644 --- a/apps/expert/mix.lock +++ b/apps/expert/mix.lock @@ -2,6 +2,7 @@ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "burrito": {:hex, :burrito, "1.4.0", "f94fa1c3f174575bc4cad887a2940fd77469e1985c3a6633fcdcfa72f915caf2", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:req, ">= 0.5.0", [hex: :req, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.2.0 or ~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "0fa052e6f446cd3e5ff7e00813452b09eeadeddb5ec5174c2976eb0e4ad88765"}, "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"}, + "deps_nix": {:hex, :deps_nix, "2.4.0", "2be1ee54b25f7048e8974810a1dca2f1ff3d62ffaac64d83ef1f0d62e64c7cb4", [:mix], [{:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: false]}], "hexpm", "0f953f79b716d8627fd5a301615f1364d753e6c22e1380cdbd6a32f9e972370d"}, "dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"}, "elixir_sense": {:git, "https://github.com/elixir-lsp/elixir_sense.git", "e3ddc403554050221a2fd19a10a896fa7525bc02", [ref: "e3ddc403554050221a2fd19a10a896fa7525bc02"]}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, diff --git a/apps/expert_credo/deps.nix b/apps/expert_credo/deps.nix new file mode 100644 index 00000000..dddc486d --- /dev/null +++ b/apps/expert_credo/deps.nix @@ -0,0 +1,296 @@ +{ + pkgs, + lib, + beamPackages, + overrides ? (x: y: { }), + overrideFenixOverlay ? null, +}: + +let + buildMix = lib.makeOverridable beamPackages.buildMix; + buildRebar3 = lib.makeOverridable beamPackages.buildRebar3; + + workarounds = { + portCompiler = _unusedArgs: old: { + buildPlugins = [ pkgs.beamPackages.pc ]; + }; + + rustlerPrecompiled = + { + toolchain ? null, + ... + }: + old: + let + extendedPkgs = pkgs.extend fenixOverlay; + fenixOverlay = + if overrideFenixOverlay == null then + import "${ + fetchTarball { + url = "https://github.com/nix-community/fenix/archive/056c9393c821a4df356df6ce7f14c722dc8717ec.tar.gz"; + sha256 = "sha256:1cdfh6nj81gjmn689snigidyq7w98gd8hkl5rvhly6xj7vyppmnd"; + } + }/overlay.nix" + else + overrideFenixOverlay; + nativeDir = "${old.src}/native/${with builtins; head (attrNames (readDir "${old.src}/native"))}"; + fenix = + if toolchain == null then + extendedPkgs.fenix.stable + else + extendedPkgs.fenix.fromToolchainName toolchain; + native = + (extendedPkgs.makeRustPlatform { + inherit (fenix) cargo rustc; + }).buildRustPackage + { + pname = "${old.packageName}-native"; + version = old.version; + src = nativeDir; + cargoLock = { + lockFile = "${nativeDir}/Cargo.lock"; + }; + nativeBuildInputs = [ + extendedPkgs.cmake + ]; + doCheck = false; + }; + + in + { + nativeBuildInputs = [ extendedPkgs.cargo ]; + + env.RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true"; + env.RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required"; + + preConfigure = '' + mkdir -p priv/native + for lib in ${native}/lib/* + do + ln -s "$lib" "priv/native/$(basename "$lib")" + done + ''; + + buildPhase = '' + suggestion() { + echo "***********************************************" + echo " deps_nix " + echo + echo " Rust dependency build failed. " + echo + echo " If you saw network errors, you might need " + echo " to disable compilation on the appropriate " + echo " RustlerPrecompiled module in your " + echo " application config. " + echo + echo " We think you need this: " + echo + echo -n " " + grep -Rl 'use RustlerPrecompiled' lib \ + | xargs grep 'defmodule' \ + | sed 's/defmodule \(.*\) do/config :${old.packageName}, \1, skip_compilation?: true/' + echo "***********************************************" + exit 1 + } + trap suggestion ERR + ${old.buildPhase} + ''; + }; + }; + + defaultOverrides = ( + final: prev: + + let + apps = { + crc32cer = [ + { + name = "portCompiler"; + } + ]; + explorer = [ + { + name = "rustlerPrecompiled"; + toolchain = { + name = "nightly-2024-11-01"; + sha256 = "sha256-wq7bZ1/IlmmLkSa3GUJgK17dTWcKyf5A+ndS9yRwB88="; + }; + } + ]; + snappyer = [ + { + name = "portCompiler"; + } + ]; + }; + + applyOverrides = + appName: drv: + let + allOverridesForApp = builtins.foldl' ( + acc: workaround: acc // (workarounds.${workaround.name} workaround) drv + ) { } apps.${appName}; + + in + if builtins.hasAttr appName apps then drv.override allOverridesForApp else drv; + + in + builtins.mapAttrs applyOverrides prev + ); + + self = packages // (defaultOverrides self packages) // (overrides self packages); + + packages = + with beamPackages; + with self; + { + + gen_lsp = + let + version = "0.11.0"; + drv = buildMix { + inherit version; + name = "gen_lsp"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "gen_lsp"; + sha256 = "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"; + }; + + beamDeps = [ + jason + nimble_options + schematic + typed_struct + ]; + }; + in + drv; + + jason = + let + version = "1.4.4"; + drv = buildMix { + inherit version; + name = "jason"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "jason"; + sha256 = "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"; + }; + }; + in + drv; + + nimble_options = + let + version = "1.1.1"; + drv = buildMix { + inherit version; + name = "nimble_options"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_options"; + sha256 = "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"; + }; + }; + in + drv; + + schematic = + let + version = "0.2.1"; + drv = buildMix { + inherit version; + name = "schematic"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "schematic"; + sha256 = "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"; + }; + + beamDeps = [ + telemetry + ]; + }; + in + drv; + + snowflake = + let + version = "1.0.4"; + drv = buildMix { + inherit version; + name = "snowflake"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "snowflake"; + sha256 = "badb07ebb089a5cff737738297513db3962760b10fe2b158ae3bebf0b4d5be13"; + }; + }; + in + drv; + + sourceror = + let + version = "1.9.0"; + drv = buildMix { + inherit version; + name = "sourceror"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "sourceror"; + sha256 = "d20a9dd5efe162f0d75a307146faa2e17b823ea4f134f662358d70f0332fed82"; + }; + }; + in + drv; + + telemetry = + let + version = "1.3.0"; + drv = buildRebar3 { + inherit version; + name = "telemetry"; + + src = fetchHex { + inherit version; + pkg = "telemetry"; + sha256 = "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"; + }; + }; + in + drv; + + typed_struct = + let + version = "0.3.0"; + drv = buildMix { + inherit version; + name = "typed_struct"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "typed_struct"; + sha256 = "c50bd5c3a61fe4e198a8504f939be3d3c85903b382bde4865579bc23111d1b6d"; + }; + }; + in + drv; + + }; +in +self diff --git a/apps/expert_credo/mix.exs b/apps/expert_credo/mix.exs index 2f23d93b..71d6ad2e 100644 --- a/apps/expert_credo/mix.exs +++ b/apps/expert_credo/mix.exs @@ -29,6 +29,7 @@ defmodule ExpertCredo.MixProject do [ {:forge, path: "../forge"}, {:credo, "> 0.0.0", only: [:dev, :test]}, + {:deps_nix, "~> 2.4", only: :dev}, Mix.Dialyzer.dependency(), {:jason, "> 0.0.0", optional: true}, {:ex_doc, "~> 0.34", optional: true, only: [:dev, :hex]} diff --git a/apps/expert_credo/mix.lock b/apps/expert_credo/mix.lock index 14fe5efb..e7c80dfe 100644 --- a/apps/expert_credo/mix.lock +++ b/apps/expert_credo/mix.lock @@ -1,16 +1,19 @@ %{ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"}, + "deps_nix": {:hex, :deps_nix, "2.4.0", "2be1ee54b25f7048e8974810a1dca2f1ff3d62ffaac64d83ef1f0d62e64c7cb4", [:mix], [{:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: false]}], "hexpm", "0f953f79b716d8627fd5a301615f1364d753e6c22e1380cdbd6a32f9e972370d"}, "dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"}, "earmark_parser": {:hex, :earmark_parser, "1.4.43", "34b2f401fe473080e39ff2b90feb8ddfeef7639f8ee0bbf71bb41911831d77c5", [:mix], [], "hexpm", "970a3cd19503f5e8e527a190662be2cee5d98eed1ff72ed9b3d1a3d466692de8"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, "ex_doc": {:hex, :ex_doc, "0.37.2", "2a3aa7014094f0e4e286a82aa5194a34dd17057160988b8509b15aa6c292720c", [:mix], [{:earmark_parser, "~> 1.4.42", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "4dfa56075ce4887e4e8b1dcc121cd5fcb0f02b00391fd367ff5336d98fa49049"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "gen_lsp": {:hex, :gen_lsp, "0.11.0", "9eda4d2fcaff94d9b3062e322fcf524c176db1502f584a3cff6135088b46084b", [:mix], [{:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.5 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:schematic, "~> 0.2.1", [hex: :schematic, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, "makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "schematic": {:hex, :schematic, "0.2.1", "0b091df94146fd15a0a343d1bd179a6c5a58562527746dadd09477311698dbb1", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"}, diff --git a/apps/forge/deps.nix b/apps/forge/deps.nix new file mode 100644 index 00000000..dddc486d --- /dev/null +++ b/apps/forge/deps.nix @@ -0,0 +1,296 @@ +{ + pkgs, + lib, + beamPackages, + overrides ? (x: y: { }), + overrideFenixOverlay ? null, +}: + +let + buildMix = lib.makeOverridable beamPackages.buildMix; + buildRebar3 = lib.makeOverridable beamPackages.buildRebar3; + + workarounds = { + portCompiler = _unusedArgs: old: { + buildPlugins = [ pkgs.beamPackages.pc ]; + }; + + rustlerPrecompiled = + { + toolchain ? null, + ... + }: + old: + let + extendedPkgs = pkgs.extend fenixOverlay; + fenixOverlay = + if overrideFenixOverlay == null then + import "${ + fetchTarball { + url = "https://github.com/nix-community/fenix/archive/056c9393c821a4df356df6ce7f14c722dc8717ec.tar.gz"; + sha256 = "sha256:1cdfh6nj81gjmn689snigidyq7w98gd8hkl5rvhly6xj7vyppmnd"; + } + }/overlay.nix" + else + overrideFenixOverlay; + nativeDir = "${old.src}/native/${with builtins; head (attrNames (readDir "${old.src}/native"))}"; + fenix = + if toolchain == null then + extendedPkgs.fenix.stable + else + extendedPkgs.fenix.fromToolchainName toolchain; + native = + (extendedPkgs.makeRustPlatform { + inherit (fenix) cargo rustc; + }).buildRustPackage + { + pname = "${old.packageName}-native"; + version = old.version; + src = nativeDir; + cargoLock = { + lockFile = "${nativeDir}/Cargo.lock"; + }; + nativeBuildInputs = [ + extendedPkgs.cmake + ]; + doCheck = false; + }; + + in + { + nativeBuildInputs = [ extendedPkgs.cargo ]; + + env.RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true"; + env.RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required"; + + preConfigure = '' + mkdir -p priv/native + for lib in ${native}/lib/* + do + ln -s "$lib" "priv/native/$(basename "$lib")" + done + ''; + + buildPhase = '' + suggestion() { + echo "***********************************************" + echo " deps_nix " + echo + echo " Rust dependency build failed. " + echo + echo " If you saw network errors, you might need " + echo " to disable compilation on the appropriate " + echo " RustlerPrecompiled module in your " + echo " application config. " + echo + echo " We think you need this: " + echo + echo -n " " + grep -Rl 'use RustlerPrecompiled' lib \ + | xargs grep 'defmodule' \ + | sed 's/defmodule \(.*\) do/config :${old.packageName}, \1, skip_compilation?: true/' + echo "***********************************************" + exit 1 + } + trap suggestion ERR + ${old.buildPhase} + ''; + }; + }; + + defaultOverrides = ( + final: prev: + + let + apps = { + crc32cer = [ + { + name = "portCompiler"; + } + ]; + explorer = [ + { + name = "rustlerPrecompiled"; + toolchain = { + name = "nightly-2024-11-01"; + sha256 = "sha256-wq7bZ1/IlmmLkSa3GUJgK17dTWcKyf5A+ndS9yRwB88="; + }; + } + ]; + snappyer = [ + { + name = "portCompiler"; + } + ]; + }; + + applyOverrides = + appName: drv: + let + allOverridesForApp = builtins.foldl' ( + acc: workaround: acc // (workarounds.${workaround.name} workaround) drv + ) { } apps.${appName}; + + in + if builtins.hasAttr appName apps then drv.override allOverridesForApp else drv; + + in + builtins.mapAttrs applyOverrides prev + ); + + self = packages // (defaultOverrides self packages) // (overrides self packages); + + packages = + with beamPackages; + with self; + { + + gen_lsp = + let + version = "0.11.0"; + drv = buildMix { + inherit version; + name = "gen_lsp"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "gen_lsp"; + sha256 = "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"; + }; + + beamDeps = [ + jason + nimble_options + schematic + typed_struct + ]; + }; + in + drv; + + jason = + let + version = "1.4.4"; + drv = buildMix { + inherit version; + name = "jason"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "jason"; + sha256 = "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"; + }; + }; + in + drv; + + nimble_options = + let + version = "1.1.1"; + drv = buildMix { + inherit version; + name = "nimble_options"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "nimble_options"; + sha256 = "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"; + }; + }; + in + drv; + + schematic = + let + version = "0.2.1"; + drv = buildMix { + inherit version; + name = "schematic"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "schematic"; + sha256 = "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"; + }; + + beamDeps = [ + telemetry + ]; + }; + in + drv; + + snowflake = + let + version = "1.0.4"; + drv = buildMix { + inherit version; + name = "snowflake"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "snowflake"; + sha256 = "badb07ebb089a5cff737738297513db3962760b10fe2b158ae3bebf0b4d5be13"; + }; + }; + in + drv; + + sourceror = + let + version = "1.9.0"; + drv = buildMix { + inherit version; + name = "sourceror"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "sourceror"; + sha256 = "d20a9dd5efe162f0d75a307146faa2e17b823ea4f134f662358d70f0332fed82"; + }; + }; + in + drv; + + telemetry = + let + version = "1.3.0"; + drv = buildRebar3 { + inherit version; + name = "telemetry"; + + src = fetchHex { + inherit version; + pkg = "telemetry"; + sha256 = "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"; + }; + }; + in + drv; + + typed_struct = + let + version = "0.3.0"; + drv = buildMix { + inherit version; + name = "typed_struct"; + appConfigPath = ./config; + + src = fetchHex { + inherit version; + pkg = "typed_struct"; + sha256 = "c50bd5c3a61fe4e198a8504f939be3d3c85903b382bde4865579bc23111d1b6d"; + }; + }; + in + drv; + + }; +in +self diff --git a/apps/forge/mix.exs b/apps/forge/mix.exs index 89e901bd..9b32fed3 100644 --- a/apps/forge/mix.exs +++ b/apps/forge/mix.exs @@ -38,6 +38,7 @@ defmodule Forge.MixProject do {:benchee, "~> 1.3", only: :test}, Mix.Credo.dependency(), Mix.Dialyzer.dependency(), + {:deps_nix, "~> 2.4", only: :dev}, {:gen_lsp, "~> 0.11"}, {:snowflake, "~> 1.0"}, {:sourceror, "~> 1.9"}, diff --git a/apps/forge/mix.lock b/apps/forge/mix.lock index 3b6dbddd..c575e428 100644 --- a/apps/forge/mix.lock +++ b/apps/forge/mix.lock @@ -3,11 +3,14 @@ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, + "deps_nix": {:hex, :deps_nix, "2.4.0", "2be1ee54b25f7048e8974810a1dca2f1ff3d62ffaac64d83ef1f0d62e64c7cb4", [:mix], [{:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: false]}], "hexpm", "0f953f79b716d8627fd5a301615f1364d753e6c22e1380cdbd6a32f9e972370d"}, "dialyxir": {:hex, :dialyxir, "1.4.5", "ca1571ac18e0f88d4ab245f0b60fa31ff1b12cbae2b11bd25d207f865e8ae78a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b0fb08bb8107c750db5c0b324fa2df5ceaa0f9307690ee3c1f6ba5b9eb5d35c3"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "gen_lsp": {:hex, :gen_lsp, "0.11.0", "9eda4d2fcaff94d9b3062e322fcf524c176db1502f584a3cff6135088b46084b", [:mix], [{:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.5 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:schematic, "~> 0.2.1", [hex: :schematic, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "d67c20650a5290a02f7bac53083ac4487d3c6b461f35a8b14c5d2d7638c20d26"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "patch": {:hex, :patch, "0.15.0", "947dd6a8b24a2d2d1137721f20bb96a8feb4f83248e7b4ad88b4871d52807af5", [:mix], [], "hexpm", "e8dadf9b57b30e92f6b2b1ce2f7f57700d14c66d4ed56ee27777eb73fb77e58d"}, "schematic": {:hex, :schematic, "0.2.1", "0b091df94146fd15a0a343d1bd179a6c5a58562527746dadd09477311698dbb1", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0b255d65921e38006138201cd4263fd8bb807d9dfc511074615cd264a571b3b1"}, diff --git a/flake.lock b/flake.lock index 08730fa5..4e92639c 100644 --- a/flake.lock +++ b/flake.lock @@ -5,14 +5,16 @@ "flake-parts": [ "flake-parts" ], - "nixpkgs": "nixpkgs" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1754773944, - "narHash": "sha256-N7OHT0uUblt9XXqRXS18u74/AIo+dpXIRe7Y4Wr/7J8=", + "lastModified": 1756346526, + "narHash": "sha256-ejG8c5hp6OsiPyFeM0GBbx3ytkoA8XWZR6SEXwx2xX8=", "owner": "elixir-tools", "repo": "nix-beam-flakes", - "rev": "ac950a8ca59a5f4c32fc0669637672f1e63573ec", + "rev": "00ec29d1b20cad1c3b8736b373eedcab7f049a13", "type": "github" }, "original": { @@ -41,16 +43,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1748344075, - "narHash": "sha256-PsZAY3H0e/PBoDVn4fLwGEmeSwESj7SZPZ6CMfgbWFU=", - "owner": "NixOS", + "lastModified": 1756266583, + "narHash": "sha256-cr748nSmpfvnhqSXPiCfUPxRz2FJnvf/RjJGvFfaCsM=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "e0042dedfbc9134ef973f64e5c7f56a38cc5cc97", + "rev": "8a6d5427d99ec71c64f0b93d45778c889005d9c2", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", + "owner": "nixos", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -67,41 +69,11 @@ "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1749903597, - "narHash": "sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "41da1e3ea8e23e094e5e3eeb1e6b830468a7399e", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, "root": { "inputs": { "beam-flakes": "beam-flakes", "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs_2", - "systems": "systems" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" + "nixpkgs": "nixpkgs" } } }, diff --git a/flake.nix b/flake.nix index 076c1124..2ceeabc1 100644 --- a/flake.nix +++ b/flake.nix @@ -1,74 +1,82 @@ { description = "Reimagined language server for Elixir"; - inputs.nixpkgs.url = "flake:nixpkgs"; - inputs.beam-flakes.url = "github:elixir-tools/nix-beam-flakes"; - inputs.beam-flakes.inputs.flake-parts.follows = "flake-parts"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; - inputs.flake-parts.url = "github:hercules-ci/flake-parts"; - inputs.systems.url = "github:nix-systems/default"; + beam-flakes.url = "github:elixir-tools/nix-beam-flakes"; + beam-flakes.inputs.flake-parts.follows = "flake-parts"; + beam-flakes.inputs.nixpkgs.follows = "nixpkgs"; - outputs = { - self, - systems, - beam-flakes, - ... - } @ inputs: - inputs.flake-parts.lib.mkFlake {inherit inputs;} { - imports = [beam-flakes.flakeModule]; - flake = { - lib = { - mkExpert = {erlang}: erlang.callPackage ./nix/expert.nix {}; - }; - }; + flake-parts.url = "github:hercules-ci/flake-parts"; + }; - systems = import systems; + outputs = + { self, ... }@inputs: + inputs.flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ inputs.beam-flakes.flakeModule ]; - perSystem = {pkgs, ...}: let - erlang = pkgs.beam.packages.erlang_25; - expert = self.lib.mkExpert {inherit erlang;}; - in { - formatter = pkgs.alejandra; + systems = [ + "x86_64-darwin" + "aarch64-darwin" + "x86_64-linux" + "aarch64-linux" + ]; - apps.update-hash = let - script = pkgs.writeShellApplication { - name = "update-hash"; + perSystem = + { lib, pkgs, ... }: + let + beamPackages = pkgs.beamMinimal27Packages.extend ( + _: prev: { + elixir = prev.elixir_1_17; + } + ); + in + { + formatter = pkgs.nixfmt; - runtimeInputs = [pkgs.nixFlakes pkgs.gawk]; + apps.update-deps = + let + script = pkgs.writeShellApplication { + name = "update-deps"; - text = '' - nix --extra-experimental-features 'nix-command flakes' \ - build --no-link "${self}#__fodHashGen" 2>&1 | gawk '/got:/ { print $2 }' || true - ''; - }; - in { - type = "app"; - program = "${script}/bin/update-hash"; - }; + runtimeInputs = [ + beamPackages.elixir + pkgs.just + ]; - packages = { - inherit expert; - default = expert; + text = '' + just mix all deps.get + just mix all deps.nix + ''; + }; + in + { + type = "app"; + program = lib.getExe script; + }; - __fodHashGen = expert.mixFodDeps.overrideAttrs (final: curr: { - outputHash = pkgs.lib.fakeSha256; - }); - }; - beamWorkspace = { - enable = true; - devShell.languageServers.elixir = false; - devShell.languageServers.erlang = false; - versions = { - elixir = "1.17.3"; - erlang = "27.3.4.1"; + packages = rec { + default = expert; + + expert = pkgs.callPackage ./nix/expert.nix { inherit beamPackages; }; + }; + + beamWorkspace = { + enable = true; + devShell.languageServers.elixir = false; + devShell.languageServers.erlang = false; + versions = { + elixir = "1.17.3"; + erlang = "27.3.4.1"; + }; + devShell.extraPackages = with pkgs; [ + zig + xz + just + _7zz + ]; }; - devShell.extraPackages = with pkgs; [ - zig - xz - just - _7zz - ]; }; - }; }; } diff --git a/nix/expert.nix b/nix/expert.nix index 7fcf4f18..e91f7005 100644 --- a/nix/expert.nix +++ b/nix/expert.nix @@ -1,43 +1,62 @@ { - mixRelease, - fetchMixDeps, - elixir, - writeScript, + beamPackages, + callPackages, + lib, }: -mixRelease rec { - pname = "expert"; - version = "development"; - - src = ./..; - - mixFodDeps = fetchMixDeps { - inherit pname; - inherit version; +let + version = builtins.readFile ../version.txt; - src = ./..; + engineDeps = callPackages ../apps/engine/deps.nix { + inherit lib beamPackages; + }; +in +beamPackages.mixRelease rec { + pname = "expert"; + inherit version; + + src = lib.fileset.toSource { + root = ./..; + fileset = lib.fileset.unions [ + ../apps + ../mix_credo.exs + ../mix_dialyzer.exs + ../mix_includes.exs + ../version.txt + ]; + }; - sha256 = builtins.readFile ./hash; + mixNixDeps = callPackages ../apps/expert/deps.nix { + inherit lib beamPackages; }; - installPhase = '' - runHook preInstall + mixReleaseName = "plain"; - mix do compile --no-deps-check, package --path "$out" + preConfigure = '' + # copy the logic from mixRelease to build a deps dir for engine + mkdir -p apps/engine/deps + ${lib.concatMapStringsSep "\n" (dep: '' + dep_name=$(basename ${dep} | cut -d '-' -f2) + dep_path="apps/engine/deps/$dep_name" + if [ -d "${dep}/src" ]; then + ln -s ${dep}/src $dep_path + fi + '') (builtins.attrValues engineDeps)} - runHook postInstall + cd apps/expert ''; - preFixup = let - activate_version_manager = writeScript "activate_version_manager.sh" '' - true - ''; - in '' - substituteInPlace "$out/bin/start_expert.sh" --replace 'elixir_command=' 'elixir_command="${elixir}/bin/"' - rm "$out/bin/activate_version_manager.sh" - ln -s ${activate_version_manager} "$out/bin/activate_version_manager.sh" + postInstall = '' + mv $out/bin/plain $out/bin/expert + wrapProgram $out/bin/expert --add-flag start + ''; - mv "$out/bin" "$out/binsh" + removeCookie = false; - makeWrapper "$out/binsh/start_expert.sh" "$out/bin/expert" --set RELEASE_COOKIE expert - ''; + passthru = { + # not used by package, but exposed for repl and direct build access + # e.g. nix build .#expert.mixNixDeps.jason + inherit engineDeps mixNixDeps; + }; + + meta.mainProgram = "expert"; } diff --git a/nix/hash b/nix/hash deleted file mode 100644 index aea3a2db..00000000 --- a/nix/hash +++ /dev/null @@ -1 +0,0 @@ -sha256-ojl0uUaODC4pJDGY/Mv8prdkorhQ2PAnWNTx9vXUkfc=