diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index 02a40165..bdfe0f92 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -7,7 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null # This is used as the `crateOverrides` argument for `buildRustCrate`. , defaultCrateOverrides ? pkgs.defaultCrateOverrides # The features to enable for the root_crate or the workspace_members. @@ -2291,7 +2295,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -2305,30 +2309,30 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc else ( if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate + then buildRustCrateForPkgs else - buildRustCrate.override { + pkgs: (buildRustCrateForPkgs pkgs).override { defaultCrateOverrides = crateOverrides; } ); builtRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -2343,14 +2347,14 @@ rec { ) { inherit features crateOverrides runTests testCrateFlags testInputs; }; - /* Returns an attr set with packageId mapped to the result of buildRustCrateFunc + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc for the corresponding crate. */ builtRustCratesWithFeatures = { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -2368,12 +2372,17 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageId = packageId: buildByPackageIdImpl packageId; - # Memoize built packages so that reappearing packages are only built once. - builtByPackageId = - lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; - buildByPackageIdImpl = packageId: + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: let features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; @@ -2385,14 +2394,21 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -2424,13 +2440,13 @@ rec { dependenciesWithRenames; versionAndRename = dep: let - package = builtByPackageId."${dep.packageId}"; + package = crateConfigs."${dep.packageId}"; in { inherit (dep) rename; version = package.version; }; in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - buildRustCrateFunc + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -2449,16 +2465,15 @@ rec { } ); in - builtByPackageId; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = - { builtByPackageId + { buildByPackageId , features , dependencies , target }: - assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); assert (builtins.isAttrs target); @@ -2466,7 +2481,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; @@ -2489,14 +2504,14 @@ rec { debug = rec { # The built tree as passed to buildRustCrate. buildTree = buildRustCrateWithFeatures { - buildRustCrateFunc = lib.id; + buildRustCrateForPkgsFunc = _: lib.id; inherit packageId; }; sanitizedBuildTree = sanitizeForJson buildTree; dependencyTree = sanitizeForJson ( buildRustCrateWithFeatures { - buildRustCrateFunc = crate: { + buildRustCrateForPkgsFunc = _: crate: { "01_crateName" = crate.crateName or false; "02_features" = crate.features or [ ]; "03_dependencies" = crate.dependencies or [ ]; diff --git a/crate2nix/templates/Cargo.nix.tera b/crate2nix/templates/Cargo.nix.tera index fcc95a7b..81f4019c 100644 --- a/crate2nix/templates/Cargo.nix.tera +++ b/crate2nix/templates/Cargo.nix.tera @@ -9,7 +9,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null # This is used as the `crateOverrides` argument for `buildRustCrate`. , defaultCrateOverrides ? pkgs.defaultCrateOverrides # The features to enable for the root_crate or the workspace_members. diff --git a/crate2nix/templates/nix/crate2nix/default.nix b/crate2nix/templates/nix/crate2nix/default.nix index 1c5d38e3..2c313020 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -5,6 +5,9 @@ , lib , stdenv , buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate , defaultCrateOverrides , strictDeprecation ? true , crates ? { } @@ -162,7 +165,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -176,30 +179,30 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc else ( if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate + then buildRustCrateForPkgs else - buildRustCrate.override { + pkgs: (buildRustCrateForPkgs pkgs).override { defaultCrateOverrides = crateOverrides; } ); builtRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -214,14 +217,14 @@ rec { ) { inherit features crateOverrides runTests testCrateFlags testInputs; }; - /* Returns an attr set with packageId mapped to the result of buildRustCrateFunc + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc for the corresponding crate. */ builtRustCratesWithFeatures = { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -239,12 +242,17 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageId = packageId: buildByPackageIdImpl packageId; - # Memoize built packages so that reappearing packages are only built once. - builtByPackageId = - lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; - buildByPackageIdImpl = packageId: + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: let features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; @@ -256,14 +264,21 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -295,13 +310,13 @@ rec { dependenciesWithRenames; versionAndRename = dep: let - package = builtByPackageId."${dep.packageId}"; + package = crateConfigs."${dep.packageId}"; in { inherit (dep) rename; version = package.version; }; in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - buildRustCrateFunc + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -320,16 +335,15 @@ rec { } ); in - builtByPackageId; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = - { builtByPackageId + { buildByPackageId , features , dependencies , target }: - assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); assert (builtins.isAttrs target); @@ -337,7 +351,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; @@ -360,14 +374,14 @@ rec { debug = rec { # The built tree as passed to buildRustCrate. buildTree = buildRustCrateWithFeatures { - buildRustCrateFunc = lib.id; + buildRustCrateForPkgsFunc = _: lib.id; inherit packageId; }; sanitizedBuildTree = sanitizeForJson buildTree; dependencyTree = sanitizeForJson ( buildRustCrateWithFeatures { - buildRustCrateFunc = crate: { + buildRustCrateForPkgsFunc = _: crate: { "01_crateName" = crate.crateName or false; "02_features" = crate.features or [ ]; "03_dependencies" = crate.dependencies or [ ]; diff --git a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix index 18f594e1..2a8c8a7f 100644 --- a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix +++ b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix @@ -23,7 +23,7 @@ let ]; dependencyDerivations = features: dependencies: crate2nix.dependencyDerivations { - builtByPackageId = fakeCrates; + buildByPackageId = p: fakeCrates.${p}; target = crate2nix.defaultTarget; inherit features dependencies; }; diff --git a/sample_projects/bin_with_git_branch_dep/Cargo.nix b/sample_projects/bin_with_git_branch_dep/Cargo.nix index 99ad103e..df1bb555 100644 --- a/sample_projects/bin_with_git_branch_dep/Cargo.nix +++ b/sample_projects/bin_with_git_branch_dep/Cargo.nix @@ -7,7 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null # This is used as the `crateOverrides` argument for `buildRustCrate`. , defaultCrateOverrides ? pkgs.defaultCrateOverrides # The features to enable for the root_crate or the workspace_members. @@ -270,7 +274,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -284,30 +288,30 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc else ( if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate + then buildRustCrateForPkgs else - buildRustCrate.override { + pkgs: (buildRustCrateForPkgs pkgs).override { defaultCrateOverrides = crateOverrides; } ); builtRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -322,14 +326,14 @@ rec { ) { inherit features crateOverrides runTests testCrateFlags testInputs; }; - /* Returns an attr set with packageId mapped to the result of buildRustCrateFunc + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc for the corresponding crate. */ builtRustCratesWithFeatures = { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -347,12 +351,17 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageId = packageId: buildByPackageIdImpl packageId; - # Memoize built packages so that reappearing packages are only built once. - builtByPackageId = - lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; - buildByPackageIdImpl = packageId: + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: let features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; @@ -364,14 +373,21 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -403,13 +419,13 @@ rec { dependenciesWithRenames; versionAndRename = dep: let - package = builtByPackageId."${dep.packageId}"; + package = crateConfigs."${dep.packageId}"; in { inherit (dep) rename; version = package.version; }; in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - buildRustCrateFunc + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -428,16 +444,15 @@ rec { } ); in - builtByPackageId; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = - { builtByPackageId + { buildByPackageId , features , dependencies , target }: - assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); assert (builtins.isAttrs target); @@ -445,7 +460,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; @@ -468,14 +483,14 @@ rec { debug = rec { # The built tree as passed to buildRustCrate. buildTree = buildRustCrateWithFeatures { - buildRustCrateFunc = lib.id; + buildRustCrateForPkgsFunc = _: lib.id; inherit packageId; }; sanitizedBuildTree = sanitizeForJson buildTree; dependencyTree = sanitizeForJson ( buildRustCrateWithFeatures { - buildRustCrateFunc = crate: { + buildRustCrateForPkgsFunc = _: crate: { "01_crateName" = crate.crateName or false; "02_features" = crate.features or [ ]; "03_dependencies" = crate.dependencies or [ ]; diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index 8937c0be..30f357a7 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -7,7 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null # This is used as the `crateOverrides` argument for `buildRustCrate`. , defaultCrateOverrides ? pkgs.defaultCrateOverrides # The features to enable for the root_crate or the workspace_members. @@ -1443,7 +1447,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -1457,30 +1461,30 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc else ( if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate + then buildRustCrateForPkgs else - buildRustCrate.override { + pkgs: (buildRustCrateForPkgs pkgs).override { defaultCrateOverrides = crateOverrides; } ); builtRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -1495,14 +1499,14 @@ rec { ) { inherit features crateOverrides runTests testCrateFlags testInputs; }; - /* Returns an attr set with packageId mapped to the result of buildRustCrateFunc + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc for the corresponding crate. */ builtRustCratesWithFeatures = { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -1520,12 +1524,17 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageId = packageId: buildByPackageIdImpl packageId; - # Memoize built packages so that reappearing packages are only built once. - builtByPackageId = - lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; - buildByPackageIdImpl = packageId: + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: let features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; @@ -1537,14 +1546,21 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -1576,13 +1592,13 @@ rec { dependenciesWithRenames; versionAndRename = dep: let - package = builtByPackageId."${dep.packageId}"; + package = crateConfigs."${dep.packageId}"; in { inherit (dep) rename; version = package.version; }; in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - buildRustCrateFunc + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -1601,16 +1617,15 @@ rec { } ); in - builtByPackageId; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = - { builtByPackageId + { buildByPackageId , features , dependencies , target }: - assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); assert (builtins.isAttrs target); @@ -1618,7 +1633,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; @@ -1641,14 +1656,14 @@ rec { debug = rec { # The built tree as passed to buildRustCrate. buildTree = buildRustCrateWithFeatures { - buildRustCrateFunc = lib.id; + buildRustCrateForPkgsFunc = _: lib.id; inherit packageId; }; sanitizedBuildTree = sanitizeForJson buildTree; dependencyTree = sanitizeForJson ( buildRustCrateWithFeatures { - buildRustCrateFunc = crate: { + buildRustCrateForPkgsFunc = _: crate: { "01_crateName" = crate.crateName or false; "02_features" = crate.features or [ ]; "03_dependencies" = crate.dependencies or [ ]; diff --git a/sample_projects/bin_with_git_submodule_dep/default-with-customBuildRustCrateForPkgs.nix b/sample_projects/bin_with_git_submodule_dep/default-with-customBuildRustCrateForPkgs.nix new file mode 100644 index 00000000..94eb8293 --- /dev/null +++ b/sample_projects/bin_with_git_submodule_dep/default-with-customBuildRustCrateForPkgs.nix @@ -0,0 +1,18 @@ +{ pkgs ? import ../../nix/nixpkgs.nix { config = { }; } +, generatedCargoNix ? ./Cargo.nix +}: +let + customBuildRustCrateForPkgs = pkgs: pkgs.buildRustCrate.override { + defaultCrateOverrides = pkgs.defaultCrateOverrides // { + librocksdb-sys = attrs: with pkgs; { + src = attrs.src + "/librocksdb-sys"; + buildInputs = [ clang rocksdb ]; + LIBCLANG_PATH = "${clang.cc.lib}/lib"; + ROCKSDB_LIB_DIR = "${rocksdb}/lib/"; + }; + }; + }; + basePackage = pkgs.callPackage generatedCargoNix { buildRustCrateForPkgs = customBuildRustCrateForPkgs; }; + submodulePackage = basePackage.rootCrate.build; +in +submodulePackage diff --git a/sample_projects/codegen/Cargo.nix b/sample_projects/codegen/Cargo.nix index 6e859bbe..95b398b4 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -7,7 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null # This is used as the `crateOverrides` argument for `buildRustCrate`. , defaultCrateOverrides ? pkgs.defaultCrateOverrides # The features to enable for the root_crate or the workspace_members. @@ -622,7 +626,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -636,30 +640,30 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc else ( if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate + then buildRustCrateForPkgs else - buildRustCrate.override { + pkgs: (buildRustCrateForPkgs pkgs).override { defaultCrateOverrides = crateOverrides; } ); builtRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -674,14 +678,14 @@ rec { ) { inherit features crateOverrides runTests testCrateFlags testInputs; }; - /* Returns an attr set with packageId mapped to the result of buildRustCrateFunc + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc for the corresponding crate. */ builtRustCratesWithFeatures = { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -699,12 +703,17 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageId = packageId: buildByPackageIdImpl packageId; - # Memoize built packages so that reappearing packages are only built once. - builtByPackageId = - lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; - buildByPackageIdImpl = packageId: + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: let features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; @@ -716,14 +725,21 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -755,13 +771,13 @@ rec { dependenciesWithRenames; versionAndRename = dep: let - package = builtByPackageId."${dep.packageId}"; + package = crateConfigs."${dep.packageId}"; in { inherit (dep) rename; version = package.version; }; in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - buildRustCrateFunc + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -780,16 +796,15 @@ rec { } ); in - builtByPackageId; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = - { builtByPackageId + { buildByPackageId , features , dependencies , target }: - assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); assert (builtins.isAttrs target); @@ -797,7 +812,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; @@ -820,14 +835,14 @@ rec { debug = rec { # The built tree as passed to buildRustCrate. buildTree = buildRustCrateWithFeatures { - buildRustCrateFunc = lib.id; + buildRustCrateForPkgsFunc = _: lib.id; inherit packageId; }; sanitizedBuildTree = sanitizeForJson buildTree; dependencyTree = sanitizeForJson ( buildRustCrateWithFeatures { - buildRustCrateFunc = crate: { + buildRustCrateForPkgsFunc = _: crate: { "01_crateName" = crate.crateName or false; "02_features" = crate.features or [ ]; "03_dependencies" = crate.dependencies or [ ]; diff --git a/sample_projects/sub_dir_crates/Cargo.nix b/sample_projects/sub_dir_crates/Cargo.nix index 9d26e719..2c9ed2f3 100644 --- a/sample_projects/sub_dir_crates/Cargo.nix +++ b/sample_projects/sub_dir_crates/Cargo.nix @@ -7,7 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate +, buildRustCrateForPkgs ? if buildRustCrate != null + then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) + else pkgs: pkgs.buildRustCrate + # Deprecated +, buildRustCrate ? null # This is used as the `crateOverrides` argument for `buildRustCrate`. , defaultCrateOverrides ? pkgs.defaultCrateOverrides # The features to enable for the root_crate or the workspace_members. @@ -289,7 +293,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -303,30 +307,30 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc else ( if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate + then buildRustCrateForPkgs else - buildRustCrate.override { + pkgs: (buildRustCrateForPkgs pkgs).override { defaultCrateOverrides = crateOverrides; } ); builtRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -341,14 +345,14 @@ rec { ) { inherit features crateOverrides runTests testCrateFlags testInputs; }; - /* Returns an attr set with packageId mapped to the result of buildRustCrateFunc + /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc for the corresponding crate. */ builtRustCratesWithFeatures = { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -366,12 +370,17 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageId = packageId: buildByPackageIdImpl packageId; - # Memoize built packages so that reappearing packages are only built once. - builtByPackageId = - lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; - buildByPackageIdImpl = packageId: + builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; + mkBuiltByPackageIdByPkgs = pkgs: + let + self = { + crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; + build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; + }; + in + self; + buildByPackageIdForPkgsImpl = self: pkgs: packageId: let features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; @@ -383,14 +392,21 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + # proc_macro crates must be compiled for the build architecture + if crateConfigs.${depPackageId}.procMacro or false + then self.build.crates.${depPackageId} + else self.crates.${depPackageId}; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -422,13 +438,13 @@ rec { dependenciesWithRenames; versionAndRename = dep: let - package = builtByPackageId."${dep.packageId}"; + package = crateConfigs."${dep.packageId}"; in { inherit (dep) rename; version = package.version; }; in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - buildRustCrateFunc + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -447,16 +463,15 @@ rec { } ); in - builtByPackageId; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = - { builtByPackageId + { buildByPackageId , features , dependencies , target }: - assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); assert (builtins.isAttrs target); @@ -464,7 +479,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; @@ -487,14 +502,14 @@ rec { debug = rec { # The built tree as passed to buildRustCrate. buildTree = buildRustCrateWithFeatures { - buildRustCrateFunc = lib.id; + buildRustCrateForPkgsFunc = _: lib.id; inherit packageId; }; sanitizedBuildTree = sanitizeForJson buildTree; dependencyTree = sanitizeForJson ( buildRustCrateWithFeatures { - buildRustCrateFunc = crate: { + buildRustCrateForPkgsFunc = _: crate: { "01_crateName" = crate.crateName or false; "02_features" = crate.features or [ ]; "03_dependencies" = crate.dependencies or [ ]; diff --git a/tests.nix b/tests.nix index 4549781a..f93b35ed 100644 --- a/tests.nix +++ b/tests.nix @@ -273,6 +273,14 @@ let expectedOutput = "Hello world from with_git_submodule_dep!"; } + { + name = "bin_with_git_submodule_dep_customBuildRustCrateForPkgs"; + src = ./sample_projects/bin_with_git_submodule_dep; + pregeneratedBuild = "sample_projects/bin_with_git_submodule_dep/Cargo.nix"; + customBuild = "sample_projects/bin_with_git_submodule_dep/default-with-customBuildRustCrateForPkgs.nix"; + expectedOutput = "Hello world from with_git_submodule_dep!"; + } + { name = "cdylib"; src = ./sample_projects/cdylib;