From 44323b5dcd219511ea969b1d483afb0be9503c48 Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Fri, 28 Aug 2026 13:26:43 -0400 Subject: [PATCH 01/10] beamPackages.mixRelease: extract mixEscriptSetupHook Assisted-By: Claude Opus 5 (1M context) --- pkgs/development/beam-modules/default.nix | 3 +- .../beam-modules/hooks/default.nix | 11 ++++-- .../hooks/mix-escript-setup-hook.sh | 28 +++++++++++++++ pkgs/development/beam-modules/mix-release.nix | 36 ++++++------------- 4 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh diff --git a/pkgs/development/beam-modules/default.nix b/pkgs/development/beam-modules/default.nix index ac2536a46c92..675521d216d7 100644 --- a/pkgs/development/beam-modules/default.nix +++ b/pkgs/development/beam-modules/default.nix @@ -82,9 +82,10 @@ makeScopeWithSplicing' { inherit (pkgs.callPackages ./hooks { }) beamCopySourceHook beamModuleInstallHook + mixAppConfigPatchHook mixBuildDirHook mixCompileHook - mixAppConfigPatchHook + mixEscriptSetupHook rebar3CompileHook rebarDevendorPatchHook ; diff --git a/pkgs/development/beam-modules/hooks/default.nix b/pkgs/development/beam-modules/hooks/default.nix index cb567537f628..4b87953ab1f4 100644 --- a/pkgs/development/beam-modules/hooks/default.nix +++ b/pkgs/development/beam-modules/hooks/default.nix @@ -13,6 +13,11 @@ meta.license = lib.licenses.mit; } ./beam-module-install-hook.sh; + mixAppConfigPatchHook = makeSetupHook { + name = "mix-config-patch-hook.sh"; + meta.license = lib.licenses.mit; + } ./mix-app-config-patch-hook.sh; + mixBuildDirHook = makeSetupHook { name = "mix-configure-hook.sh"; meta.license = lib.licenses.mit; @@ -23,10 +28,10 @@ meta.license = lib.licenses.mit; } ./mix-compile-hook.sh; - mixAppConfigPatchHook = makeSetupHook { - name = "mix-config-patch-hook.sh"; + mixEscriptSetupHook = makeSetupHook { + name = "mix-escript-setup-hook.sh"; meta.license = lib.licenses.mit; - } ./mix-app-config-patch-hook.sh; + } ./mix-escript-setup-hook.sh; rebar3CompileHook = makeSetupHook { name = "rebar3-compile-hook.sh"; diff --git a/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh new file mode 100644 index 000000000000..87f93718ec97 --- /dev/null +++ b/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh @@ -0,0 +1,28 @@ +# shellcheck shell=bash + +mixEscriptBuild() { + echo "Executing mixEscriptBuild" + + mix escript.build --no-deps-check + + echo "Finished mixEscriptBuild" +} + +mixEscriptInstall() { + echo "Executing mixEscriptInstall" + + runHook preInstall + + mkdir -p "$out/bin" + cp "$escriptBinName" "$out/bin" + + runHook postInstall + + echo "Finished mixEscriptInstall" +} + +postBuildHooks+=(mixEscriptBuild) + +if [ -z "${dontMixEscriptInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=mixEscriptInstall +fi diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index fcb383936249..60505f060993 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -17,6 +17,7 @@ gnugrep, gawk, mixBuildDirHook, + mixEscriptSetupHook, }@inputs: lib.extendMkDerivation { @@ -106,20 +107,17 @@ lib.extendMkDerivation { erlang elixir hex + + bbe + findutils git + makeWrapper + ripgrep + mixBuildDirHook ] - ++ - # Mix deps - (builtins.attrValues mixNixDeps) - ++ - # other compile-time deps - [ - findutils - ripgrep - bbe - makeWrapper - ]; + ++ lib.optionals (escriptBinName != null) [ mixEscriptSetupHook ] + ++ (builtins.attrValues mixNixDeps); buildInputs = [ bashNonInteractive @@ -216,10 +214,6 @@ lib.extendMkDerivation { mix compile --no-deps-check ${lib.concatStringsSep " " compileFlags} - ${lib.optionalString (escriptBinName != null) '' - mix escript.build --no-deps-check - ''} - runHook postBuild ''; @@ -227,17 +221,7 @@ lib.extendMkDerivation { attrs.installPhase or '' runHook preInstall - ${ - if (escriptBinName != null) then - '' - mkdir -p $out/bin - cp ${escriptBinName} $out/bin - '' - else - '' - mix release ${mixReleaseName} --no-deps-check --path "$out" - '' - } + mix release ${mixReleaseName} --no-deps-check --path "$out" runHook postInstall ''; From ab47a5d584b131e34cb5273ee77ad3f4639d2bec Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Fri, 28 Aug 2026 13:26:43 -0400 Subject: [PATCH 02/10] beamPackages.mixRelease: extract mixReleaseSetupHook Assisted-By: Claude Opus 5 (1M context) --- pkgs/development/beam-modules/default.nix | 1 + .../beam-modules/hooks/default.nix | 5 ++++ .../hooks/mix-release-setup-hook.sh | 17 ++++++++++++++ pkgs/development/beam-modules/mix-release.nix | 23 ++++--------------- 4 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh diff --git a/pkgs/development/beam-modules/default.nix b/pkgs/development/beam-modules/default.nix index 675521d216d7..fb0b8b5debad 100644 --- a/pkgs/development/beam-modules/default.nix +++ b/pkgs/development/beam-modules/default.nix @@ -86,6 +86,7 @@ makeScopeWithSplicing' { mixBuildDirHook mixCompileHook mixEscriptSetupHook + mixReleaseSetupHook rebar3CompileHook rebarDevendorPatchHook ; diff --git a/pkgs/development/beam-modules/hooks/default.nix b/pkgs/development/beam-modules/hooks/default.nix index 4b87953ab1f4..304134c645fe 100644 --- a/pkgs/development/beam-modules/hooks/default.nix +++ b/pkgs/development/beam-modules/hooks/default.nix @@ -33,6 +33,11 @@ meta.license = lib.licenses.mit; } ./mix-escript-setup-hook.sh; + mixReleaseSetupHook = makeSetupHook { + name = "mix-release-setup-hook.sh"; + meta.license = lib.licenses.mit; + } ./mix-release-setup-hook.sh; + rebar3CompileHook = makeSetupHook { name = "rebar3-compile-hook.sh"; meta.license = lib.licenses.mit; diff --git a/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh new file mode 100644 index 000000000000..b073f63cbcc1 --- /dev/null +++ b/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh @@ -0,0 +1,17 @@ +# shellcheck shell=bash + +mixReleaseInstallHook() { + echo "Executing mixReleaseInstallHook" + + runHook preInstall + + mix release ${mixReleaseName:+"$mixReleaseName"} --no-deps-check --path "$out" + + runHook postInstall + + echo "Finished mixReleaseInstallHook" +} + +if [ -z "${dontMixReleaseInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=mixReleaseInstallHook +fi diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index 60505f060993..d8fb15bd89c2 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -17,7 +17,9 @@ gnugrep, gawk, mixBuildDirHook, + mixCompileHook, mixEscriptSetupHook, + mixReleaseSetupHook, }@inputs: lib.extendMkDerivation { @@ -42,6 +44,7 @@ lib.extendMkDerivation { mixEnv ? "prod", mixTarget ? "host", compileFlags ? [ ], + mixCompileFlags ? compileFlags, # Build a particular named release. # see https://hexdocs.pm/mix/1.12/Mix.Tasks.Release.html#content mixReleaseName ? "", @@ -115,8 +118,10 @@ lib.extendMkDerivation { ripgrep mixBuildDirHook + mixCompileHook ] ++ lib.optionals (escriptBinName != null) [ mixEscriptSetupHook ] + ++ lib.optionals (escriptBinName == null) [ mixReleaseSetupHook ] ++ (builtins.attrValues mixNixDeps); buildInputs = [ @@ -208,24 +213,6 @@ lib.extendMkDerivation { runHook postConfigure ''; - buildPhase = - attrs.buildPhase or '' - runHook preBuild - - mix compile --no-deps-check ${lib.concatStringsSep " " compileFlags} - - runHook postBuild - ''; - - installPhase = - attrs.installPhase or '' - runHook preInstall - - mix release ${mixReleaseName} --no-deps-check --path "$out" - - runHook postInstall - ''; - postFixup = '' echo "removing files for Microsoft Windows" rm -f "$out"/bin/*.bat From 71cfdbc3598cd14e94a5b36297326b2281522ed7 Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Mon, 14 Sep 2026 23:01:37 -0400 Subject: [PATCH 03/10] beamPackages.mixRelease: use writableTmpDirAsHomeHook --- pkgs/development/beam-modules/mix-release.nix | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index d8fb15bd89c2..d585a4c5ca30 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -12,6 +12,7 @@ ripgrep, bbe, makeWrapper, + writableTmpDirAsHomeHook, coreutils, gnused, gnugrep, @@ -116,6 +117,7 @@ lib.extendMkDerivation { git makeWrapper ripgrep + writableTmpDirAsHomeHook mixBuildDirHook mixCompileHook @@ -162,14 +164,6 @@ lib.extendMkDerivation { // (attrs.env or { }); postUnpack = '' - # Mix and Hex - export MIX_HOME="$TEMPDIR/mix" - export HEX_HOME="$TEMPDIR/hex" - - # Rebar - export REBAR_GLOBAL_CONFIG_DIR="$TEMPDIR/rebar3" - export REBAR_CACHE_DIR="$TEMPDIR/rebar3.cache" - ${lib.optionalString (mixFodDeps != null) '' # Compilation of the dependencies will require that the dependency path is # writable, thus a copy to the $TEMPDIR is inevitable here. From 556f308bb50bdb7b680db2a132cee8b894dc17fc Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Fri, 28 Aug 2026 13:46:34 -0400 Subject: [PATCH 04/10] beamPackages.mixRelease: extract mixFodDepsSetupHook --- pkgs/development/beam-modules/default.nix | 1 + .../beam-modules/hooks/default.nix | 5 ++++ .../hooks/mix-fod-deps-setup-hook.sh | 29 +++++++++++++++++++ pkgs/development/beam-modules/mix-release.nix | 20 ++----------- 4 files changed, 38 insertions(+), 17 deletions(-) create mode 100755 pkgs/development/beam-modules/hooks/mix-fod-deps-setup-hook.sh diff --git a/pkgs/development/beam-modules/default.nix b/pkgs/development/beam-modules/default.nix index fb0b8b5debad..c4dbcf310d9f 100644 --- a/pkgs/development/beam-modules/default.nix +++ b/pkgs/development/beam-modules/default.nix @@ -86,6 +86,7 @@ makeScopeWithSplicing' { mixBuildDirHook mixCompileHook mixEscriptSetupHook + mixFodDepsSetupHook mixReleaseSetupHook rebar3CompileHook rebarDevendorPatchHook diff --git a/pkgs/development/beam-modules/hooks/default.nix b/pkgs/development/beam-modules/hooks/default.nix index 304134c645fe..42d24aaac61d 100644 --- a/pkgs/development/beam-modules/hooks/default.nix +++ b/pkgs/development/beam-modules/hooks/default.nix @@ -33,6 +33,11 @@ meta.license = lib.licenses.mit; } ./mix-escript-setup-hook.sh; + mixFodDepsSetupHook = makeSetupHook { + name = "mix-fod-deps-setup-hook"; + meta.license = lib.licenses.mit; + } ./mix-fod-deps-setup-hook.sh; + mixReleaseSetupHook = makeSetupHook { name = "mix-release-setup-hook.sh"; meta.license = lib.licenses.mit; diff --git a/pkgs/development/beam-modules/hooks/mix-fod-deps-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-fod-deps-setup-hook.sh new file mode 100755 index 000000000000..2c5235050b58 --- /dev/null +++ b/pkgs/development/beam-modules/hooks/mix-fod-deps-setup-hook.sh @@ -0,0 +1,29 @@ +# shellcheck shell=bash + +mixFodDepsPostUnpack() { + echo "Executing mixFodDepsPostUnpack" + + if [ -n "${mixFodDeps-}" ]; then + # Compilation of the dependencies will require that the dependency path is + # writable, thus a copy to the $TEMPDIR is inevitable here. + export MIX_DEPS_PATH="$TEMPDIR/deps" + cp --no-preserve=mode -R "${mixFodDeps}" "$MIX_DEPS_PATH" + fi + + echo "Finished mixFodDepsPostUnpack" +} + +mixFodDepsPostConfigure() { + echo "Executing mixFodDepsPostConfigure" + + if [ -n "${mixFodDeps-}" ]; then + # Symlink deps to build root. Allows for mixFodDeps Phoenix projects to + # find javascript assets. + ln -s "$MIX_DEPS_PATH" ./deps + fi + + echo "Finished mixFodDepsPostConfigure" +} + +postUnpackHooks+=(mixFodDepsPostUnpack) +postConfigureHooks+=(mixFodDepsPostConfigure) diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index d585a4c5ca30..93bd199bee1c 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -20,6 +20,7 @@ mixBuildDirHook, mixCompileHook, mixEscriptSetupHook, + mixFodDepsSetupHook, mixReleaseSetupHook, }@inputs: @@ -124,7 +125,8 @@ lib.extendMkDerivation { ] ++ lib.optionals (escriptBinName != null) [ mixEscriptSetupHook ] ++ lib.optionals (escriptBinName == null) [ mixReleaseSetupHook ] - ++ (builtins.attrValues mixNixDeps); + ++ (builtins.attrValues mixNixDeps) + ++ lib.optionals (mixFodDeps != null) [ mixFodDepsSetupHook ]; buildInputs = [ bashNonInteractive @@ -163,16 +165,6 @@ lib.extendMkDerivation { } // (attrs.env or { }); - postUnpack = '' - ${lib.optionalString (mixFodDeps != null) '' - # Compilation of the dependencies will require that the dependency path is - # writable, thus a copy to the $TEMPDIR is inevitable here. - export MIX_DEPS_PATH="$TEMPDIR/deps" - cp --no-preserve=mode -R "${mixFodDeps}" "$MIX_DEPS_PATH" - ''} - '' - + (attrs.postUnpack or ""); - configurePhase = attrs.configurePhase or '' runHook preConfigure @@ -198,12 +190,6 @@ lib.extendMkDerivation { '') mixNixDeps} ''} - # Symlink deps to build root. Similar to above, but allows for mixFodDeps - # Phoenix projects to find javascript assets. - ${lib.optionalString (mixFodDeps != null) '' - ln -s "$MIX_DEPS_PATH" ./deps - ''} - runHook postConfigure ''; From 16f22d7599350f442b6e1729b3b71b3650597485 Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Fri, 28 Aug 2026 13:46:34 -0400 Subject: [PATCH 05/10] beamPackages.mixRelease: extract mixNixDepsSetupHook --- pkgs/development/beam-modules/default.nix | 1 + .../beam-modules/hooks/default.nix | 5 +++++ .../hooks/mix-nix-deps-setup-hook.sh | 21 +++++++++++++++++++ pkgs/development/beam-modules/mix-release.nix | 20 +++--------------- 4 files changed, 30 insertions(+), 17 deletions(-) create mode 100755 pkgs/development/beam-modules/hooks/mix-nix-deps-setup-hook.sh diff --git a/pkgs/development/beam-modules/default.nix b/pkgs/development/beam-modules/default.nix index c4dbcf310d9f..8e0db062e3d7 100644 --- a/pkgs/development/beam-modules/default.nix +++ b/pkgs/development/beam-modules/default.nix @@ -87,6 +87,7 @@ makeScopeWithSplicing' { mixCompileHook mixEscriptSetupHook mixFodDepsSetupHook + mixNixDepsSetupHook mixReleaseSetupHook rebar3CompileHook rebarDevendorPatchHook diff --git a/pkgs/development/beam-modules/hooks/default.nix b/pkgs/development/beam-modules/hooks/default.nix index 42d24aaac61d..335a181ebba7 100644 --- a/pkgs/development/beam-modules/hooks/default.nix +++ b/pkgs/development/beam-modules/hooks/default.nix @@ -38,6 +38,11 @@ meta.license = lib.licenses.mit; } ./mix-fod-deps-setup-hook.sh; + mixNixDepsSetupHook = makeSetupHook { + name = "mix-nix-deps-setup-hook"; + meta.license = lib.licenses.mit; + } ./mix-nix-deps-setup-hook.sh; + mixReleaseSetupHook = makeSetupHook { name = "mix-release-setup-hook.sh"; meta.license = lib.licenses.mit; diff --git a/pkgs/development/beam-modules/hooks/mix-nix-deps-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-nix-deps-setup-hook.sh new file mode 100755 index 000000000000..18edca00e514 --- /dev/null +++ b/pkgs/development/beam-modules/hooks/mix-nix-deps-setup-hook.sh @@ -0,0 +1,21 @@ +# shellcheck shell=bash +# +# Symlink dependency sources. This is needed for projects that require +# access to the source of their dependencies. For example, Phoenix +# projects need javascript assets to build asset bundles. + +mixNixDepsPostConfigure() { + echo "Executing mixNixDepsPostConfigure" + + local name + for name in "${!mixNixDeps[@]}"; do + if [ -d "${mixNixDeps[$name]}/src" ]; then + mkdir -p deps + ln -sv "${mixNixDeps[$name]}/src" "deps/$name" + fi + done + + echo "Finished mixNixDepsPostConfigure" +} + +postConfigureHooks+=(mixNixDepsPostConfigure) diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index 93bd199bee1c..1d14209fd469 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -21,6 +21,7 @@ mixCompileHook, mixEscriptSetupHook, mixFodDepsSetupHook, + mixNixDepsSetupHook, mixReleaseSetupHook, }@inputs: @@ -30,7 +31,6 @@ lib.extendMkDerivation { excludeDrvArgNames = [ "compileFlags" "erlangCompilerOptions" - "mixNixDeps" ]; extendDrvArgs = @@ -125,8 +125,8 @@ lib.extendMkDerivation { ] ++ lib.optionals (escriptBinName != null) [ mixEscriptSetupHook ] ++ lib.optionals (escriptBinName == null) [ mixReleaseSetupHook ] - ++ (builtins.attrValues mixNixDeps) - ++ lib.optionals (mixFodDeps != null) [ mixFodDepsSetupHook ]; + ++ lib.optionals (mixFodDeps != null) [ mixFodDepsSetupHook ] + ++ lib.optionals (mixNixDeps != { }) ([ mixNixDepsSetupHook ] ++ (builtins.attrValues mixNixDeps)); buildInputs = [ bashNonInteractive @@ -176,20 +176,6 @@ lib.extendMkDerivation { # Phoenix projects for example will need compile.phoenix. mix deps.compile --no-deps-check --skip-umbrella-children - # Symlink dependency sources. This is needed for projects that require - # access to the source of their dependencies. For example, Phoenix - # projects need javascript assets to build asset bundles. - ${lib.optionalString (mixNixDeps != { }) '' - mkdir -p deps - - ${lib.concatMapAttrsStringSep "\n" (name: dep: '' - dep_path="deps/${name}" - if [ -d "${dep}/src" ]; then - ln -sv ${dep}/src $dep_path - fi - '') mixNixDeps} - ''} - runHook postConfigure ''; From 2ff9ee32fb79afab433db37b9035b2cae805125c Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Mon, 14 Sep 2026 23:07:39 -0400 Subject: [PATCH 06/10] beamPackages.mixRelease: extract mixDepsCompileHook --- pkgs/development/beam-modules/default.nix | 1 + pkgs/development/beam-modules/hooks/default.nix | 5 +++++ .../beam-modules/hooks/mix-deps-compile-hook.sh | 17 +++++++++++++++++ pkgs/development/beam-modules/mix-release.nix | 16 ++-------------- 4 files changed, 25 insertions(+), 14 deletions(-) create mode 100755 pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh diff --git a/pkgs/development/beam-modules/default.nix b/pkgs/development/beam-modules/default.nix index 8e0db062e3d7..686fedb24d6d 100644 --- a/pkgs/development/beam-modules/default.nix +++ b/pkgs/development/beam-modules/default.nix @@ -85,6 +85,7 @@ makeScopeWithSplicing' { mixAppConfigPatchHook mixBuildDirHook mixCompileHook + mixDepsCompileHook mixEscriptSetupHook mixFodDepsSetupHook mixNixDepsSetupHook diff --git a/pkgs/development/beam-modules/hooks/default.nix b/pkgs/development/beam-modules/hooks/default.nix index 335a181ebba7..495b9532cc5a 100644 --- a/pkgs/development/beam-modules/hooks/default.nix +++ b/pkgs/development/beam-modules/hooks/default.nix @@ -28,6 +28,11 @@ meta.license = lib.licenses.mit; } ./mix-compile-hook.sh; + mixDepsCompileHook = makeSetupHook { + name = "mix-deps-compile-hook.sh"; + meta.license = lib.licenses.mit; + } ./mix-deps-compile-hook.sh; + mixEscriptSetupHook = makeSetupHook { name = "mix-escript-setup-hook.sh"; meta.license = lib.licenses.mit; diff --git a/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh b/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh new file mode 100755 index 000000000000..cd6473eb6702 --- /dev/null +++ b/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh @@ -0,0 +1,17 @@ +# shellcheck shell=bash +# +# This is needed for projects that have a specific compile step +# the dependency needs to be compiled in order for the task +# to be available. +# +# Phoenix projects for example will need compile.phoenix. + +mixDepsCompileHook() { + echo "Executing mixDepsCompileHook" + + mix deps.compile --no-deps-check --skip-umbrella-children + + echo "Finished mixDepsCompileHook" +} + +postConfigureHooks+=(mixDepsCompileHook) diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index 1d14209fd469..2d3b21642878 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -19,6 +19,7 @@ gawk, mixBuildDirHook, mixCompileHook, + mixDepsCompileHook, mixEscriptSetupHook, mixFodDepsSetupHook, mixNixDepsSetupHook, @@ -122,6 +123,7 @@ lib.extendMkDerivation { mixBuildDirHook mixCompileHook + mixDepsCompileHook ] ++ lib.optionals (escriptBinName != null) [ mixEscriptSetupHook ] ++ lib.optionals (escriptBinName == null) [ mixReleaseSetupHook ] @@ -165,20 +167,6 @@ lib.extendMkDerivation { } // (attrs.env or { }); - configurePhase = - attrs.configurePhase or '' - runHook preConfigure - - # This is needed for projects that have a specific compile step - # the dependency needs to be compiled in order for the task - # to be available. - # - # Phoenix projects for example will need compile.phoenix. - mix deps.compile --no-deps-check --skip-umbrella-children - - runHook postConfigure - ''; - postFixup = '' echo "removing files for Microsoft Windows" rm -f "$out"/bin/*.bat From e79e45b0ced625d396cf29e49d3631ad66ecb02c Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Tue, 15 Sep 2026 00:06:06 -0400 Subject: [PATCH 07/10] beamPackages.mixRelease: move fixup to mixReleaseSetupHook Assisted-By: OpenAI Codex GPT-6 Astra --- .../hooks/mix-release-setup-hook.sh | 72 +++++++++++++++++++ pkgs/development/beam-modules/mix-release.nix | 64 ++--------------- 2 files changed, 79 insertions(+), 57 deletions(-) diff --git a/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh index b073f63cbcc1..798d46a36b75 100644 --- a/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh +++ b/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh @@ -12,6 +12,78 @@ mixReleaseInstallHook() { echo "Finished mixReleaseInstallHook" } +mixReleaseFixupHook() { + echo "Executing mixReleaseFixupHook" + + echo "Removing files for Microsoft Windows" + rm -f "$out"/bin/*.bat + + echo "Wrapping programs in $out/bin with their runtime deps" + find "$out/bin/" -type f -executable | while read f; do + wrapProgram "$f" --prefix PATH : "$mixReleaseRuntimePath" + done + + # shellcheck disable=SC2144 # this will only work for a single erts + if [ -e "$out"/erts-* ]; then + mixReleaseRemoveErlangReferences + fi + + echo "Finished mixReleaseFixupHook" +} + +mixReleaseRemoveErlangReferences() { + # ERTS is included in the release, then erlang is not required as a runtime dependency. + # But, erlang is still referenced in some places. To removed references to erlang, + # following steps are required. + + echo "Removing references to erlang" + + # 1. remove references to erlang from plain text files + for file in $(rg "${erlang}/lib/erlang" "$out" --files-with-matches); do + substituteInPlace "$file" --replace "${erlang}/lib/erlang" "$out" + done + + # 2. remove references to erlang from .beam files + # + # No need to do anything, because it has been handled by "deterministic" option specified + # by ERL_COMPILER_OPTIONS. + + # 3. remove references to erlang from normal binary files + for file in $(rg "${erlang}/lib/erlang" "$out" --files-with-matches --binary --iglob '!*.beam'); do + echo "removing references to erlang in $file" + # use bbe to substitute strings in binary files, because using substituteInPlace + # on binaries will raise errors + bbe -e "s|${erlang}/lib/erlang|$out|" -o "$file".tmp "$file" + rm -f "$file" + mv "$file".tmp "$file" + done + + # References to erlang should be removed from output after above processing. +} + +mixReleaseRemoveCookieHook() { + if [ -e "$out/releases/COOKIE" ]; then + echo "Removing $out/releases/COOKIE" + rm "$out/releases/COOKIE" + fi +} + +mixReleaseStripDebugHook() { + # Strip debug symbols to avoid hardreferences to "foreign" closures actually + # not needed at runtime, while at the same time reduce size of BEAM files. + erl -noinput -eval 'lists:foreach(fun(F) -> io:format("Stripping ~p.~n", [F]), beam_lib:strip(F) end, filelib:wildcard("'"$out"'/**/*.beam"))' -s init stop +} + +preFixupHooks+=(mixReleaseFixupHook) + +if [ -n "${removeCookie-1}" ]; then + preFixupHooks+=(mixReleaseRemoveCookieHook) +fi + +if [ -n "${stripDebug-}" ]; then + postFixupHooks+=(mixReleaseStripDebugHook) +fi + if [ -z "${dontMixReleaseInstall-}" ] && [ -z "${installPhase-}" ]; then installPhase=mixReleaseInstallHook fi diff --git a/pkgs/development/beam-modules/mix-release.nix b/pkgs/development/beam-modules/mix-release.nix index 2d3b21642878..dd04c592d30b 100644 --- a/pkgs/development/beam-modules/mix-release.nix +++ b/pkgs/development/beam-modules/mix-release.nix @@ -167,63 +167,13 @@ lib.extendMkDerivation { } // (attrs.env or { }); - postFixup = '' - echo "removing files for Microsoft Windows" - rm -f "$out"/bin/*.bat + inherit erlang; - echo "wrapping programs in $out/bin with their runtime deps" - for f in $(find $out/bin/ -type f -executable); do - wrapProgram "$f" \ - --prefix PATH : ${ - lib.makeBinPath [ - coreutils - gnused - gnugrep - gawk - ] - } - done - '' - + lib.optionalString removeCookie '' - if [ -e $out/releases/COOKIE ]; then - echo "removing $out/releases/COOKIE" - rm $out/releases/COOKIE - fi - '' - + '' - if [ -e $out/erts-* ]; then - # ERTS is included in the release, then erlang is not required as a runtime dependency. - # But, erlang is still referenced in some places. To removed references to erlang, - # following steps are required. - - # 1. remove references to erlang from plain text files - for file in $(rg "${erlang}/lib/erlang" "$out" --files-with-matches); do - echo "removing references to erlang in $file" - substituteInPlace "$file" --replace "${erlang}/lib/erlang" "$out" - done - - # 2. remove references to erlang from .beam files - # - # No need to do anything, because it has been handled by "deterministic" option specified - # by ERL_COMPILER_OPTIONS. - - # 3. remove references to erlang from normal binary files - for file in $(rg "${erlang}/lib/erlang" "$out" --files-with-matches --binary --iglob '!*.beam'); do - echo "removing references to erlang in $file" - # use bbe to substitute strings in binary files, because using substituteInPlace - # on binaries will raise errors - bbe -e "s|${erlang}/lib/erlang|$out|" -o "$file".tmp "$file" - rm -f "$file" - mv "$file".tmp "$file" - done - - # References to erlang should be removed from output after above processing. - fi - '' - + lib.optionalString stripDebug '' - # Strip debug symbols to avoid hardreferences to "foreign" closures actually - # not needed at runtime, while at the same time reduce size of BEAM files. - erl -noinput -eval 'lists:foreach(fun(F) -> io:format("Stripping ~p.~n", [F]), beam_lib:strip(F) end, filelib:wildcard("'"$out"'/**/*.beam"))' -s init stop - ''; + mixReleaseRuntimePath = lib.makeBinPath [ + coreutils + gnused + gnugrep + gawk + ]; }; } From eb7233903a88c2000a340682ab879e948d300634 Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Tue, 15 Sep 2026 00:49:35 -0400 Subject: [PATCH 08/10] beamPackages.mixBuildDirHook: skip empty library paths and unmatched globs --- pkgs/development/beam-modules/hooks/mix-build-dir-hook.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/development/beam-modules/hooks/mix-build-dir-hook.sh b/pkgs/development/beam-modules/hooks/mix-build-dir-hook.sh index c353aaeabc4d..46af5755640e 100755 --- a/pkgs/development/beam-modules/hooks/mix-build-dir-hook.sh +++ b/pkgs/development/beam-modules/hooks/mix-build-dir-hook.sh @@ -5,9 +5,13 @@ mixBuildDirHook() { echo "Executing mixBuildDirHook" + local lib dir dest build_dir + mkdir -p _build/"$MIX_BUILD_PREFIX"/lib - while read -r -d ':' lib; do + while IFS= read -r -d ':' lib; do + [ -n "$lib" ] || continue for dir in "$lib"/*; do + [ -d "$dir" ] || continue # Strip version number for directory name if it exists, so naming of # all libs matches what mix's expectation. dest=$(basename "$dir" | cut -d '-' -f1) From 5cfa15f65b3e171e9572a7fef54cd70410fb6fa5 Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Tue, 15 Sep 2026 00:53:53 -0400 Subject: [PATCH 09/10] beam hooks: add targeted auxiliary hook opt-outs Assisted-By: OpenAI Codex GPT-6 Astra --- pkgs/development/beam-modules/hooks/beam-copy-source-hook.sh | 4 +++- .../beam-modules/hooks/mix-app-config-patch-hook.sh | 4 +++- pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh | 4 +++- pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh | 4 +++- pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh | 4 +++- .../beam-modules/hooks/rebar-devendor-patch-hook.sh | 4 +++- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/pkgs/development/beam-modules/hooks/beam-copy-source-hook.sh b/pkgs/development/beam-modules/hooks/beam-copy-source-hook.sh index a4ffa9fd1413..bdc5056f553c 100755 --- a/pkgs/development/beam-modules/hooks/beam-copy-source-hook.sh +++ b/pkgs/development/beam-modules/hooks/beam-copy-source-hook.sh @@ -13,4 +13,6 @@ beamCopySourceHook() { echo "Finished beamCopySourceHook" } -postPatchHooks+=(beamCopySourceHook) +if [ -z "${dontBeamCopySource-}" ]; then + postPatchHooks+=(beamCopySourceHook) +fi diff --git a/pkgs/development/beam-modules/hooks/mix-app-config-patch-hook.sh b/pkgs/development/beam-modules/hooks/mix-app-config-patch-hook.sh index 1dd80c5e3e76..0537736c5a9e 100644 --- a/pkgs/development/beam-modules/hooks/mix-app-config-patch-hook.sh +++ b/pkgs/development/beam-modules/hooks/mix-app-config-patch-hook.sh @@ -16,4 +16,6 @@ mixAppConfigPatchHook() { echo "Finished mixAppConfigPatchHook" } -prePatchHooks+=(mixAppConfigPatchHook) +if [ -z "${dontMixAppConfigPatch-}" ]; then + prePatchHooks+=(mixAppConfigPatchHook) +fi diff --git a/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh b/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh index cd6473eb6702..aec8a9e39127 100755 --- a/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh +++ b/pkgs/development/beam-modules/hooks/mix-deps-compile-hook.sh @@ -14,4 +14,6 @@ mixDepsCompileHook() { echo "Finished mixDepsCompileHook" } -postConfigureHooks+=(mixDepsCompileHook) +if [ -z "${dontMixDepsCompile-}" ]; then + postConfigureHooks+=(mixDepsCompileHook) +fi diff --git a/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh index 87f93718ec97..f83f483ae93b 100644 --- a/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh +++ b/pkgs/development/beam-modules/hooks/mix-escript-setup-hook.sh @@ -21,7 +21,9 @@ mixEscriptInstall() { echo "Finished mixEscriptInstall" } -postBuildHooks+=(mixEscriptBuild) +if [ -z "${dontMixEscriptBuild-}" ]; then + postBuildHooks+=(mixEscriptBuild) +fi if [ -z "${dontMixEscriptInstall-}" ] && [ -z "${installPhase-}" ]; then installPhase=mixEscriptInstall diff --git a/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh b/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh index 798d46a36b75..81bd142fcc70 100644 --- a/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh +++ b/pkgs/development/beam-modules/hooks/mix-release-setup-hook.sh @@ -74,7 +74,9 @@ mixReleaseStripDebugHook() { erl -noinput -eval 'lists:foreach(fun(F) -> io:format("Stripping ~p.~n", [F]), beam_lib:strip(F) end, filelib:wildcard("'"$out"'/**/*.beam"))' -s init stop } -preFixupHooks+=(mixReleaseFixupHook) +if [ -z "${dontMixReleaseFixup-}" ]; then + preFixupHooks+=(mixReleaseFixupHook) +fi if [ -n "${removeCookie-1}" ]; then preFixupHooks+=(mixReleaseRemoveCookieHook) diff --git a/pkgs/development/beam-modules/hooks/rebar-devendor-patch-hook.sh b/pkgs/development/beam-modules/hooks/rebar-devendor-patch-hook.sh index 032bf9b986fe..e0d1a45cfb84 100644 --- a/pkgs/development/beam-modules/hooks/rebar-devendor-patch-hook.sh +++ b/pkgs/development/beam-modules/hooks/rebar-devendor-patch-hook.sh @@ -10,4 +10,6 @@ rebarDevendorPatchHook() { echo "Finished rebarDevendorPatchHook" } -prePatchHooks+=(rebarDevendorPatchHook) +if [ -z "${dontRebarDevendorPatch-}" ]; then + prePatchHooks+=(rebarDevendorPatchHook) +fi From 6dd5adf4e7153735be369a6aedf8a4785d499e71 Mon Sep 17 00:00:00 2001 From: "Adam C. Stephens" Date: Tue, 22 Sep 2026 09:16:09 -0400 Subject: [PATCH 10/10] mobilizon: drop unnecessary cmake dependency fast_html already defines this in override. mix hook changes allowed cmake hook changes to run, which fail because it's unneeded. --- pkgs/by-name/mo/mobilizon/package.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/pkgs/by-name/mo/mobilizon/package.nix b/pkgs/by-name/mo/mobilizon/package.nix index 83c82c4bc4db..5df63c96cbc9 100644 --- a/pkgs/by-name/mo/mobilizon/package.nix +++ b/pkgs/by-name/mo/mobilizon/package.nix @@ -28,7 +28,6 @@ beamPackages.mixRelease rec { nativeBuildInputs = [ git - cmake ]; mixNixDeps = import ./mix.nix {