From 8717c5db48d159d98a3cdd6be3559ef175281966 Mon Sep 17 00:00:00 2001 From: Peter Kolloch Date: Wed, 27 Nov 2019 20:16:11 +0100 Subject: [PATCH] Memoize buildRustCrate (see #42) --- crate2nix/Cargo.nix | 13 +++++++------ crate2nix/templates/nix/crate2nix/default.nix | 13 +++++++------ .../nix/crate2nix/tests/dependencyDerivations.nix | 8 ++++++-- sample_projects/bin_with_git_branch_dep/Cargo.nix | 13 +++++++------ .../bin_with_git_submodule_dep/Cargo.nix | 13 +++++++------ sample_projects/bin_with_lib_git_dep/Cargo.nix | 13 +++++++------ .../bin_with_rerenamed_lib_dep/Cargo.nix | 13 +++++++------ sample_projects/cfg-test/Cargo.nix | 13 +++++++------ sample_projects/numtest/Cargo.nix | 13 +++++++------ sample_projects/with_problematic_crates/Cargo.nix | 13 +++++++------ sample_workspace/Cargo.nix | 13 +++++++------ 11 files changed, 76 insertions(+), 62 deletions(-) diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index 81f8aa5a..9b826f9d 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -3077,13 +3077,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -3093,14 +3095,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/crate2nix/templates/nix/crate2nix/default.nix b/crate2nix/templates/nix/crate2nix/default.nix index 8d3ccde5..083d58b0 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -81,13 +81,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -97,14 +99,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix index a5861fc2..4e6755c5 100644 --- a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix +++ b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix @@ -1,6 +1,10 @@ {lib, crate2nix}: -let buildRustCrateFake = lib.id; +let fakeCrates = { + "pkg_id1" = "pkg_id1"; + "pkg_id2" = "pkg_id2"; + "pkg_id3" = "pkg_id3"; + }; fakeDependencies = [ { name = "id1"; @@ -18,7 +22,7 @@ let buildRustCrateFake = lib.id; } ]; dependencyDerivations = features: dependencies: - crate2nix.dependencyDerivations buildRustCrateFake features dependencies; + crate2nix.dependencyDerivations fakeCrates features dependencies; in lib.runTests { testForDefaultAndIgnored = { diff --git a/sample_projects/bin_with_git_branch_dep/Cargo.nix b/sample_projects/bin_with_git_branch_dep/Cargo.nix index 05eef3cd..437c9bac 100644 --- a/sample_projects/bin_with_git_branch_dep/Cargo.nix +++ b/sample_projects/bin_with_git_branch_dep/Cargo.nix @@ -3073,13 +3073,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -3089,14 +3091,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index d352c8b0..3a79264b 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -1418,13 +1418,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -1434,14 +1436,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_projects/bin_with_lib_git_dep/Cargo.nix b/sample_projects/bin_with_lib_git_dep/Cargo.nix index 277cebb4..bfa2d8c3 100644 --- a/sample_projects/bin_with_lib_git_dep/Cargo.nix +++ b/sample_projects/bin_with_lib_git_dep/Cargo.nix @@ -3073,13 +3073,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -3089,14 +3091,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_projects/bin_with_rerenamed_lib_dep/Cargo.nix b/sample_projects/bin_with_rerenamed_lib_dep/Cargo.nix index 16eced0b..bd0214df 100644 --- a/sample_projects/bin_with_rerenamed_lib_dep/Cargo.nix +++ b/sample_projects/bin_with_rerenamed_lib_dep/Cargo.nix @@ -179,13 +179,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -195,14 +197,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_projects/cfg-test/Cargo.nix b/sample_projects/cfg-test/Cargo.nix index 4c917555..489c3b35 100644 --- a/sample_projects/cfg-test/Cargo.nix +++ b/sample_projects/cfg-test/Cargo.nix @@ -420,13 +420,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -436,14 +438,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_projects/numtest/Cargo.nix b/sample_projects/numtest/Cargo.nix index f52c16d6..0a4a92f0 100644 --- a/sample_projects/numtest/Cargo.nix +++ b/sample_projects/numtest/Cargo.nix @@ -410,13 +410,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -426,14 +428,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_projects/with_problematic_crates/Cargo.nix b/sample_projects/with_problematic_crates/Cargo.nix index 943b99ac..799a7e19 100644 --- a/sample_projects/with_problematic_crates/Cargo.nix +++ b/sample_projects/with_problematic_crates/Cargo.nix @@ -6942,13 +6942,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -6958,14 +6960,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features. diff --git a/sample_workspace/Cargo.nix b/sample_workspace/Cargo.nix index 197e16cc..b77aec40 100644 --- a/sample_workspace/Cargo.nix +++ b/sample_workspace/Cargo.nix @@ -1806,13 +1806,15 @@ rec { assert (builtins.isList features); let mergedFeatures = mergePackageFeatures args; + builtByPackageId = + lib.mapAttrs (packageId: value: buildByPackageId packageId) crateConfigs; buildByPackageId = packageId: let features = mergedFeatures."${packageId}" or []; crateConfig = lib.filterAttrs (n: v: n != "resolvedDefaultFeatures") crateConfigs."${packageId}"; dependencies = - dependencyDerivations buildByPackageId features (crateConfig.dependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.dependencies or []); buildDependencies = - dependencyDerivations buildByPackageId features (crateConfig.buildDependencies or []); + dependencyDerivations builtByPackageId features (crateConfig.buildDependencies or []); dependenciesWithRenames = lib.filter (d: d ? "rename") (crateConfig.buildDependencies or [] ++ crateConfig.dependencies or []); @@ -1822,14 +1824,13 @@ rec { in buildByPackageId packageId; /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = buildByPackageId: features: dependencies: - assert (builtins.isFunction buildByPackageId); + dependencyDerivations = builtByPackageId: features: dependencies: + assert (builtins.isAttrs builtByPackageId); assert (builtins.isList features); assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies dependencies features; - depDerivation = dependency: - buildByPackageId dependency.packageId; + depDerivation = dependency: builtByPackageId.${dependency.packageId}; in map depDerivation enabledDependencies; /* Returns differences between cargo default features and crate2nix default features.