Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 54 additions & 50 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,15 @@
};

packages = {
inherit (pkgs) primer-benchmark;
inherit (pkgs)
primer-benchmark
primer-miso-build-frontend
primer-miso-dist
primer-miso-frontend-tools
primer-miso-node-modules
wasm32-test-runner
wasm32-unknown-wasi-cabal
;
}
// (pkgs.lib.optionalAttrs (system == "x86_64-linux") {
inherit (pkgs) primer-benchmark-results-json;
Expand Down Expand Up @@ -247,7 +255,7 @@
};
in
(pkgs.lib.mapAttrs (name: pkg: mkApp pkg name) {
inherit (pkgs) primer-benchmark;
inherit (pkgs) primer-benchmark primer-miso-build-frontend;
})
// primerFlake.apps;

Expand Down Expand Up @@ -333,6 +341,22 @@
hlint = "latest";
};

cabalTool = final.haskell-nix.tool ghcVersion "cabal" "latest";

primer-miso-node-modules = final.callPackage ./nix/pkgs/primer-miso-node-modules {
inherit (inputs) ws;
};

wasm32-unknown-wasi-cabal = final.callPackage ./nix/pkgs/wasm32-unknown-wasi-cabal {
inherit cabalTool;
};

wasm32-test-runner = final.callPackage ./nix/pkgs/wasm32-test-runner { };

primer-miso-frontend-tools = final.callPackage ./nix/pkgs/primer-miso-frontend-tools {
inherit wasm32-unknown-wasi-cabal;
};

primer = final.haskell-nix.cabalProject {
compiler-nix-name = ghcVersion;
src = ./.;
Expand Down Expand Up @@ -461,70 +485,41 @@
buildInputs = (with final; [
nixpkgs-fmt

# For Language Server support.
nodejs_22

# Normally available via `shell.tools`, but
# currently part of our overlay, instead.
hlint
fourmolu

simple-http-server
binaryen
wasm-tools
brotli
coreutils
wizer
]);

nativeBuildInputs = [
(
let
wasm-dummy-liblibdl = final.runCommand "liblibdl"
{
nativeBuildInputs = [ final.pkgsCross.wasi32.buildPackages.llvmPackages.clang ];
}
''
mkdir -p $out/lib
echo 'void __liblibdl_stub(void) {}' | wasm32-unknown-wasi-cc -shared -x c - -o $out/lib/liblibdl.so 2>/dev/null
'';
forced-wasm-ghc-pkg = final.writeShellScriptBin "ghc-pkg" ''
exec wasm32-unknown-wasi-ghc-pkg "$@"
'';
in
final.writeShellScriptBin "wasm32-unknown-wasi-cabal" ''
PATH="${forced-wasm-ghc-pkg}/bin:$PATH" \
LD_LIBRARY_PATH="${wasm-dummy-liblibdl}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
NIX_LDFLAGS=$(echo "$NIX_LDFLAGS" | tr ' ' '\n' | grep -v 'libffi-[0-9]' | tr '\n' ' ') \
NIX_LDFLAGS_FOR_TARGET=$(echo "$NIX_LDFLAGS_FOR_TARGET" | tr ' ' '\n' | grep -v 'libffi-[0-9]' | tr '\n' ' ') \
exec cabal \
--with-ghc=wasm32-unknown-wasi-ghc \
--with-compiler=wasm32-unknown-wasi-ghc \
--with-ghc-pkg=wasm32-unknown-wasi-ghc-pkg \
--with-hsc2hs=wasm32-unknown-wasi-hsc2hs \
$(builtin type -P "wasm32-unknown-wasi-pkg-config" &> /dev/null && echo "--with-pkg-config=wasm32-unknown-wasi-pkg-config") \
"$@"
''
)

(final.writeShellScriptBin "wasm32-test-runner" ''
${final.lib.getExe final.pkgsBuildBuild.wasmtime} --dir test::test "$@"
'')
wasm32-test-runner
primer-miso-frontend-tools
];

shellHook =
let
node_modules = final.linkFarm "node_modules" [{ name = "ws"; path = inputs.ws; }];
in
''
export BROWSER_WASI_SHIM="${inputs.browser-wasi-shim}"
export NODE_PATH="${node_modules}''${NODE_PATH:+:$NODE_PATH}"
'';
shellHook = ''
export BROWSER_WASI_SHIM="${inputs.browser-wasi-shim}"
export NODE_PATH="${primer-miso-node-modules}''${NODE_PATH:+:$NODE_PATH}"
'';
};
};

primerFlake = primer.flake { };

primer-miso-build-frontend = final.callPackage ./nix/pkgs/primer-miso-build-frontend {
browser-wasi-shim = inputs.browser-wasi-shim;
inherit primer-miso-frontend-tools primer-miso-node-modules;
wasmGhc = primer.projectCross.wasi32.pkg-set.config.ghc.package;
};

primer-miso-dist = final.callPackage ./nix/pkgs/primer-miso-dist {
browser-wasi-shim = inputs.browser-wasi-shim;
inherit version;
inherit primer-miso-build-frontend;
primer-miso-wasm = primerFlake.packages."wasm32-unknown-wasi:primer-miso:exe:primer-miso";
};

# Note: these benchmarks should only be run (in CI) on a
# "benchmark" machine. This is enforced for our CI system
# via Nix's `requiredSystemFeatures`.
Expand Down Expand Up @@ -563,6 +558,15 @@

primer-benchmark = primerFlake.packages."primer-benchmark:bench:primer-benchmark";

inherit
primer-miso-build-frontend
primer-miso-dist
primer-miso-frontend-tools
primer-miso-node-modules
wasm32-test-runner
wasm32-unknown-wasi-cabal
;

inherit (benchmarks) primer-benchmark-results-json;
inherit (benchmarks) primer-criterion-results-github-action-benchmark;
inherit (benchmarks) primer-benchmark-results-github-action-benchmark;
Expand Down
40 changes: 40 additions & 0 deletions nix/pkgs/primer-miso-build-frontend/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{ bash
, browser-wasi-shim
, lib
, makeWrapper
, primer-miso-frontend-tools
, primer-miso-node-modules
, stdenvNoCC
, wasmGhc
, buildFrontendScript ? ../../primer-miso-build-frontend
}:

stdenvNoCC.mkDerivation {
pname = "primer-miso-build-frontend";
version = "1.0";

src = buildFrontendScript;

nativeBuildInputs = [
makeWrapper
];

dontUnpack = true;

installPhase = ''
runHook preInstall

install -Dm755 $src $out/bin/primer-miso-build-frontend
wrapProgram $out/bin/primer-miso-build-frontend \
--prefix PATH : ${lib.makeBinPath [
bash
primer-miso-frontend-tools
wasmGhc
]} \
--set BROWSER_WASI_SHIM ${browser-wasi-shim} \
--set BUILD_FRONTEND_NAME primer-miso-build-frontend \
--prefix NODE_PATH : ${primer-miso-node-modules}

runHook postInstall
'';
}
39 changes: 39 additions & 0 deletions nix/pkgs/primer-miso-dist/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{ browser-wasi-shim
, primer-miso-build-frontend
, primer-miso-wasm
, stdenvNoCC
, version
, frontendSrc ? ../../../primer-miso/frontend
}:

stdenvNoCC.mkDerivation {
pname = "primer-miso-dist";
inherit version;

nativeBuildInputs = [
primer-miso-build-frontend
];

dontUnpack = true;

buildPhase = ''
runHook preBuild

export HOME=$(mktemp -d)
export XDG_CACHE_HOME="$HOME/.cache"

primer-miso-build-frontend \
--prod \
--out-dir "$out" \
--frontend-dir ${frontendSrc} \
--browser-wasi-shim ${browser-wasi-shim} \
--wasm ${primer-miso-wasm}/bin/primer-miso.wasm

runHook postBuild
'';

installPhase = ''
runHook preInstall
runHook postInstall
'';
}
24 changes: 24 additions & 0 deletions nix/pkgs/primer-miso-frontend-tools/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{ binaryen
, brotli
, buildEnv
, coreutils
, gnugrep
, nodejs_22
, wasm-tools
, wasm32-unknown-wasi-cabal
, wizer
}:

buildEnv {
name = "primer-miso-frontend-tools";
paths = [
binaryen
brotli
coreutils
gnugrep
nodejs_22
wasm-tools
wasm32-unknown-wasi-cabal
wizer
];
}
5 changes: 5 additions & 0 deletions nix/pkgs/primer-miso-node-modules/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{ linkFarm
, ws
}:

linkFarm "node_modules" [{ name = "ws"; path = ws; }]
8 changes: 8 additions & 0 deletions nix/pkgs/wasm32-test-runner/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{ lib
, pkgsBuildBuild
, writeShellScriptBin
}:

writeShellScriptBin "wasm32-test-runner" ''
exec ${lib.getExe pkgsBuildBuild.wasmtime} --dir test::test "$@"
''
34 changes: 34 additions & 0 deletions nix/pkgs/wasm32-unknown-wasi-cabal/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{ coreutils
, gnugrep
, pkgsCross
, runCommand
, writeShellScriptBin
, cabalTool
}:
let
wasm-dummy-liblibdl = runCommand "liblibdl"
{
nativeBuildInputs = [ pkgsCross.wasi32.buildPackages.llvmPackages.clang ];
}
''
mkdir -p $out/lib
echo 'void __liblibdl_stub(void) {}' | wasm32-unknown-wasi-cc -shared -x c - -o $out/lib/liblibdl.so 2>/dev/null
'';

forced-wasm-ghc-pkg = writeShellScriptBin "ghc-pkg" ''
exec wasm32-unknown-wasi-ghc-pkg "$@"
'';
in
writeShellScriptBin "wasm32-unknown-wasi-cabal" ''
PATH="${forced-wasm-ghc-pkg}/bin:$PATH" \
LD_LIBRARY_PATH="${wasm-dummy-liblibdl}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
NIX_LDFLAGS=$(echo "''${NIX_LDFLAGS:-}" | ${coreutils}/bin/tr ' ' '\n' | ${gnugrep}/bin/grep -v 'libffi-[0-9]' | ${coreutils}/bin/tr '\n' ' ') \
NIX_LDFLAGS_FOR_TARGET=$(echo "''${NIX_LDFLAGS_FOR_TARGET:-}" | ${coreutils}/bin/tr ' ' '\n' | ${gnugrep}/bin/grep -v 'libffi-[0-9]' | ${coreutils}/bin/tr '\n' ' ') \
exec ${cabalTool}/bin/cabal \
--with-ghc=wasm32-unknown-wasi-ghc \
--with-compiler=wasm32-unknown-wasi-ghc \
--with-ghc-pkg=wasm32-unknown-wasi-ghc-pkg \
--with-hsc2hs=wasm32-unknown-wasi-hsc2hs \
$(builtin type -P "wasm32-unknown-wasi-pkg-config" &> /dev/null && echo "--with-pkg-config=wasm32-unknown-wasi-pkg-config") \
"$@"
''
Loading
Loading