Skip to content

Commit 953a630

Browse files
committed
Auto merge of #11184 - weihanglo:features2-refactor, r=ehuss
refactor: New variant `FeaturesFor::ArtifactDep`
2 parents 3516206 + cc204e8 commit 953a630

File tree

4 files changed

+25
-31
lines changed

4 files changed

+25
-31
lines changed

Diff for: src/cargo/core/compiler/standard_lib.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,7 @@ pub fn generate_std_roots(
193193
// in time is minimal, and the difference in caching is
194194
// significant.
195195
let mode = CompileMode::Build;
196-
let features = std_features.activated_features(
197-
pkg.package_id(),
198-
FeaturesFor::NormalOrDevOrArtifactTarget(None),
199-
);
196+
let features = std_features.activated_features(pkg.package_id(), FeaturesFor::NormalOrDev);
200197
for kind in kinds {
201198
let list = ret.entry(*kind).or_insert_with(Vec::new);
202199
let unit_for = UnitFor::new_normal(*kind);

Diff for: src/cargo/core/resolver/features.rs

+21-24
Original file line numberDiff line numberDiff line change
@@ -102,30 +102,29 @@ pub enum ForceAllTargets {
102102
No,
103103
}
104104

105-
/// Flag to indicate if features are requested for a build dependency or not.
106-
#[derive(Copy, Clone, Debug, PartialEq, Eq, Ord, PartialOrd, Hash)]
105+
/// Flag to indicate if features are requested for a certain type of dependency.
106+
///
107+
/// This is primarily used for constructing a [`PackageFeaturesKey`] to decouple
108+
/// activated features of the same package with different types of dependency.
109+
#[derive(Default, Copy, Clone, Debug, PartialEq, Eq, Ord, PartialOrd, Hash)]
107110
pub enum FeaturesFor {
108-
/// If `Some(target)` is present, we represent an artifact target.
109-
/// Otherwise any other normal or dev dependency.
110-
NormalOrDevOrArtifactTarget(Option<CompileTarget>),
111+
/// Normal or dev dependency.
112+
#[default]
113+
NormalOrDev,
111114
/// Build dependency or proc-macro.
112115
HostDep,
113-
}
114-
115-
impl Default for FeaturesFor {
116-
fn default() -> Self {
117-
FeaturesFor::NormalOrDevOrArtifactTarget(None)
118-
}
116+
/// Any dependency with both artifact and target specified.
117+
///
118+
/// That is, `dep = { …, artifact = <crate-type>, target = <triple> }`
119+
ArtifactDep(CompileTarget),
119120
}
120121

121122
impl std::fmt::Display for FeaturesFor {
122123
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
123124
match self {
124125
FeaturesFor::HostDep => f.write_str("host"),
125-
FeaturesFor::NormalOrDevOrArtifactTarget(Some(target)) => {
126-
f.write_str(&target.rustc_target())
127-
}
128-
FeaturesFor::NormalOrDevOrArtifactTarget(None) => Ok(()),
126+
FeaturesFor::ArtifactDep(target) => f.write_str(&target.rustc_target()),
127+
FeaturesFor::NormalOrDev => Ok(()),
129128
}
130129
}
131130
}
@@ -135,7 +134,7 @@ impl FeaturesFor {
135134
if for_host {
136135
FeaturesFor::HostDep
137136
} else {
138-
FeaturesFor::NormalOrDevOrArtifactTarget(None)
137+
FeaturesFor::NormalOrDev
139138
}
140139
}
141140

@@ -144,12 +143,12 @@ impl FeaturesFor {
144143
artifact_target: Option<CompileTarget>,
145144
) -> FeaturesFor {
146145
match artifact_target {
147-
Some(target) => FeaturesFor::NormalOrDevOrArtifactTarget(Some(target)),
146+
Some(target) => FeaturesFor::ArtifactDep(target),
148147
None => {
149148
if for_host {
150149
FeaturesFor::HostDep
151150
} else {
152-
FeaturesFor::NormalOrDevOrArtifactTarget(None)
151+
FeaturesFor::NormalOrDev
153152
}
154153
}
155154
}
@@ -786,11 +785,11 @@ impl<'a, 'cfg> FeatureResolver<'a, 'cfg> {
786785
self.target_data
787786
.dep_platform_activated(dep, CompileKind::Host)
788787
}
789-
(_, FeaturesFor::NormalOrDevOrArtifactTarget(None)) => self
788+
(_, FeaturesFor::NormalOrDev) => self
790789
.requested_targets
791790
.iter()
792791
.any(|kind| self.target_data.dep_platform_activated(dep, *kind)),
793-
(_, FeaturesFor::NormalOrDevOrArtifactTarget(Some(target))) => self
792+
(_, FeaturesFor::ArtifactDep(target)) => self
794793
.target_data
795794
.dep_platform_activated(dep, CompileKind::Target(target)),
796795
}
@@ -849,17 +848,15 @@ impl<'a, 'cfg> FeatureResolver<'a, 'cfg> {
849848
artifact.is_lib(),
850849
artifact.target().map(|target| match target {
851850
ArtifactTarget::Force(target) => {
852-
vec![FeaturesFor::NormalOrDevOrArtifactTarget(Some(target))]
851+
vec![FeaturesFor::ArtifactDep(target)]
853852
}
854853
ArtifactTarget::BuildDependencyAssumeTarget => self
855854
.requested_targets
856855
.iter()
857856
.filter_map(|kind| match kind {
858857
CompileKind::Host => None,
859858
CompileKind::Target(target) => {
860-
Some(FeaturesFor::NormalOrDevOrArtifactTarget(
861-
Some(*target),
862-
))
859+
Some(FeaturesFor::ArtifactDep(*target))
863860
}
864861
})
865862
.collect(),

Diff for: src/cargo/ops/cargo_compile.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1468,7 +1468,7 @@ pub fn resolve_all_features(
14681468
package_id: PackageId,
14691469
) -> HashSet<String> {
14701470
let mut features: HashSet<String> = resolved_features
1471-
.activated_features(package_id, FeaturesFor::NormalOrDevOrArtifactTarget(None))
1471+
.activated_features(package_id, FeaturesFor::NormalOrDev)
14721472
.iter()
14731473
.map(|s| s.to_string())
14741474
.collect();

Diff for: src/cargo/ops/tree/graph.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@ fn add_pkg(
325325
let node_features = resolved_features.activated_features(package_id, features_for);
326326
let node_kind = match features_for {
327327
FeaturesFor::HostDep => CompileKind::Host,
328-
FeaturesFor::NormalOrDevOrArtifactTarget(Some(target)) => CompileKind::Target(target),
329-
FeaturesFor::NormalOrDevOrArtifactTarget(None) => requested_kind,
328+
FeaturesFor::ArtifactDep(target) => CompileKind::Target(target),
329+
FeaturesFor::NormalOrDev => requested_kind,
330330
};
331331
let node = Node::Package {
332332
package_id,

0 commit comments

Comments
 (0)