From 88501d4b16e436484c360ea0458f187e47e80c39 Mon Sep 17 00:00:00 2001 From: Ben Wolsieffer Date: Mon, 28 Sep 2020 20:09:50 -0400 Subject: [PATCH 1/2] Add support for cross-compilation --- crate2nix/Cargo.nix | 54 ++++++++----------- crate2nix/templates/Cargo.nix.tera | 1 - crate2nix/templates/nix/crate2nix/default.nix | 54 ++++++++----------- .../crate2nix/tests/dependencyDerivations.nix | 6 +-- .../bin_with_git_branch_dep/Cargo.nix | 54 ++++++++----------- .../bin_with_git_submodule_dep/Cargo.nix | 54 ++++++++----------- sample_projects/codegen/Cargo.nix | 54 ++++++++----------- sample_projects/sub_dir_crates/Cargo.nix | 54 ++++++++----------- 8 files changed, 129 insertions(+), 202 deletions(-) diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index 02a40165..d560b3d3 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -7,7 +7,6 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate # 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 +2290,6 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -2305,26 +2303,18 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate - else - buildRustCrate.override { - defaultCrateOverrides = crateOverrides; - } - ); + buildRustCrateOverrides = + if crateOverrides == pkgs.defaultCrateOverrides + then { } + else { + defaultCrateOverrides = crateOverrides; + }; builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = true; }; drv = builtRustCrates.${packageId}; @@ -2350,7 +2340,7 @@ rec { { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateOverrides , runTests , target ? defaultTarget } @ args: @@ -2368,13 +2358,10 @@ 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: + buildByPackageIdForPkgs = pkgs: packageId: let + # proc_macro crates must be compiled for the build architecture + cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -2385,14 +2372,16 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -2424,13 +2413,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 + cratePkgs.buildRustCrate.override buildRustCrateOverrides ( crateConfig // { src = crateConfig.src or ( @@ -2449,16 +2438,15 @@ rec { } ); in - builtByPackageId; + lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; /* 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 +2454,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; diff --git a/crate2nix/templates/Cargo.nix.tera b/crate2nix/templates/Cargo.nix.tera index fcc95a7b..a206d9a7 100644 --- a/crate2nix/templates/Cargo.nix.tera +++ b/crate2nix/templates/Cargo.nix.tera @@ -9,7 +9,6 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate # 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..54beab55 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -4,7 +4,6 @@ { pkgs , lib , stdenv -, buildRustCrate , defaultCrateOverrides , strictDeprecation ? true , crates ? { } @@ -162,7 +161,6 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -176,26 +174,18 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate - else - buildRustCrate.override { - defaultCrateOverrides = crateOverrides; - } - ); + buildRustCrateOverrides = + if crateOverrides == pkgs.defaultCrateOverrides + then { } + else { + defaultCrateOverrides = crateOverrides; + }; builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = true; }; drv = builtRustCrates.${packageId}; @@ -221,7 +211,7 @@ rec { { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateOverrides , runTests , target ? defaultTarget } @ args: @@ -239,13 +229,10 @@ 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: + buildByPackageIdForPkgs = pkgs: packageId: let + # proc_macro crates must be compiled for the build architecture + cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -256,14 +243,16 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -295,13 +284,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 + cratePkgs.buildRustCrate.override buildRustCrateOverrides ( crateConfig // { src = crateConfig.src or ( @@ -320,16 +309,15 @@ rec { } ); in - builtByPackageId; + lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; /* 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 +325,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; diff --git a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix index 18f594e1..84b582f5 100644 --- a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix +++ b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix @@ -1,10 +1,10 @@ { lib, crate2nix }: let - fakeCrates = { + fakeCrates = packageId: { "pkg_id1" = "pkg_id1"; "pkg_id2" = "pkg_id2"; "pkg_id3" = "pkg_id3"; - }; + }.${packageId}; fakeDependencies = [ { name = "id1"; @@ -23,7 +23,7 @@ let ]; dependencyDerivations = features: dependencies: crate2nix.dependencyDerivations { - builtByPackageId = fakeCrates; + buildByPackageId = fakeCrates; 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..881f0da5 100644 --- a/sample_projects/bin_with_git_branch_dep/Cargo.nix +++ b/sample_projects/bin_with_git_branch_dep/Cargo.nix @@ -7,7 +7,6 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate # 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 +269,6 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -284,26 +282,18 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate - else - buildRustCrate.override { - defaultCrateOverrides = crateOverrides; - } - ); + buildRustCrateOverrides = + if crateOverrides == pkgs.defaultCrateOverrides + then { } + else { + defaultCrateOverrides = crateOverrides; + }; builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = true; }; drv = builtRustCrates.${packageId}; @@ -329,7 +319,7 @@ rec { { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateOverrides , runTests , target ? defaultTarget } @ args: @@ -347,13 +337,10 @@ 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: + buildByPackageIdForPkgs = pkgs: packageId: let + # proc_macro crates must be compiled for the build architecture + cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -364,14 +351,16 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -403,13 +392,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 + cratePkgs.buildRustCrate.override buildRustCrateOverrides ( crateConfig // { src = crateConfig.src or ( @@ -428,16 +417,15 @@ rec { } ); in - builtByPackageId; + lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; /* 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 +433,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index 8937c0be..abeafc75 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -7,7 +7,6 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate # 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 +1442,6 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -1457,26 +1455,18 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate - else - buildRustCrate.override { - defaultCrateOverrides = crateOverrides; - } - ); + buildRustCrateOverrides = + if crateOverrides == pkgs.defaultCrateOverrides + then { } + else { + defaultCrateOverrides = crateOverrides; + }; builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = true; }; drv = builtRustCrates.${packageId}; @@ -1502,7 +1492,7 @@ rec { { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateOverrides , runTests , target ? defaultTarget } @ args: @@ -1520,13 +1510,10 @@ 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: + buildByPackageIdForPkgs = pkgs: packageId: let + # proc_macro crates must be compiled for the build architecture + cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -1537,14 +1524,16 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -1576,13 +1565,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 + cratePkgs.buildRustCrate.override buildRustCrateOverrides ( crateConfig // { src = crateConfig.src or ( @@ -1601,16 +1590,15 @@ rec { } ); in - builtByPackageId; + lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; /* 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 +1606,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; diff --git a/sample_projects/codegen/Cargo.nix b/sample_projects/codegen/Cargo.nix index 6e859bbe..13de7e42 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -7,7 +7,6 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate # 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 +621,6 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -636,26 +634,18 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate - else - buildRustCrate.override { - defaultCrateOverrides = crateOverrides; - } - ); + buildRustCrateOverrides = + if crateOverrides == pkgs.defaultCrateOverrides + then { } + else { + defaultCrateOverrides = crateOverrides; + }; builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = true; }; drv = builtRustCrates.${packageId}; @@ -681,7 +671,7 @@ rec { { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateOverrides , runTests , target ? defaultTarget } @ args: @@ -699,13 +689,10 @@ 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: + buildByPackageIdForPkgs = pkgs: packageId: let + # proc_macro crates must be compiled for the build architecture + cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -716,14 +703,16 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -755,13 +744,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 + cratePkgs.buildRustCrate.override buildRustCrateOverrides ( crateConfig // { src = crateConfig.src or ( @@ -780,16 +769,15 @@ rec { } ); in - builtByPackageId; + lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; /* 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 +785,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; diff --git a/sample_projects/sub_dir_crates/Cargo.nix b/sample_projects/sub_dir_crates/Cargo.nix index 9d26e719..c49ab99f 100644 --- a/sample_projects/sub_dir_crates/Cargo.nix +++ b/sample_projects/sub_dir_crates/Cargo.nix @@ -7,7 +7,6 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv -, buildRustCrate ? pkgs.buildRustCrate # 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 +288,6 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides - , buildRustCrateFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -303,26 +301,18 @@ rec { , testInputs }: let - buildRustCrateFuncOverriden = - if buildRustCrateFunc != null - then buildRustCrateFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrate - else - buildRustCrate.override { - defaultCrateOverrides = crateOverrides; - } - ); + buildRustCrateOverrides = + if crateOverrides == pkgs.defaultCrateOverrides + then { } + else { + defaultCrateOverrides = crateOverrides; + }; builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateFunc = buildRustCrateFuncOverriden; + inherit packageId features buildRustCrateOverrides; runTests = true; }; drv = builtRustCrates.${packageId}; @@ -348,7 +338,7 @@ rec { { packageId , features , crateConfigs ? crates - , buildRustCrateFunc + , buildRustCrateOverrides , runTests , target ? defaultTarget } @ args: @@ -366,13 +356,10 @@ 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: + buildByPackageIdForPkgs = pkgs: packageId: let + # proc_macro crates must be compiled for the build architecture + cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -383,14 +370,16 @@ rec { (crateConfig'.devDependencies or [ ]); dependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs; dependencies = (crateConfig.dependencies or [ ]) ++ devDependencies; }; buildDependencies = dependencyDerivations { - inherit builtByPackageId features target; + inherit features target; + buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -422,13 +411,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 + cratePkgs.buildRustCrate.override buildRustCrateOverrides ( crateConfig // { src = crateConfig.src or ( @@ -447,16 +436,15 @@ rec { } ); in - builtByPackageId; + lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; /* 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 +452,7 @@ rec { enabledDependencies = filterEnabledDependencies { inherit dependencies features target; }; - depDerivation = dependency: builtByPackageId.${dependency.packageId}; + depDerivation = dependency: buildByPackageId dependency.packageId; in map depDerivation enabledDependencies; From c8195739d2a8ab96faa92954e4f6781a9ba4700b Mon Sep 17 00:00:00 2001 From: John Ericson Date: Mon, 4 Jan 2021 16:56:35 +0000 Subject: [PATCH 2/2] Memo again + back compat with cross Add test for new way to replace `buildRustCrate` while also testing the old way. --- crate2nix/Cargo.nix | 69 +++++++++++++------ crate2nix/templates/Cargo.nix.tera | 5 ++ crate2nix/templates/nix/crate2nix/default.nix | 68 ++++++++++++------ .../crate2nix/tests/dependencyDerivations.nix | 6 +- .../bin_with_git_branch_dep/Cargo.nix | 69 +++++++++++++------ .../bin_with_git_submodule_dep/Cargo.nix | 69 +++++++++++++------ ...fault-with-customBuildRustCrateForPkgs.nix | 18 +++++ sample_projects/codegen/Cargo.nix | 69 +++++++++++++------ sample_projects/sub_dir_crates/Cargo.nix | 69 +++++++++++++------ tests.nix | 8 +++ 10 files changed, 321 insertions(+), 129 deletions(-) create mode 100644 sample_projects/bin_with_git_submodule_dep/default-with-customBuildRustCrateForPkgs.nix diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index d560b3d3..bdfe0f92 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -7,6 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv +, 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. @@ -2290,6 +2295,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -2303,22 +2309,30 @@ rec { , testInputs }: let - buildRustCrateOverrides = - if crateOverrides == pkgs.defaultCrateOverrides - then { } - else { - defaultCrateOverrides = crateOverrides; - }; + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -2333,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 - , buildRustCrateOverrides + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -2358,10 +2372,18 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageIdForPkgs = pkgs: packageId: + # Memoize built packages so that reappearing packages are only built once. + 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 - # proc_macro crates must be compiled for the build architecture - cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -2373,7 +2395,11 @@ rec { dependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs; + 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; @@ -2381,7 +2407,8 @@ rec { buildDependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -2419,7 +2446,7 @@ rec { in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - cratePkgs.buildRustCrate.override buildRustCrateOverrides + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -2438,7 +2465,7 @@ rec { } ); in - lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = @@ -2477,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 a206d9a7..81f4019c 100644 --- a/crate2nix/templates/Cargo.nix.tera +++ b/crate2nix/templates/Cargo.nix.tera @@ -9,6 +9,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv +, 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 54beab55..2c313020 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -4,6 +4,10 @@ { pkgs , 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 ? { } @@ -161,6 +165,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -174,22 +179,30 @@ rec { , testInputs }: let - buildRustCrateOverrides = - if crateOverrides == pkgs.defaultCrateOverrides - then { } - else { - defaultCrateOverrides = crateOverrides; - }; + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -204,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 - , buildRustCrateOverrides + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -229,10 +242,18 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageIdForPkgs = pkgs: packageId: + # Memoize built packages so that reappearing packages are only built once. + 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 - # proc_macro crates must be compiled for the build architecture - cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -244,7 +265,11 @@ rec { dependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs; + 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; @@ -252,7 +277,8 @@ rec { buildDependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -290,7 +316,7 @@ rec { in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - cratePkgs.buildRustCrate.override buildRustCrateOverrides + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -309,7 +335,7 @@ rec { } ); in - lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = @@ -348,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 84b582f5..2a8c8a7f 100644 --- a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix +++ b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix @@ -1,10 +1,10 @@ { lib, crate2nix }: let - fakeCrates = packageId: { + fakeCrates = { "pkg_id1" = "pkg_id1"; "pkg_id2" = "pkg_id2"; "pkg_id3" = "pkg_id3"; - }.${packageId}; + }; fakeDependencies = [ { name = "id1"; @@ -23,7 +23,7 @@ let ]; dependencyDerivations = features: dependencies: crate2nix.dependencyDerivations { - buildByPackageId = 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 881f0da5..df1bb555 100644 --- a/sample_projects/bin_with_git_branch_dep/Cargo.nix +++ b/sample_projects/bin_with_git_branch_dep/Cargo.nix @@ -7,6 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv +, 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. @@ -269,6 +274,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -282,22 +288,30 @@ rec { , testInputs }: let - buildRustCrateOverrides = - if crateOverrides == pkgs.defaultCrateOverrides - then { } - else { - defaultCrateOverrides = crateOverrides; - }; + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -312,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 - , buildRustCrateOverrides + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -337,10 +351,18 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageIdForPkgs = pkgs: packageId: + # Memoize built packages so that reappearing packages are only built once. + 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 - # proc_macro crates must be compiled for the build architecture - cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -352,7 +374,11 @@ rec { dependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs; + 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; @@ -360,7 +386,8 @@ rec { buildDependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -398,7 +425,7 @@ rec { in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - cratePkgs.buildRustCrate.override buildRustCrateOverrides + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -417,7 +444,7 @@ rec { } ); in - lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = @@ -456,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 abeafc75..30f357a7 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -7,6 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv +, 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. @@ -1442,6 +1447,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -1455,22 +1461,30 @@ rec { , testInputs }: let - buildRustCrateOverrides = - if crateOverrides == pkgs.defaultCrateOverrides - then { } - else { - defaultCrateOverrides = crateOverrides; - }; + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -1485,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 - , buildRustCrateOverrides + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -1510,10 +1524,18 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageIdForPkgs = pkgs: packageId: + # Memoize built packages so that reappearing packages are only built once. + 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 - # proc_macro crates must be compiled for the build architecture - cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -1525,7 +1547,11 @@ rec { dependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs; + 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; @@ -1533,7 +1559,8 @@ rec { buildDependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -1571,7 +1598,7 @@ rec { in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - cratePkgs.buildRustCrate.override buildRustCrateOverrides + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -1590,7 +1617,7 @@ rec { } ); in - lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = @@ -1629,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 13de7e42..95b398b4 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -7,6 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv +, 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. @@ -621,6 +626,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -634,22 +640,30 @@ rec { , testInputs }: let - buildRustCrateOverrides = - if crateOverrides == pkgs.defaultCrateOverrides - then { } - else { - defaultCrateOverrides = crateOverrides; - }; + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -664,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 - , buildRustCrateOverrides + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -689,10 +703,18 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageIdForPkgs = pkgs: packageId: + # Memoize built packages so that reappearing packages are only built once. + 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 - # proc_macro crates must be compiled for the build architecture - cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -704,7 +726,11 @@ rec { dependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs; + 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; @@ -712,7 +738,8 @@ rec { buildDependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -750,7 +777,7 @@ rec { in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - cratePkgs.buildRustCrate.override buildRustCrateOverrides + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -769,7 +796,7 @@ rec { } ); in - lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = @@ -808,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 c49ab99f..2c9ed2f3 100644 --- a/sample_projects/sub_dir_crates/Cargo.nix +++ b/sample_projects/sub_dir_crates/Cargo.nix @@ -7,6 +7,11 @@ , pkgs ? import nixpkgs { config = {}; } , lib ? pkgs.lib , stdenv ? pkgs.stdenv +, 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. @@ -288,6 +293,7 @@ rec { { packageId , features ? rootFeatures , crateOverrides ? defaultCrateOverrides + , buildRustCrateForPkgsFunc ? null , runTests ? false , testCrateFlags ? [ ] , testInputs ? [ ] @@ -301,22 +307,30 @@ rec { , testInputs }: let - buildRustCrateOverrides = - if crateOverrides == pkgs.defaultCrateOverrides - then { } - else { - defaultCrateOverrides = crateOverrides; - }; + buildRustCrateForPkgsFuncOverriden = + if buildRustCrateForPkgsFunc != null + then buildRustCrateForPkgsFunc + else + ( + if crateOverrides == pkgs.defaultCrateOverrides + then buildRustCrateForPkgs + else + pkgs: (buildRustCrateForPkgs pkgs).override { + defaultCrateOverrides = crateOverrides; + } + ); builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = false; }; builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features buildRustCrateOverrides; + inherit packageId features; + buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; runTests = true; }; - drv = builtRustCrates.${packageId}; - testDrv = builtTestRustCrates.${packageId}; + drv = builtRustCrates.crates.${packageId}; + testDrv = builtTestRustCrates.crates.${packageId}; derivation = if runTests then crateWithTest @@ -331,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 - , buildRustCrateOverrides + , buildRustCrateForPkgsFunc , runTests , target ? defaultTarget } @ args: @@ -356,10 +370,18 @@ rec { target = target // { test = runTests; }; } ); - buildByPackageIdForPkgs = pkgs: packageId: + # Memoize built packages so that reappearing packages are only built once. + 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 - # proc_macro crates must be compiled for the build architecture - cratePkgs = if crateConfig.procMacro or false then pkgs.buildPackages else pkgs; features = mergedFeatures."${packageId}" or [ ]; crateConfig' = crateConfigs."${packageId}"; crateConfig = @@ -371,7 +393,11 @@ rec { dependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs; + 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; @@ -379,7 +405,8 @@ rec { buildDependencies = dependencyDerivations { inherit features target; - buildByPackageId = buildByPackageIdForPkgs cratePkgs.buildPackages; + buildByPackageId = depPackageId: + self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { @@ -417,7 +444,7 @@ rec { in lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; in - cratePkgs.buildRustCrate.override buildRustCrateOverrides + buildRustCrateForPkgsFunc pkgs ( crateConfig // { src = crateConfig.src or ( @@ -436,7 +463,7 @@ rec { } ); in - lib.mapAttrs (packageId: value: buildByPackageIdForPkgs pkgs packageId) crateConfigs; + builtByPackageIdByPkgs; /* Returns the actual derivations for the given dependencies. */ dependencyDerivations = @@ -475,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;