From 5ea156c181c29c1b93b6724bd932f1936d05d59a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20R=C3=B6ger?= Date: Sun, 6 Sep 2026 16:39:29 +0200 Subject: [PATCH] build(flake): split into flake modules --- flake.nix | 45 +++++------------- nix/root-crate.nix | 23 --------- nix/utils.nix | 21 +++++++++ nix/wasm-bindgen.nix | 40 +++++++++------- nix/with-toolchain.nix | 16 ------- nix/wordle-solver-wasm-pkg.nix | 85 +++++++++++++++++++--------------- nix/wordle-solver-wasm.nix | 70 +++++++++++++++------------- nix/wordle-solver-web.nix | 78 ++++++++++++++++++------------- nix/wordle-solver.nix | 27 +++++++++++ 9 files changed, 216 insertions(+), 189 deletions(-) delete mode 100644 nix/root-crate.nix create mode 100644 nix/utils.nix delete mode 100644 nix/with-toolchain.nix create mode 100644 nix/wordle-solver.nix diff --git a/flake.nix b/flake.nix index 5bc146a..dab1e2f 100644 --- a/flake.nix +++ b/flake.nix @@ -16,7 +16,6 @@ outputs = inputs @ { flake-parts, - crate2nix, rust-overlay, ... }: @@ -28,33 +27,22 @@ "x86_64-linux" ]; + imports = [ + ./nix/wasm-bindgen.nix + ./nix/wordle-solver.nix + ./nix/wordle-solver-wasm.nix + ./nix/wordle-solver-wasm-pkg.nix + ./nix/wordle-solver-web.nix + ]; + perSystem = { pkgs, system, self', ... }: let - # Use rust-bin to generate the toolchain from rust-toolchain.toml - rust-toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; - - cross-pkgs = pkgs.pkgsCross.wasm32-unknown-none; - - toolchain = pkgs.callPackage ./nix/with-toolchain.nix { - cargo = rust-toolchain; - rustc = rust-toolchain; - }; - crossToolchain = cross-pkgs.callPackage ./nix/with-toolchain.nix { - cargo = rust-toolchain; - rustc = rust-toolchain; - }; - - wasm-bindgen = toolchain.pkgs.callPackage ./nix/wasm-bindgen.nix {}; - - root-crate = pkgs.callPackage ./nix/root-crate.nix { - cargo = rust-toolchain; - rustc = rust-toolchain; - inherit crate2nix; - }; + utils = import ./nix/utils.nix; + rust-toolchain = utils.rust-toolchain pkgs; in { # Overlay pkgs with rust-bin _module.args.pkgs = import inputs.nixpkgs { @@ -63,22 +51,13 @@ config.allowUnsupportedSystem = true; }; - packages = { - wordle-solver-web = pkgs.callPackage ./nix/wordle-solver-web.nix {inherit (self'.packages) wordle-solver-wasm-pkg;}; - wordle-solver-wasm = crossToolchain.pkgs.callPackage ./nix/wordle-solver-wasm.nix {}; - wordle-solver-wasm-pkg = pkgs.callPackage ./nix/wordle-solver-wasm-pkg.nix { - inherit wasm-bindgen root-crate; - inherit (self'.packages) wordle-solver-wasm; - }; - wordle-solver = root-crate.build; - default = self'.packages.wordle-solver; - }; + packages.default = self'.packages.wordle-solver; devShells.default = pkgs.mkShell { RA_LOG = "rust_analyzer=info"; buildInputs = [ rust-toolchain - wasm-bindgen + self'.packages.wasm-bindgen pkgs.nodejs pkgs.svelte-language-server pkgs.typescript-language-server diff --git a/nix/root-crate.nix b/nix/root-crate.nix deleted file mode 100644 index 6ee3869..0000000 --- a/nix/root-crate.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - crate2nix, - rustc, - cargo, - pkgs, - ... -}: let - buildRustCrateForPkgs = _: - pkgs.buildRustCrate.override { - inherit cargo rustc; - }; - - # Cargo.nix for IFD - generatedCargoNix = crate2nix.tools.${pkgs.hostPlatform.system}.generatedCargoNix { - name = "rustnix"; - src = ../.; - }; - - cargoNix = import generatedCargoNix { - inherit pkgs buildRustCrateForPkgs; - }; -in - cargoNix.rootCrate diff --git a/nix/utils.nix b/nix/utils.nix new file mode 100644 index 0000000..f873d32 --- /dev/null +++ b/nix/utils.nix @@ -0,0 +1,21 @@ +rec { + rust-toolchain = pkgs: pkgs.rust-bin.fromRustupToolchainFile ../rust-toolchain.toml; + + toolchain-pkgs = pkgs: + pkgs.extend (_: _: { + rustPlatform = pkgs.makeRustPlatform { + cargo = rust-toolchain pkgs; + rustc = rust-toolchain pkgs; + }; + }); + + toolchain-crosspkgs = pkgs: let + crossPkgs = pkgs.pkgsCross.wasm32-unknown-none; + in + crossPkgs.extend (_: _: { + rustPlatform = crossPkgs.makeRustPlatform { + cargo = rust-toolchain pkgs; + rustc = rust-toolchain pkgs; + }; + }); +} diff --git a/nix/wasm-bindgen.nix b/nix/wasm-bindgen.nix index 7f2a20b..fa291b2 100644 --- a/nix/wasm-bindgen.nix +++ b/nix/wasm-bindgen.nix @@ -1,19 +1,27 @@ -{ - fetchCrate, - buildWasmBindgenCli, - rustPlatform, - ... -}: -buildWasmBindgenCli rec { - src = fetchCrate { - pname = "wasm-bindgen-cli"; - version = "0.2.127"; - hash = "sha256-di+qBAdd7pENLiIB9CoZoab+W5xeDoByMREcCGTSzWo="; - }; +let + drv = { + fetchCrate, + buildWasmBindgenCli, + rustPlatform, + ... + }: + buildWasmBindgenCli rec { + src = fetchCrate { + pname = "wasm-bindgen-cli"; + version = "0.2.127"; + hash = "sha256-di+qBAdd7pENLiIB9CoZoab+W5xeDoByMREcCGTSzWo="; + }; - cargoDeps = rustPlatform.fetchCargoVendor { - inherit src; - inherit (src) pname version; - hash = "sha256-FTv2GZIAQs0ePdIZXIXil7JbZ6kIT05VG6vqC1qNFxQ="; + cargoDeps = rustPlatform.fetchCargoVendor { + inherit src; + inherit (src) pname version; + hash = "sha256-FTv2GZIAQs0ePdIZXIXil7JbZ6kIT05VG6vqC1qNFxQ="; + }; + }; + + utils = import ./utils.nix; +in { + perSystem = {pkgs, ...}: { + packages.wasm-bindgen = (utils.toolchain-pkgs pkgs).callPackage drv {}; }; } diff --git a/nix/with-toolchain.nix b/nix/with-toolchain.nix deleted file mode 100644 index 0879d82..0000000 --- a/nix/with-toolchain.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - makeRustPlatform, - cargo, - rustc, - pkgs, - ... -}: let - p = pkgs; -in rec { - rustPlatform = makeRustPlatform { - inherit cargo rustc; - }; - pkgs = p.extend (_: _: { - inherit rustPlatform; - }); -} diff --git a/nix/wordle-solver-wasm-pkg.nix b/nix/wordle-solver-wasm-pkg.nix index 2602a90..e7f2da9 100644 --- a/nix/wordle-solver-wasm-pkg.nix +++ b/nix/wordle-solver-wasm-pkg.nix @@ -1,39 +1,50 @@ { - stdenvNoCC, - wasm-bindgen, - wordle-solver-wasm, - root-crate, - ... -}: let - snake_name = "wordle_solver"; - package-meta = { - name = "wordle-solver"; - type = "module"; - description = "module"; - version = root-crate.build.crateVersion; - files = [ - "${snake_name}_bg.wasm" - "${snake_name}.js" - "${snake_name}_bg.js" - "${snake_name}.d.ts" - ]; - main = "${snake_name}.js"; - types = "${snake_name}.d.ts"; - sideEffects = [ - "./${snake_name}.js" - "./snippets/*" - ]; + perSystem = { + pkgs, + self', + ... + }: let + drv = { + stdenvNoCC, + wasm-bindgen, + wordle-solver-wasm, + ... + }: let + snake_name = "wordle_solver"; + package-meta = { + name = "wordle-solver"; + type = "module"; + description = "module"; + version = "0.1.0"; + files = [ + "${snake_name}_bg.wasm" + "${snake_name}.js" + "${snake_name}_bg.js" + "${snake_name}.d.ts" + ]; + main = "${snake_name}.js"; + types = "${snake_name}.d.ts"; + sideEffects = [ + "./${snake_name}.js" + "./snippets/*" + ]; + }; + package-json = builtins.toJSON package-meta; + in + stdenvNoCC.mkDerivation { + name = "wordle-solver-wasm-pkg"; + nativeBuildInputs = [wasm-bindgen]; + unpackPhase = "true"; + buildPhase = '' + wasm-bindgen --target bundler --out-dir $out ${wordle-solver-wasm}/lib/wordle_solver.wasm + cat < $out/package.json + ${package-json} + EOF + ''; + }; + in { + packages.wordle-solver-wasm-pkg = pkgs.callPackage drv { + inherit (self'.packages) wordle-solver-wasm wasm-bindgen; + }; }; - package-json = builtins.toJSON package-meta; -in - stdenvNoCC.mkDerivation { - name = "wordle-solver-wasm-pkg"; - nativeBuildInputs = [wasm-bindgen]; - unpackPhase = "true"; - buildPhase = '' - wasm-bindgen --target bundler --out-dir $out ${wordle-solver-wasm}/lib/wordle_solver.wasm - cat < $out/package.json - ${package-json} - EOF - ''; - } +} diff --git a/nix/wordle-solver-wasm.nix b/nix/wordle-solver-wasm.nix index 4101cba..4d6cb17 100644 --- a/nix/wordle-solver-wasm.nix +++ b/nix/wordle-solver-wasm.nix @@ -1,39 +1,47 @@ { - rustPlatform, - buildPackages, - lld, - name ? "wordle-solver", - ... -}: -rustPlatform.buildRustPackage { - inherit name; + perSystem = {pkgs, ...}: let + utils = import ./utils.nix; + toolchain-crosspkgs = utils.toolchain-crosspkgs pkgs; + drv = { + rustPlatform, + buildPackages, + lld, + name ? "wordle-solver", + ... + }: + rustPlatform.buildRustPackage { + inherit name; - src = ../.; # Or your source location - cargoLock.lockFile = ../Cargo.lock; + src = ../.; # Or your source location + cargoLock.lockFile = ../Cargo.lock; - # Disable tests since they can't run on WASM - doCheck = false; + # Disable tests since they can't run on WASM + doCheck = false; - # Required dependencies for WASM builds - depsBuildBuild = [ - buildPackages.stdenv.cc - lld # Needed for wasm-ld - ]; + # Required dependencies for WASM builds + depsBuildBuild = [ + buildPackages.stdenv.cc + lld # Needed for wasm-ld + ]; - cargoBuildFlags = [ - "--lib" - "--features" - "wasm-bindgen" - ]; + cargoBuildFlags = [ + "--lib" + "--features" + "wasm-bindgen" + ]; - # Configure rustc for WASM - env = { - RUSTFLAGS = ''--cfg=web_sys_unstable_apis -C linker=wasm-ld''; + # Configure rustc for WASM + env = { + RUSTFLAGS = ''--cfg=web_sys_unstable_apis -C linker=wasm-ld''; + }; + + # Copy the WASM file to the output + installPhase = '' + mkdir -p $out/lib + cp target/wasm32-unknown-unknown/release/*.wasm $out/lib/ + ''; + }; + in { + packages.wordle-solver-wasm = toolchain-crosspkgs.callPackage drv {}; }; - - # Copy the WASM file to the output - installPhase = '' - mkdir -p $out/lib - cp target/wasm32-unknown-unknown/release/*.wasm $out/lib/ - ''; } diff --git a/nix/wordle-solver-web.nix b/nix/wordle-solver-web.nix index 116a814..ac3d3cb 100644 --- a/nix/wordle-solver-web.nix +++ b/nix/wordle-solver-web.nix @@ -1,37 +1,49 @@ { - stdenv, - fetchYarnDeps, - yarnConfigHook, - yarnBuildHook, - nodejs, - wordle-solver-wasm-pkg, -}: -stdenv.mkDerivation (finalAttrs: { - pname = "wordle-solver-web"; - version = "0.1.0"; + perSystem = { + pkgs, + self', + ... + }: let + drv = { + stdenv, + fetchYarnDeps, + yarnConfigHook, + yarnBuildHook, + nodejs, + wordle-solver-wasm-pkg, + }: + stdenv.mkDerivation (finalAttrs: { + pname = "wordle-solver-web"; + version = "0.1.0"; - src = ../web; + src = ../web; - yarnOfflineCache = fetchYarnDeps { - yarnLock = finalAttrs.src + "/yarn.lock"; - hash = "sha256-MTyHX2+/U7jRB1SJWbK9Td43zq+nclQwx7oDZbX0DqA="; + yarnOfflineCache = fetchYarnDeps { + yarnLock = finalAttrs.src + "/yarn.lock"; + hash = "sha256-MTyHX2+/U7jRB1SJWbK9Td43zq+nclQwx7oDZbX0DqA="; + }; + + yarnBuildScript = "build-no-wasm"; + + postPatch = '' + ln -s ${wordle-solver-wasm-pkg} pkg + ''; + + installPhase = '' + mkdir $out + mv dist/* $out/ + ''; + + nativeBuildInputs = [ + yarnConfigHook + yarnBuildHook + # Needed for executing package.json scripts + nodejs + ]; + }); + in { + packages.wordle-solver-web = pkgs.callPackage drv { + inherit (self'.packages) wordle-solver-wasm-pkg; + }; }; - - yarnBuildScript = "build-no-wasm"; - - postPatch = '' - ln -s ${wordle-solver-wasm-pkg} pkg - ''; - - installPhase = '' - mkdir $out - mv dist/* $out/ - ''; - - nativeBuildInputs = [ - yarnConfigHook - yarnBuildHook - # Needed for executing package.json scripts - nodejs - ]; -}) +} diff --git a/nix/wordle-solver.nix b/nix/wordle-solver.nix new file mode 100644 index 0000000..290905c --- /dev/null +++ b/nix/wordle-solver.nix @@ -0,0 +1,27 @@ +{inputs, ...}: { + perSystem = {pkgs, ...}: let + # Cargo.nix for IFD + generatedCargoNix = inputs.crate2nix.tools.${pkgs.hostPlatform.system}.generatedCargoNix { + name = "rustnix"; + src = ../.; + }; + + utils = import ./utils.nix; + + rust-toolchain = utils.rust-toolchain pkgs; + toolchain-pkgs = utils.toolchain-pkgs pkgs; + + buildRustCrateForPkgs = _: + pkgs.buildRustCrate.override { + cargo = rust-toolchain; + rustc = rust-toolchain; + }; + + cargoNix = import generatedCargoNix { + pkgs = toolchain-pkgs; + inherit buildRustCrateForPkgs; + }; + in { + packages.wordle-solver = cargoNix.rootCrate.build; + }; +}