diff --git a/flake.nix b/flake.nix index 40036a2..f6c39f2 100644 --- a/flake.nix +++ b/flake.nix @@ -36,51 +36,24 @@ }: let # Use rust-bin to generate the toolchain from rust-toolchain.toml rust-toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; - rustPlatform = pkgs.makeRustPlatform { + + cross-pkgs = pkgs.pkgsCross.wasm32-unknown-none; + + toolchain = pkgs.callPackage ./nix/with-toolchain.nix { cargo = rust-toolchain; rustc = rust-toolchain; }; - rust-toolchain-pkgs = pkgs.extend (_: _: { - inherit rustPlatform; - }); - wasm-bindgen = with rust-toolchain-pkgs; - 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="; - }; - }; - - buildRustCrateForPkgs = _: - pkgs.buildRustCrate.override { - rustc = rust-toolchain; # Use rustc from toolchain - cargo = rust-toolchain; # Use cargo from toolchain - }; - - # Cargo.nix for IFD - generatedCargoNix = crate2nix.tools.${system}.generatedCargoNix { - name = "rustnix"; - src = ./.; + crossToolchain = cross-pkgs.callPackage ./nix/with-toolchain.nix { + cargo = rust-toolchain; + rustc = rust-toolchain; }; - cross-pkgs2 = inputs.nixpkgs.legacyPackages.${system}.pkgsCross.wasm32-unknown-none; - cross-pkgs = import pkgs.path { - inherit (pkgs) system; - crossSystem = - pkgs.lib.systems.examples.wasm32-unknown-none - // { - rust.rustcTargetSpec = "wasm32-unknown-unknown"; - }; - }; - cargoNix = import generatedCargoNix { - inherit pkgs buildRustCrateForPkgs; + 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; }; in { # Overlay pkgs with rust-bin @@ -90,54 +63,12 @@ }; packages = { - wordle-solver-wasm = cross-pkgs2.callPackage ( - { - rustPlatform, - buildPackages, - lld, - }: - rustPlatform.buildRustPackage { - pname = "wordle-solver"; - version = "0.1.0"; - src = ./.; # Or your source location - cargoLock.lockFile = ./Cargo.lock; - - # 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 - ]; - - cargoBuildFlags = [ - "--lib" - "--features" - "wasm-bindgen" - ]; - - # 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/ - ''; - } - ) {}; - wordle-solver-wasm-pkg = pkgs.stdenvNoCC.mkDerivation { - name = "wordle-solver-wasm-pkg"; - nativeBuildInputs = [wasm-bindgen]; - unpackPhase = "true"; - buildPhase = '' - wasm-bindgen --target bundler --out-dir $out ${self'.packages.wordle-solver-wasm}/lib/wordle_solver.wasm - ''; + 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 = cargoNix.rootCrate.build; + wordle-solver = root-crate.build; default = self'.packages.wordle-solver; }; diff --git a/nix/root-crate.nix b/nix/root-crate.nix new file mode 100644 index 0000000..6ee3869 --- /dev/null +++ b/nix/root-crate.nix @@ -0,0 +1,23 @@ +{ + 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/wasm-bindgen.nix b/nix/wasm-bindgen.nix new file mode 100644 index 0000000..7f2a20b --- /dev/null +++ b/nix/wasm-bindgen.nix @@ -0,0 +1,19 @@ +{ + 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="; + }; +} diff --git a/nix/with-toolchain.nix b/nix/with-toolchain.nix new file mode 100644 index 0000000..0879d82 --- /dev/null +++ b/nix/with-toolchain.nix @@ -0,0 +1,16 @@ +{ + 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 new file mode 100644 index 0000000..2602a90 --- /dev/null +++ b/nix/wordle-solver-wasm-pkg.nix @@ -0,0 +1,39 @@ +{ + 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/*" + ]; + }; + 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 new file mode 100644 index 0000000..4101cba --- /dev/null +++ b/nix/wordle-solver-wasm.nix @@ -0,0 +1,39 @@ +{ + rustPlatform, + buildPackages, + lld, + name ? "wordle-solver", + ... +}: +rustPlatform.buildRustPackage { + inherit name; + + src = ../.; # Or your source location + cargoLock.lockFile = ../Cargo.lock; + + # 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 + ]; + + cargoBuildFlags = [ + "--lib" + "--features" + "wasm-bindgen" + ]; + + # 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/ + ''; +}