From ac0c53ae3e850d0dfee065d8955a31d7cfd74a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20=C5=BDlender?= Date: Sun, 23 Jun 2024 20:17:03 +0200 Subject: [PATCH 01/10] splice overrideToolchain --- default.nix | 19 +-- examples/cross-rust-overlay/flake.nix | 4 +- lib/default.nix | 192 ++++++++++++++++---------- 3 files changed, 129 insertions(+), 86 deletions(-) diff --git a/default.nix b/default.nix index e7c4488c..fa9a2151 100644 --- a/default.nix +++ b/default.nix @@ -1,13 +1,14 @@ { pkgs ? import { } }: import ./lib { - inherit (pkgs) lib makeScopeWithSplicing'; - otherSplices = { - selfBuildBuild = pkgs.pkgsBuildBuild; - selfBuildHost = pkgs.pkgsBuildHost; - selfBuildTarget = pkgs.pkgsBuildTarget; - selfHostHost = pkgs.pkgsHostHost; - selfHostTarget = pkgs.pkgsHostTarget; - selfTargetTarget = pkgs.pkgsTargetTarget; - }; + inherit (pkgs) + lib + makeScopeWithSplicing' + splicePackages + pkgsBuildBuild + pkgsBuildHost + pkgsBuildTarget + pkgsHostHost + pkgsHostTarget + pkgsTargetTarget; } diff --git a/examples/cross-rust-overlay/flake.nix b/examples/cross-rust-overlay/flake.nix index 4689fde3..c8e80a46 100644 --- a/examples/cross-rust-overlay/flake.nix +++ b/examples/cross-rust-overlay/flake.nix @@ -31,11 +31,11 @@ overlays = [ (import rust-overlay) ]; }; - rustToolchain = pkgs.pkgsBuildHost.rust-bin.stable.latest.default.override { + mkRustToolchain = pkgs: pkgs.pkgsBuildHost.rust-bin.stable.latest.default.override { targets = [ "aarch64-unknown-linux-gnu" ]; }; - craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; + craneLib = (crane.mkLib pkgs).overrideToolchain mkRustToolchain; # Note: we have to use the `callPackage` approach here so that Nix # can "splice" the packages in such a way that dependencies are diff --git a/lib/default.nix b/lib/default.nix index bdaa1c4d..b683eab1 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,6 +1,12 @@ { lib , makeScopeWithSplicing' -, otherSplices +, splicePackages +, pkgsBuildBuild +, pkgsBuildHost +, pkgsBuildTarget +, pkgsHostHost +, pkgsHostTarget +, pkgsTargetTarget }: let @@ -9,85 +15,121 @@ let isUnsupported = lib.versionOlder current minSupported; msg = "crane requires at least nixpkgs-${minSupported}, supplied nixpkgs-${current}"; - mySplice = f: makeScopeWithSplicing' { - inherit otherSplices f; - }; -in -lib.warnIf isUnsupported msg (mySplice (self: -let - inherit (self) callPackage; + spliceToolchain = toolchainFn: + let + splices = { + pkgsBuildBuild = { toolchain = toolchainFn pkgsBuildBuild; }; + pkgsBuildHost = { toolchain = toolchainFn pkgsBuildHost; }; + pkgsBuildTarget = { toolchain = toolchainFn pkgsBuildTarget; }; + pkgsHostHost = { toolchain = toolchainFn pkgsHostHost; }; + pkgsHostTarget = { toolchain = toolchainFn pkgsHostTarget; }; + pkgsTargetTarget = lib.optionalAttrs (pkgsTargetTarget?newScope) { toolchain = toolchainFn pkgsTargetTarget; }; + }; + in + (splicePackages splices).toolchain; - internalCrateNameFromCargoToml = callPackage ./internalCrateNameFromCargoToml.nix { }; - internalCrateNameForCleanSource = callPackage ./internalCrateNameForCleanSource.nix { - inherit internalCrateNameFromCargoToml; - }; -in -{ - appendCrateRegistries = input: self.overrideScope (_final: prev: { - crateRegistries = prev.crateRegistries // (lib.foldl (a: b: a // b) { } input); - }); + scopeFn = self: + let + inherit (self) callPackage; - buildDepsOnly = callPackage ./buildDepsOnly.nix { }; - buildPackage = callPackage ./buildPackage.nix { }; - buildTrunkPackage = callPackage ./buildTrunkPackage.nix { }; - cargoAudit = callPackage ./cargoAudit.nix { }; - cargoBuild = callPackage ./cargoBuild.nix { }; - cargoClippy = callPackage ./cargoClippy.nix { }; - cargoDeny = callPackage ./cargoDeny.nix { }; - cargoDoc = callPackage ./cargoDoc.nix { }; - cargoFmt = callPackage ./cargoFmt.nix { }; - cargoHelperFunctionsHook = callPackage ./setupHooks/cargoHelperFunctions.nix { }; - cargoLlvmCov = callPackage ./cargoLlvmCov.nix { }; - cargoNextest = callPackage ./cargoNextest.nix { }; - cargoTarpaulin = callPackage ./cargoTarpaulin.nix { }; - cargoTest = callPackage ./cargoTest.nix { }; - cleanCargoSource = callPackage ./cleanCargoSource.nix { - inherit internalCrateNameForCleanSource; - }; - cleanCargoToml = callPackage ./cleanCargoToml.nix { }; - configureCargoCommonVarsHook = callPackage ./setupHooks/configureCargoCommonVars.nix { }; - configureCargoVendoredDepsHook = callPackage ./setupHooks/configureCargoVendoredDeps.nix { }; - devShell = callPackage ./devShell.nix { }; + internalCrateNameFromCargoToml = callPackage ./internalCrateNameFromCargoToml.nix { }; + internalCrateNameForCleanSource = callPackage ./internalCrateNameForCleanSource.nix { + inherit internalCrateNameFromCargoToml; + }; + in + { + appendCrateRegistries = input: self.overrideScope (_final: prev: { + crateRegistries = prev.crateRegistries // (lib.foldl (a: b: a // b) { } input); + }); - crateNameFromCargoToml = callPackage ./crateNameFromCargoToml.nix { - inherit internalCrateNameFromCargoToml; - }; + buildDepsOnly = callPackage ./buildDepsOnly.nix { }; + buildPackage = callPackage ./buildPackage.nix { }; + buildTrunkPackage = callPackage ./buildTrunkPackage.nix { }; + cargoAudit = callPackage ./cargoAudit.nix { }; + cargoBuild = callPackage ./cargoBuild.nix { }; + cargoClippy = callPackage ./cargoClippy.nix { }; + cargoDeny = callPackage ./cargoDeny.nix { }; + cargoDoc = callPackage ./cargoDoc.nix { }; + cargoFmt = callPackage ./cargoFmt.nix { }; + cargoHelperFunctionsHook = callPackage ./setupHooks/cargoHelperFunctions.nix { }; + cargoLlvmCov = callPackage ./cargoLlvmCov.nix { }; + cargoNextest = callPackage ./cargoNextest.nix { }; + cargoTarpaulin = callPackage ./cargoTarpaulin.nix { }; + cargoTest = callPackage ./cargoTest.nix { }; + cleanCargoSource = callPackage ./cleanCargoSource.nix { + inherit internalCrateNameForCleanSource; + }; + cleanCargoToml = callPackage ./cleanCargoToml.nix { }; + configureCargoCommonVarsHook = callPackage ./setupHooks/configureCargoCommonVars.nix { }; + configureCargoVendoredDepsHook = callPackage ./setupHooks/configureCargoVendoredDeps.nix { }; + devShell = callPackage ./devShell.nix { }; - crateRegistries = self.registryFromDownloadUrl { - dl = "https://static.crates.io/crates"; - indexUrl = "https://github.com/rust-lang/crates.io-index"; - }; + crateNameFromCargoToml = callPackage ./crateNameFromCargoToml.nix { + inherit internalCrateNameFromCargoToml; + }; - downloadCargoPackage = callPackage ./downloadCargoPackage.nix { }; - downloadCargoPackageFromGit = callPackage ./downloadCargoPackageFromGit.nix { }; - filterCargoSources = callPackage ./filterCargoSources.nix { }; - findCargoFiles = callPackage ./findCargoFiles.nix { }; - inheritCargoArtifactsHook = callPackage ./setupHooks/inheritCargoArtifacts.nix { }; - installCargoArtifactsHook = callPackage ./setupHooks/installCargoArtifacts.nix { }; - installFromCargoBuildLogHook = callPackage ./setupHooks/installFromCargoBuildLog.nix { }; - mkCargoDerivation = callPackage ./mkCargoDerivation.nix { }; - mkDummySrc = callPackage ./mkDummySrc.nix { }; + crateRegistries = self.registryFromDownloadUrl { + dl = "https://static.crates.io/crates"; + indexUrl = "https://github.com/rust-lang/crates.io-index"; + }; - overrideToolchain = toolchain: self.overrideScope (_final: _prev: { - cargo = toolchain; - clippy = toolchain; - rustc = toolchain; - rustfmt = toolchain; - }); + downloadCargoPackage = callPackage ./downloadCargoPackage.nix { }; + downloadCargoPackageFromGit = callPackage ./downloadCargoPackageFromGit.nix { }; + filterCargoSources = callPackage ./filterCargoSources.nix { }; + findCargoFiles = callPackage ./findCargoFiles.nix { }; + inheritCargoArtifactsHook = callPackage ./setupHooks/inheritCargoArtifacts.nix { }; + installCargoArtifactsHook = callPackage ./setupHooks/installCargoArtifacts.nix { }; + installFromCargoBuildLogHook = callPackage ./setupHooks/installFromCargoBuildLog.nix { }; + mkCargoDerivation = callPackage ./mkCargoDerivation.nix { }; + mkDummySrc = callPackage ./mkDummySrc.nix { }; - path = callPackage ./path.nix { - inherit internalCrateNameForCleanSource; - }; + overrideToolchain = toolchain: self.overrideScope (_final: _prev: + let + splicedToolchain = spliceToolchain toolchain; + in + if lib.isFunction toolchain then + { + cargo = splicedToolchain; + clippy = splicedToolchain; + rustc = splicedToolchain; + rustfmt = splicedToolchain; + } + else + { + cargo = toolchain; + clippy = toolchain; + rustc = toolchain; + rustfmt = toolchain; + } + ); + + path = callPackage ./path.nix { + inherit internalCrateNameForCleanSource; + }; - registryFromDownloadUrl = callPackage ./registryFromDownloadUrl.nix { }; - registryFromGitIndex = callPackage ./registryFromGitIndex.nix { }; - registryFromSparse = callPackage ./registryFromSparse.nix { }; - removeReferencesToVendoredSourcesHook = callPackage ./setupHooks/removeReferencesToVendoredSources.nix { }; - replaceCargoLockHook = callPackage ./setupHooks/replaceCargoLockHook.nix { }; - urlForCargoPackage = callPackage ./urlForCargoPackage.nix { }; - vendorCargoDeps = callPackage ./vendorCargoDeps.nix { }; - vendorMultipleCargoDeps = callPackage ./vendorMultipleCargoDeps.nix { }; - vendorCargoRegistries = callPackage ./vendorCargoRegistries.nix { }; - vendorGitDeps = callPackage ./vendorGitDeps.nix { }; - writeTOML = callPackage ./writeTOML.nix { }; -})) + registryFromDownloadUrl = callPackage ./registryFromDownloadUrl.nix { }; + registryFromGitIndex = callPackage ./registryFromGitIndex.nix { }; + registryFromSparse = callPackage ./registryFromSparse.nix { }; + removeReferencesToVendoredSourcesHook = callPackage ./setupHooks/removeReferencesToVendoredSources.nix { }; + replaceCargoLockHook = callPackage ./setupHooks/replaceCargoLockHook.nix { }; + urlForCargoPackage = callPackage ./urlForCargoPackage.nix { }; + vendorCargoDeps = callPackage ./vendorCargoDeps.nix { }; + vendorMultipleCargoDeps = callPackage ./vendorMultipleCargoDeps.nix { }; + vendorCargoRegistries = callPackage ./vendorCargoRegistries.nix { }; + vendorGitDeps = callPackage ./vendorGitDeps.nix { }; + writeTOML = callPackage ./writeTOML.nix { }; + }; + + craneSpliced = makeScopeWithSplicing' { + f = scopeFn; + otherSplices = { + selfBuildBuild = lib.makeScope pkgsBuildBuild.newScope scopeFn; + selfBuildHost = lib.makeScope pkgsBuildHost.newScope scopeFn; + selfBuildTarget = lib.makeScope pkgsBuildTarget.newScope scopeFn; + selfHostHost = lib.makeScope pkgsHostHost.newScope scopeFn; + selfHostTarget = lib.makeScope pkgsHostTarget.newScope scopeFn; + selfTargetTarget = lib.optionalAttrs (pkgsTargetTarget?newScope) (lib.makeScope pkgsTargetTarget.newScope scopeFn); + }; + }; +in +lib.warnIf isUnsupported msg (craneSpliced) From ee99f5ee07ece76b1a4075c83a53a7510806b5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20=C5=BDlender?= Date: Mon, 24 Jun 2024 14:56:41 +0200 Subject: [PATCH 02/10] fix splicing --- default.nix | 13 +----------- examples/cross-rust-overlay/flake.nix | 6 +----- lib/default.nix | 30 +++++++++++++-------------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/default.nix b/default.nix index fa9a2151..1c353d67 100644 --- a/default.nix +++ b/default.nix @@ -1,14 +1,3 @@ { pkgs ? import { } }: -import ./lib { - inherit (pkgs) - lib - makeScopeWithSplicing' - splicePackages - pkgsBuildBuild - pkgsBuildHost - pkgsBuildTarget - pkgsHostHost - pkgsHostTarget - pkgsTargetTarget; -} +pkgs.callPackage ./lib { } diff --git a/examples/cross-rust-overlay/flake.nix b/examples/cross-rust-overlay/flake.nix index c8e80a46..42c52194 100644 --- a/examples/cross-rust-overlay/flake.nix +++ b/examples/cross-rust-overlay/flake.nix @@ -31,11 +31,7 @@ overlays = [ (import rust-overlay) ]; }; - mkRustToolchain = pkgs: pkgs.pkgsBuildHost.rust-bin.stable.latest.default.override { - targets = [ "aarch64-unknown-linux-gnu" ]; - }; - - craneLib = (crane.mkLib pkgs).overrideToolchain mkRustToolchain; + craneLib = (crane.mkLib pkgs).overrideToolchain (pkgs: pkgs.rust-bin.stable.latest.default); # Note: we have to use the `callPackage` approach here so that Nix # can "splice" the packages in such a way that dependencies are diff --git a/lib/default.nix b/lib/default.nix index b683eab1..a0e4681c 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,4 +1,5 @@ { lib +, stdenv , makeScopeWithSplicing' , splicePackages , pkgsBuildBuild @@ -83,24 +84,20 @@ let mkCargoDerivation = callPackage ./mkCargoDerivation.nix { }; mkDummySrc = callPackage ./mkDummySrc.nix { }; - overrideToolchain = toolchain: self.overrideScope (_final: _prev: + overrideToolchain = toolchainArg: self.overrideScope (_final: _prev: let - splicedToolchain = spliceToolchain toolchain; + toolchain = + if lib.isFunction toolchainArg + then spliceToolchain toolchainArg + else toolchainArg; + needsSplicing = stdenv.buildPlatform != stdenv.hostPlatform && toolchain?__spliced == false; in - if lib.isFunction toolchain then - { - cargo = splicedToolchain; - clippy = splicedToolchain; - rustc = splicedToolchain; - rustfmt = splicedToolchain; - } - else - { - cargo = toolchain; - clippy = toolchain; - rustc = toolchain; - rustfmt = toolchain; - } + lib.warnIf needsSplicing "crane overrideToolchain requires a spliced toolchain when cross-compiling" { + cargo = toolchain; + clippy = toolchain; + rustc = toolchain; + rustfmt = toolchain; + } ); path = callPackage ./path.nix { @@ -130,6 +127,7 @@ let selfHostTarget = lib.makeScope pkgsHostTarget.newScope scopeFn; selfTargetTarget = lib.optionalAttrs (pkgsTargetTarget?newScope) (lib.makeScope pkgsTargetTarget.newScope scopeFn); }; + keep = self: lib.optionalAttrs (self?cargo) { inherit (self) cargo clippy rustc rustfmt; }; }; in lib.warnIf isUnsupported msg (craneSpliced) From 626243e85235744999d604c4bc27c38ee8d8e938 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 10:17:21 -0700 Subject: [PATCH 03/10] Tweak all usage of .overrideToolchain as appropriate --- checks/default.nix | 6 +++--- checks/trunk.nix | 4 ++-- docs/API.md | 9 +++++++-- docs/faq/custom-nixpkgs.md | 8 +++----- docs/faq/invalid-metadata-files-for-crate.md | 5 +++-- docs/overriding_derivations.md | 2 +- examples/build-std/flake.nix | 6 +++--- examples/cross-musl/flake.nix | 6 ++---- examples/cross-rust-overlay/flake.nix | 2 +- examples/custom-toolchain/flake.nix | 9 +++------ examples/end-to-end-testing/flake.nix | 3 +-- examples/trunk-workspace/flake.nix | 4 ++-- examples/trunk/flake.nix | 4 ++-- 13 files changed, 33 insertions(+), 35 deletions(-) diff --git a/checks/default.nix b/checks/default.nix index 532b64d9..ecd933ca 100644 --- a/checks/default.nix +++ b/checks/default.nix @@ -8,7 +8,7 @@ in onlyDrvs (lib.makeScope myLib.newScope (self: let callPackage = self.newScope { }; - myLibLlvmTools = myLib.overrideToolchain (pkgs.rust-bin.stable.latest.minimal.override { + myLibLlvmTools = myLib.overrideToolchain (p: p.rust-bin.stable.latest.minimal.override { extensions = [ "llvm-tools" ]; }); x64Linux = pkgs.hostPlatform.system == "x86_64-linux"; @@ -407,7 +407,7 @@ in noStd = let - noStdLib = myLib.overrideToolchain (pkgs.rust-bin.stable.latest.minimal.override { + noStdLib = myLib.overrideToolchain (p: p.rust-bin.stable.latest.minimal.override { targets = [ "thumbv6m-none-eabi" "x86_64-unknown-none" @@ -423,7 +423,7 @@ in bindeps = let - bindepsLib = myLib.overrideToolchain (pkgs.rust-bin.nightly.latest.minimal.override { + bindepsLib = myLib.overrideToolchain (p: p.rust-bin.nightly.latest.minimal.override { targets = [ "wasm32-unknown-unknown" "x86_64-unknown-none" diff --git a/checks/trunk.nix b/checks/trunk.nix index 7ce6ae23..b1568888 100644 --- a/checks/trunk.nix +++ b/checks/trunk.nix @@ -5,7 +5,7 @@ }: let - wasmToolchain = pkgs.rust-bin.stable.latest.minimal.override { + wasmToolchainFor = p: p.rust-bin.stable.latest.minimal.override { targets = [ "wasm32-unknown-unknown" ]; }; @@ -13,7 +13,7 @@ let url = "https://github.com/NixOS/nixpkgs/archive/4e6868b1aa3766ab1de169922bb3826143941973.tar.gz"; sha256 = "sha256:1q6bj2jjlwb10sfrhqmjpzsc3yc4x76cvky16wh0z52p7d2lhdpv"; }; - myLibWasm = (myLib.overrideToolchain wasmToolchain).overrideScope (_final: _prev: { + myLibWasm = (myLib.overrideToolchain wasmToolchainFor).overrideScope (_final: _prev: { inherit (import tarball { inherit (stdenv) system; }) wasm-bindgen-cli; }); diff --git a/docs/API.md b/docs/API.md index 69da3de2..e61f8027 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1193,15 +1193,20 @@ build caches. More specifically: ### `craneLib.overrideToolchain` -`overrideToolchain :: drv -> set` +`overrideToolchain :: (set -> drv) -> set` +`overrideToolchain :: drv -> set` (deprecated) A convenience method to override and use tools (like `cargo`, `clippy`, `rustfmt`, `rustc`, etc.) from one specific toolchain. The input should be a single derivation which contains all the tools as binaries. For example, this can be the output of `oxalica/rust-overlay`. +Note that in order to best support cross compilation, `overrideToolchain` should +be provided a function (whose argument is a cross-compilation aware version of +`pkgs`) which constructs the toolchain: + ```nix -craneLib.overrideToolchain myCustomToolchain +craneLib.overrideToolchain (p: myCustomToolchainForPkgs p) ``` ### `craneLib.path` diff --git a/docs/faq/custom-nixpkgs.md b/docs/faq/custom-nixpkgs.md index 60234c43..07757a51 100644 --- a/docs/faq/custom-nixpkgs.md +++ b/docs/faq/custom-nixpkgs.md @@ -26,12 +26,10 @@ let inherit system; overlays = [ (import rust-overlay) ]; }; - - rustToolchain = pkgs.rust-bin.stable.latest.default.override { - targets = [ "wasm32-wasi" ]; - }; in -(crane.mkLib pkgs).overrideToolchain rustToolchain +(crane.mkLib pkgs).overrideToolchain (p: p.rust-bin.stable.latest.default.override { + targets = [ "wasm32-wasi" ]; +}) ``` Finally, specific inputs can be overridden for the entire library via the diff --git a/docs/faq/invalid-metadata-files-for-crate.md b/docs/faq/invalid-metadata-files-for-crate.md index 5c5d296f..00e0c988 100644 --- a/docs/faq/invalid-metadata-files-for-crate.md +++ b/docs/faq/invalid-metadata-files-for-crate.md @@ -7,7 +7,8 @@ used in the build: ```nix let - rustToolchain = ...; + rustToolchainForPkgs = p: ...; + rustToolchain = rustToolchainForPkgs pkgs; in # Incorrect usage, missing `clippy` override! #(crane.mkLib pkgs).overrideScope (final: prev: { @@ -17,5 +18,5 @@ in #}); # Correct usage (`overrideToolchain` handles the details for us) -(crane.mkLib pkgs).overrideToolchain rustToolchain +(crane.mkLib pkgs).overrideToolchain rustToolchainForPkgs ``` diff --git a/docs/overriding_derivations.md b/docs/overriding_derivations.md index 4677c2b9..61b61bd0 100644 --- a/docs/overriding_derivations.md +++ b/docs/overriding_derivations.md @@ -83,7 +83,7 @@ craneLib.buildPackage { # Use a different `craneLib` instantiation: one with a nightly compiler my-crate-nightly = my-crate.override { - craneLib = craneLib.overrideToolchain pkgs.rust-bin.nightly.latest.default; + craneLib = craneLib.overrideToolchain (p: p.rust-bin.nightly.latest.default); }; }; }); diff --git a/examples/build-std/flake.nix b/examples/build-std/flake.nix index c2f88c91..0553c699 100644 --- a/examples/build-std/flake.nix +++ b/examples/build-std/flake.nix @@ -28,16 +28,17 @@ overlays = [ (import rust-overlay) ]; }; - rustToolchain = pkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override { + rustToolchainFor = p: p.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override { extensions = [ "rust-src" ]; targets = [ "x86_64-unknown-linux-gnu" ]; }); + rustToolchain = rustToolchainFor pkgs; # NB: we don't need to overlay our custom toolchain for the *entire* # pkgs (which would require rebuidling anything else which uses rust). # Instead, we just want to update the scope that crane will use by appending # our specific toolchain there. - craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; + craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchainFor; src = craneLib.cleanCargoSource ./.; @@ -83,7 +84,6 @@ # Extra inputs can be added here; cargo and rustc are provided by default # from the toolchain that was specified earlier. packages = [ - # rustToolchain ]; }; }); diff --git a/examples/cross-musl/flake.nix b/examples/cross-musl/flake.nix index f3244746..245dbef8 100644 --- a/examples/cross-musl/flake.nix +++ b/examples/cross-musl/flake.nix @@ -28,11 +28,9 @@ overlays = [ (import rust-overlay) ]; }; - rustToolchain = pkgs.rust-bin.stable.latest.default.override { + craneLib = (crane.mkLib pkgs).overrideToolchain (p: p.rust-bin.stable.latest.default.override { targets = [ "x86_64-unknown-linux-musl" ]; - }; - - craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; + }); my-crate = craneLib.buildPackage { src = craneLib.cleanCargoSource ./.; diff --git a/examples/cross-rust-overlay/flake.nix b/examples/cross-rust-overlay/flake.nix index 42c52194..610e6dd8 100644 --- a/examples/cross-rust-overlay/flake.nix +++ b/examples/cross-rust-overlay/flake.nix @@ -31,7 +31,7 @@ overlays = [ (import rust-overlay) ]; }; - craneLib = (crane.mkLib pkgs).overrideToolchain (pkgs: pkgs.rust-bin.stable.latest.default); + craneLib = (crane.mkLib pkgs).overrideToolchain (p: p.rust-bin.stable.latest.default); # Note: we have to use the `callPackage` approach here so that Nix # can "splice" the packages in such a way that dependencies are diff --git a/examples/custom-toolchain/flake.nix b/examples/custom-toolchain/flake.nix index 77833426..fe7b90c8 100644 --- a/examples/custom-toolchain/flake.nix +++ b/examples/custom-toolchain/flake.nix @@ -28,15 +28,13 @@ overlays = [ (import rust-overlay) ]; }; - rustWithWasiTarget = pkgs.rust-bin.stable.latest.default.override { - targets = [ "wasm32-wasi" ]; - }; - # NB: we don't need to overlay our custom toolchain for the *entire* # pkgs (which would require rebuidling anything else which uses rust). # Instead, we just want to update the scope that crane will use by appending # our specific toolchain there. - craneLib = (crane.mkLib pkgs).overrideToolchain rustWithWasiTarget; + craneLib = (crane.mkLib pkgs).overrideToolchain (p: p.rust-bin.stable.latest.default.override { + targets = [ "wasm32-wasi" ]; + }); my-crate = craneLib.buildPackage { src = craneLib.cleanCargoSource ./.; @@ -76,7 +74,6 @@ # Extra inputs can be added here; cargo and rustc are provided by default # from the toolchain that was specified earlier. packages = [ - # rustWithWasiTarget ]; }; }); diff --git a/examples/end-to-end-testing/flake.nix b/examples/end-to-end-testing/flake.nix index 0ceeadc6..7640912c 100644 --- a/examples/end-to-end-testing/flake.nix +++ b/examples/end-to-end-testing/flake.nix @@ -27,8 +27,7 @@ }; inherit (pkgs) lib; - rustToolchain = pkgs.rust-bin.stable.latest.default; - craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; + craneLib = (crane.mkLib pkgs).overrideToolchain (p: p.rust-bin.stable.latest.default); src = craneLib.cleanCargoSource ./.; workspace = craneLib.buildPackage { diff --git a/examples/trunk-workspace/flake.nix b/examples/trunk-workspace/flake.nix index c06853af..d7633c97 100644 --- a/examples/trunk-workspace/flake.nix +++ b/examples/trunk-workspace/flake.nix @@ -34,12 +34,12 @@ inherit (pkgs) lib; - rustToolchain = pkgs.rust-bin.stable.latest.default.override { + rustToolchainFor = p: p.rust-bin.stable.latest.default.override { # Set the build targets supported by the toolchain, # wasm32-unknown-unknown is required for trunk. targets = [ "wasm32-unknown-unknown" ]; }; - craneLib = ((crane.mkLib pkgs).overrideToolchain rustToolchain).overrideScope (_final: _prev: { + craneLib = ((crane.mkLib pkgs).overrideToolchain rustToolchainFor).overrideScope (_final: _prev: { # The version of wasm-bindgen-cli needs to match the version in Cargo.lock. You # can unpin this if your nixpkgs commit contains the appropriate wasm-bindgen-cli version inherit (import nixpkgs-for-wasm-bindgen { inherit system; }) wasm-bindgen-cli; diff --git a/examples/trunk/flake.nix b/examples/trunk/flake.nix index 101d5968..dedc51b3 100644 --- a/examples/trunk/flake.nix +++ b/examples/trunk/flake.nix @@ -34,12 +34,12 @@ inherit (pkgs) lib; - rustToolchain = pkgs.rust-bin.stable.latest.default.override { + rustToolchainFor = p: p.rust-bin.stable.latest.default.override { # Set the build targets supported by the toolchain, # wasm32-unknown-unknown is required for trunk targets = [ "wasm32-unknown-unknown" ]; }; - craneLib = ((crane.mkLib pkgs).overrideToolchain rustToolchain).overrideScope (_final: _prev: { + craneLib = ((crane.mkLib pkgs).overrideToolchain rustToolchainFor).overrideScope (_final: _prev: { # The version of wasm-bindgen-cli needs to match the version in Cargo.lock. You # can unpin this if your nixpkgs commit contains the appropriate wasm-bindgen-cli version inherit (import nixpkgs-for-wasm-bindgen { inherit system; }) wasm-bindgen-cli; From 8f1e07b846aaa763ef4290ee33589514b3da7bcd Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 10:25:46 -0700 Subject: [PATCH 04/10] Keep `overrideToolchain` and `keep` in sync --- lib/default.nix | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/default.nix b/lib/default.nix index a0e4681c..e476cb2b 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -16,6 +16,14 @@ let isUnsupported = lib.versionOlder current minSupported; msg = "crane requires at least nixpkgs-${minSupported}, supplied nixpkgs-${current}"; + # Helps keep things in sync between `overrideToolchain` and `keep` + attrsForToolchainOverride = [ + "cargo" + "clippy" + "rustc" + "rustfmt" + ]; + spliceToolchain = toolchainFn: let splices = { @@ -92,12 +100,8 @@ let else toolchainArg; needsSplicing = stdenv.buildPlatform != stdenv.hostPlatform && toolchain?__spliced == false; in - lib.warnIf needsSplicing "crane overrideToolchain requires a spliced toolchain when cross-compiling" { - cargo = toolchain; - clippy = toolchain; - rustc = toolchain; - rustfmt = toolchain; - } + lib.warnIf needsSplicing "crane overrideToolchain requires a spliced toolchain when cross-compiling" + (lib.genAttrs attrsForToolchainOverride (_: toolchain)) ); path = callPackage ./path.nix { @@ -127,7 +131,8 @@ let selfHostTarget = lib.makeScope pkgsHostTarget.newScope scopeFn; selfTargetTarget = lib.optionalAttrs (pkgsTargetTarget?newScope) (lib.makeScope pkgsTargetTarget.newScope scopeFn); }; - keep = self: lib.optionalAttrs (self?cargo) { inherit (self) cargo clippy rustc rustfmt; }; + keep = self: lib.optionalAttrs (self?cargo) + (lib.genAttrs attrsForToolchainOverride (n: self.${n})); }; in lib.warnIf isUnsupported msg (craneSpliced) From 2ef9f39de904e84875ca7d8f5c2e3abb19fdce04 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 10:32:11 -0700 Subject: [PATCH 05/10] Update warning to hint towards solution --- lib/default.nix | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/default.nix b/lib/default.nix index e476cb2b..b45b8736 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -99,9 +99,14 @@ let then spliceToolchain toolchainArg else toolchainArg; needsSplicing = stdenv.buildPlatform != stdenv.hostPlatform && toolchain?__spliced == false; + warningMsg = '' + craneLib.overrideToolchain requires a spliced toolchain when cross-compiling. Consider specifying + a function which constructs a toolchain for any given `pkgs` instantiation: + + (crane.mkLib pkgs).overrideToolchain (p: ...) + ''; in - lib.warnIf needsSplicing "crane overrideToolchain requires a spliced toolchain when cross-compiling" - (lib.genAttrs attrsForToolchainOverride (_: toolchain)) + lib.warnIf needsSplicing warningMsg (lib.genAttrs attrsForToolchainOverride (_: toolchain)) ); path = callPackage ./path.nix { From 7eeeb6118fbbeb2d63a55a3cd801b4f05fc250a0 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 10:41:43 -0700 Subject: [PATCH 06/10] Alpha sort --- lib/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/default.nix b/lib/default.nix index b45b8736..b9875a71 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -71,7 +71,6 @@ let cleanCargoToml = callPackage ./cleanCargoToml.nix { }; configureCargoCommonVarsHook = callPackage ./setupHooks/configureCargoCommonVars.nix { }; configureCargoVendoredDepsHook = callPackage ./setupHooks/configureCargoVendoredDeps.nix { }; - devShell = callPackage ./devShell.nix { }; crateNameFromCargoToml = callPackage ./crateNameFromCargoToml.nix { inherit internalCrateNameFromCargoToml; @@ -82,6 +81,7 @@ let indexUrl = "https://github.com/rust-lang/crates.io-index"; }; + devShell = callPackage ./devShell.nix { }; downloadCargoPackage = callPackage ./downloadCargoPackage.nix { }; downloadCargoPackageFromGit = callPackage ./downloadCargoPackageFromGit.nix { }; filterCargoSources = callPackage ./filterCargoSources.nix { }; From 6254503584b431ab055543bb0058c4dcebf7be59 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 10:43:41 -0700 Subject: [PATCH 07/10] Also splice craneUtils --- lib/default.nix | 1 + lib/downloadCargoPackageFromGit.nix | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/default.nix b/lib/default.nix index b9875a71..6f9aa6e8 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -71,6 +71,7 @@ let cleanCargoToml = callPackage ./cleanCargoToml.nix { }; configureCargoCommonVarsHook = callPackage ./setupHooks/configureCargoCommonVars.nix { }; configureCargoVendoredDepsHook = callPackage ./setupHooks/configureCargoVendoredDeps.nix { }; + craneUtils = callPackage ../pkgs/crane-utils { }; crateNameFromCargoToml = callPackage ./crateNameFromCargoToml.nix { inherit internalCrateNameFromCargoToml; diff --git a/lib/downloadCargoPackageFromGit.nix b/lib/downloadCargoPackageFromGit.nix index e8c0c399..e5c276ce 100644 --- a/lib/downloadCargoPackageFromGit.nix +++ b/lib/downloadCargoPackageFromGit.nix @@ -1,5 +1,6 @@ { lib , cargo +, craneUtils , jq , pkgsBuildBuild }: @@ -8,8 +9,6 @@ let inherit (pkgsBuildBuild) fetchgit stdenv; - - craneUtils = pkgsBuildBuild.callPackage ../pkgs/crane-utils { }; in { git , rev From 13fa16373275ea5d74448fc5d16eb7643edcd118 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 10:48:17 -0700 Subject: [PATCH 08/10] Add CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cc7d55e..c2ab2098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. `craneLib.cleanCargoSource (craneLib.path ./.)`): it is recommended to either use `craneLib.cleanCargoSource ./.` directly (if the default source cleaning is desired) or `craneLib.path ./.` (if not). +* `overrideToolchain` has been updated to better handle cross-compilation + splicing for a customized toolchain. This means that `overrideToolchain` + should now be called with a function which constructs said toolchain for any + given `pkgs` instantiation. For example: `craneLib.overrideToolchain (p: + p.rust-bin.stable.latest.default)` ### Fixed * The cross compilation example also hows how to set the `TARGET_CC` environment From a40516f6e147e114159aab970ba948bdc5294bc8 Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 11:18:48 -0700 Subject: [PATCH 09/10] Use `legacy` over `deprecated` --- docs/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index e61f8027..26bccc4a 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1194,7 +1194,7 @@ build caches. More specifically: ### `craneLib.overrideToolchain` `overrideToolchain :: (set -> drv) -> set` -`overrideToolchain :: drv -> set` (deprecated) +`overrideToolchain :: drv -> set` (legacy) A convenience method to override and use tools (like `cargo`, `clippy`, `rustfmt`, `rustc`, etc.) from one specific toolchain. The input should be a From 98c185aaed847ca18b973350ef9c55d8d537f67c Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sat, 29 Jun 2024 11:20:32 -0700 Subject: [PATCH 10/10] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2ab2098..195cff9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. `cleanCargoSource`) * `removeReferencesToVendoredSources` handles the edge case where `cargoVendorDir` does not point to a path within the Nix store +* It is now possible to use `.overrideScope` to change what instance of + `craneUtils` will be used during vendoring. ## [0.17.3] - 2024-06-02