tools for building gleam projects with nix

buildGleamApplication: add support for building apps targeting javascript

foxgirl.engineering 2063ac2d 6621ab83

verified
+32 -11
+2 -1
CHANGELOG.md
··· 12 13 ### added 14 15 - - `target` argument in `buildGleam` can be used to specify either erlang or javascript targets 16 - add `override` function to derivations produced by `buildGleam` and `buildGleamApplication` 17 18 ## v1.0.0 - 2025-09-25
··· 12 13 ### added 14 15 + - javascript target support 16 + - `target` argument in `buildGleam` and `buildGleamApplication` can be used to specify either erlang or javascript targets 17 - add `override` function to derivations produced by `buildGleam` and `buildGleamApplication` 18 19 ## v1.0.0 - 2025-09-25
+30 -10
nix/build-gleam-application.nix
··· 28 erlang ? inputs.erlang, 29 gleam ? inputs.gleam, 30 31 buildGleamArgs ? { }, 32 gleamNixOverrides ? _: _: { }, 33 ... ··· 49 }; 50 51 withApplication = scope.overrideScope ( 52 - _: prev: { 53 ${pname} = buildGleam ( 54 buildGleamArgs 55 // { 56 name = pname; 57 inherit version src; 58 beamDeps = derivationList prev; 59 - inherit erlang gleam; 60 } 61 ); 62 } ··· 73 ) args; 74 in 75 76 stdenv.mkDerivation ( 77 filteredArgs 78 // { ··· 88 89 buildPhase = '' 90 runHook preBuild 91 - gleam-tool entrypoint ${pname} 92 runHook postBuild 93 ''; 94 95 installPhase = '' 96 runHook preInstall 97 98 - mkdir -p $out/{bin,lib/entrypoint/ebin} 99 - ${lib.concatMapStringsSep "\n" ( 100 - package: "ln -s ${package}/lib/erlang/lib/* $out/lib/" 101 - ) compiledPackages} 102 103 - mv gleam_entrypoint.beam $out/lib/entrypoint/ebin 104 105 - makeWrapper ${erlang}/bin/erl $out/bin/${pname} --add-flags \ 106 - "-pa $out/lib/*/ebin -eval \"gleam_entrypoint:run()\" -noshell -extra" 107 108 runHook postInstall 109 '';
··· 28 erlang ? inputs.erlang, 29 gleam ? inputs.gleam, 30 31 + target ? "erlang", 32 buildGleamArgs ? { }, 33 gleamNixOverrides ? _: _: { }, 34 ... ··· 50 }; 51 52 withApplication = scope.overrideScope ( 53 + _: prev: 54 + (lib.mapAttrs (_: dep: dep.override { inherit target; }) prev) 55 + // { 56 ${pname} = buildGleam ( 57 buildGleamArgs 58 // { 59 name = pname; 60 inherit version src; 61 beamDeps = derivationList prev; 62 + inherit erlang gleam target; 63 } 64 ); 65 } ··· 76 ) args; 77 in 78 79 + assert lib.assertOneOf "target" target [ 80 + "erlang" 81 + "javascript" 82 + ]; 83 + 84 stdenv.mkDerivation ( 85 filteredArgs 86 // { ··· 96 97 buildPhase = '' 98 runHook preBuild 99 + gleam-tool entrypoint ${target} 100 runHook postBuild 101 ''; 102 103 installPhase = '' 104 runHook preInstall 105 106 + ${ 107 + if target == "erlang" then 108 + '' 109 + mkdir -p $out/{bin,lib/entrypoint/ebin} 110 + ${lib.concatMapStringsSep "\n" ( 111 + package: "ln -s ${package}/lib/erlang/lib/* $out/lib/" 112 + ) compiledPackages} 113 114 + mv gleam_entrypoint.beam $out/lib/entrypoint/ebin 115 116 + makeWrapper ${erlang}/bin/erl $out/bin/${pname} --add-flags \ 117 + "-pa $out/lib/*/ebin -eval \"gleam_entrypoint:run()\" -noshell -extra" 118 + '' 119 + else 120 + '' 121 + mkdir -p $out/lib 122 + ${lib.concatMapStringsSep "\n" (package: "ln -s ${package}/* $out/lib/") compiledPackages} 123 + 124 + mv gleam_entrypoint.mjs $out/lib/ 125 + '' 126 + } 127 128 runHook postInstall 129 '';