fix: restore Cargo.nix mods
This commit is contained in:
@@ -8872,7 +8872,15 @@ rec {
|
||||
)
|
||||
crateConfigs;
|
||||
target = makeTarget pkgs.stdenv.hostPlatform;
|
||||
build = mkBuiltByPackageIdByPkgs pkgs.buildPackages;
|
||||
# Build-time dependency graph (for proc-macros and build
|
||||
# dependencies). When not cross-compiling it equals the host
|
||||
# graph, so reuse `self`; otherwise build it for
|
||||
# `pkgs.buildPackages`.
|
||||
build =
|
||||
if pkgs.stdenv.buildPlatform.config == pkgs.stdenv.hostPlatform.config then
|
||||
self
|
||||
else
|
||||
mkBuiltByPackageIdByPkgs pkgs.buildPackages;
|
||||
};
|
||||
in
|
||||
self;
|
||||
@@ -8888,38 +8896,35 @@ rec {
|
||||
devDependencies = lib.optionals (runTests && packageId == rootPackageId) (
|
||||
crateConfig'.devDependencies or [ ]
|
||||
);
|
||||
dependencies = dependencyDerivations {
|
||||
# Enabled (platform- and feature-filtered) dependency lists, reused
|
||||
# for both derivation wiring and the crate renames below.
|
||||
enabledDependencies = filterEnabledDependencies {
|
||||
inherit features;
|
||||
inherit (self) 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 {
|
||||
enabledBuildDependencies = filterEnabledDependencies {
|
||||
inherit features;
|
||||
inherit (self.build) target;
|
||||
buildByPackageId = depPackageId: self.build.crates.${depPackageId};
|
||||
dependencies = crateConfig.buildDependencies or [ ];
|
||||
};
|
||||
dependencies = map
|
||||
(
|
||||
dependency:
|
||||
# proc_macro crates must be compiled for the build architecture
|
||||
if crateConfigs.${dependency.packageId}.procMacro or false then
|
||||
self.build.crates.${dependency.packageId}
|
||||
else
|
||||
self.crates.${dependency.packageId}
|
||||
)
|
||||
enabledDependencies;
|
||||
buildDependencies = map
|
||||
(dependency: self.build.crates.${dependency.packageId})
|
||||
enabledBuildDependencies;
|
||||
# Order (build dependencies, then normal dependencies) feeds the
|
||||
# crateRenames grouping below.
|
||||
dependenciesWithRenames =
|
||||
let
|
||||
buildDeps = filterEnabledDependencies {
|
||||
inherit features;
|
||||
inherit (self) target;
|
||||
dependencies = crateConfig.dependencies or [ ] ++ devDependencies;
|
||||
};
|
||||
hostDeps = filterEnabledDependencies {
|
||||
inherit features;
|
||||
inherit (self.build) target;
|
||||
dependencies = crateConfig.buildDependencies or [ ];
|
||||
};
|
||||
in
|
||||
lib.filter (d: d ? "rename") (hostDeps ++ buildDeps);
|
||||
lib.filter (d: d ? "rename") (enabledBuildDependencies ++ enabledDependencies);
|
||||
# Crate renames have the form:
|
||||
#
|
||||
# {
|
||||
@@ -9091,6 +9096,17 @@ rec {
|
||||
corresponding feature sets are merged. Features in rust are additive.
|
||||
*/
|
||||
mergePackageFeatures =
|
||||
args: builtins.mapAttrs (_packageId: builtins.attrNames) (mergePackageFeaturesImpl args);
|
||||
|
||||
/*
|
||||
Core of the feature-resolution fixpoint. The cache (`featuresByPackageId`)
|
||||
maps each packageId to a feature *set* (an attrset `feature -> 1`) rather
|
||||
than a sorted list, so the fold merges with `//` and detects convergence
|
||||
with attrset equality instead of re-concatenating and re-sorting the
|
||||
accumulated feature list on every step. `mergePackageFeatures` projects the
|
||||
result back to canonical sorted lists.
|
||||
*/
|
||||
mergePackageFeaturesImpl =
|
||||
{ crateConfigs ? crates
|
||||
, packageId
|
||||
, rootPackageId ? packageId
|
||||
@@ -9139,14 +9155,15 @@ rec {
|
||||
cache:
|
||||
{ packageId, features }:
|
||||
let
|
||||
cacheFeatures = cache.${packageId} or [ ];
|
||||
combinedFeatures = sortedUnique (cacheFeatures ++ features);
|
||||
cacheFeatures = cache.${packageId} or { };
|
||||
# `features` is the (small) incoming list; merge it into the set.
|
||||
combinedFeatures = cacheFeatures // listToSet features;
|
||||
in
|
||||
if cache ? ${packageId} && cache.${packageId} == combinedFeatures then
|
||||
if cache ? ${packageId} && cacheFeatures == combinedFeatures then
|
||||
cache
|
||||
else
|
||||
mergePackageFeatures {
|
||||
features = combinedFeatures;
|
||||
mergePackageFeaturesImpl {
|
||||
features = builtins.attrNames combinedFeatures;
|
||||
featuresByPackageId = cache;
|
||||
inherit
|
||||
crateConfigs
|
||||
@@ -9159,8 +9176,8 @@ rec {
|
||||
);
|
||||
cacheWithSelf =
|
||||
let
|
||||
cacheFeatures = featuresByPackageId.${packageId} or [ ];
|
||||
combinedFeatures = sortedUnique (cacheFeatures ++ enabledFeatures);
|
||||
cacheFeatures = featuresByPackageId.${packageId} or { };
|
||||
combinedFeatures = cacheFeatures // listToSet enabledFeatures;
|
||||
in
|
||||
featuresByPackageId
|
||||
// {
|
||||
@@ -9187,27 +9204,31 @@ rec {
|
||||
assert (builtins.isList features);
|
||||
assert (builtins.isAttrs target);
|
||||
|
||||
let
|
||||
# Identical for every dep in this call; build the predicate arg once.
|
||||
targetArgs = { inherit features target; };
|
||||
in
|
||||
lib.filter
|
||||
(
|
||||
dep:
|
||||
let
|
||||
targetFunc = dep.target or (features: true);
|
||||
in
|
||||
targetFunc { inherit features target; }
|
||||
(dep.target or (features: true)) targetArgs
|
||||
&& (!(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features)
|
||||
)
|
||||
dependencies;
|
||||
|
||||
# Returns whether the given feature should enable the given dependency.
|
||||
doesFeatureEnableDependency =
|
||||
dependency: feature:
|
||||
dependency:
|
||||
# Callers partially apply this once per dependency, then test every feature,
|
||||
# so hoist the dep-invariant strings out of the per-feature comparison.
|
||||
let
|
||||
name = dependency.rename or dependency.name;
|
||||
depName = "dep:" + name;
|
||||
prefix = "${name}/";
|
||||
len = builtins.stringLength prefix;
|
||||
startsWithPrefix = builtins.substring 0 len feature == prefix;
|
||||
in
|
||||
feature == name || feature == "dep:" + name || startsWithPrefix;
|
||||
feature:
|
||||
feature == name || feature == depName || builtins.substring 0 len feature == prefix;
|
||||
|
||||
/*
|
||||
Returns the expanded features for the given inputFeatures by applying the
|
||||
@@ -9221,29 +9242,24 @@ rec {
|
||||
assert (builtins.isAttrs featureMap);
|
||||
assert (builtins.isList inputFeatures);
|
||||
let
|
||||
# Transitive closure of `inputFeatures` under `featureMap`. `seen`
|
||||
# tracks already-expanded features so each is visited at most once;
|
||||
# this also breaks feature cycles (issue #209).
|
||||
expandFeaturesNoCycle =
|
||||
oldSeen: inputFeatures:
|
||||
if inputFeatures != [ ] then
|
||||
let
|
||||
# The feature we're currently expanding.
|
||||
feature = builtins.head inputFeatures;
|
||||
# All the features we've seen/expanded so far, including the one
|
||||
# we're currently processing.
|
||||
seen = oldSeen // {
|
||||
${feature} = 1;
|
||||
};
|
||||
# Expand the feature but be careful to not re-introduce a feature
|
||||
# that we've already seen: this can easily cause a cycle, see issue
|
||||
# #209.
|
||||
enables = builtins.filter (f: !(seen ? "${f}")) (featureMap."${feature}" or [ ]);
|
||||
in
|
||||
[ feature ] ++ (expandFeaturesNoCycle seen (builtins.tail inputFeatures ++ enables))
|
||||
# No more features left, nothing to expand to.
|
||||
else
|
||||
[ ];
|
||||
outFeatures = expandFeaturesNoCycle { } inputFeatures;
|
||||
seen: features:
|
||||
builtins.foldl'
|
||||
(
|
||||
acc: feature:
|
||||
if acc ? ${feature} then
|
||||
acc
|
||||
else
|
||||
expandFeaturesNoCycle (acc // { ${feature} = 1; }) (featureMap.${feature} or [ ])
|
||||
)
|
||||
seen
|
||||
features;
|
||||
seen = expandFeaturesNoCycle { } inputFeatures;
|
||||
in
|
||||
sortedUnique outFeatures;
|
||||
sortedUnique (builtins.attrNames seen);
|
||||
|
||||
/*
|
||||
This function adds optional dependencies as features if they are enabled
|
||||
@@ -9302,16 +9318,19 @@ rec {
|
||||
in
|
||||
defaultOrNil ++ explicitFeatures ++ additionalDependencyFeatures;
|
||||
|
||||
# Builds a feature set (attrset `feature -> 1`) from a list of feature names.
|
||||
listToSet =
|
||||
features:
|
||||
builtins.listToAttrs (map (feature: { name = feature; value = 1; }) features);
|
||||
|
||||
# Sorts and removes duplicates from a list of strings.
|
||||
sortedUnique =
|
||||
features:
|
||||
assert (builtins.isList features);
|
||||
assert (builtins.all builtins.isString features);
|
||||
let
|
||||
outFeaturesSet = lib.foldl (set: feature: set // { "${feature}" = 1; }) { } features;
|
||||
outFeaturesUnique = builtins.attrNames outFeaturesSet;
|
||||
in
|
||||
builtins.sort (a: b: a < b) outFeaturesUnique;
|
||||
# attrNames returns keys in ascending string order, so the result is
|
||||
# sorted and deduplicated. The feature-merge fixpoint relies on this
|
||||
# canonical order to detect convergence.
|
||||
builtins.attrNames (listToSet features);
|
||||
|
||||
deprecationWarning =
|
||||
message: value:
|
||||
|
||||
Reference in New Issue
Block a user