Skip to content

Commit 5ea964a

Browse files
committed
refactor(features2): new variant FeaturesFor::ArtifactDep
As the existence of `FeaturesFor` is acting as a key that discriminate activated features for the same package with different circumstances. Artifact dependencies deserve its own variant and it makes things clear to me. - ✏️ `NormalOrDevOrArtifactTarget(CompileTarget)` -> `NormalOrDev` - 🆕 `ArtifactDep(target)`
1 parent 0b84a35 commit 5ea964a

File tree

4 files changed

+25
-31
lines changed

4 files changed

+25
-31
lines changed

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);

src/cargo/core/resolver/features.rs

+21-24
Original file line numberDiff line numberDiff line change
@@ -95,30 +95,29 @@ pub enum ForceAllTargets {
9595
No,
9696
}
9797

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

114115
impl std::fmt::Display for FeaturesFor {
115116
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
116117
match self {
117118
FeaturesFor::HostDep => f.write_str("host"),
118-
FeaturesFor::NormalOrDevOrArtifactTarget(Some(target)) => {
119-
f.write_str(&target.rustc_target())
120-
}
121-
FeaturesFor::NormalOrDevOrArtifactTarget(None) => Ok(()),
119+
FeaturesFor::ArtifactDep(target) => f.write_str(&target.rustc_target()),
120+
FeaturesFor::NormalOrDev => Ok(()),
122121
}
123122
}
124123
}
@@ -128,7 +127,7 @@ impl FeaturesFor {
128127
if for_host {
129128
FeaturesFor::HostDep
130129
} else {
131-
FeaturesFor::NormalOrDevOrArtifactTarget(None)
130+
FeaturesFor::NormalOrDev
132131
}
133132
}
134133

@@ -137,12 +136,12 @@ impl FeaturesFor {
137136
artifact_target: Option<CompileTarget>,
138137
) -> FeaturesFor {
139138
match artifact_target {
140-
Some(target) => FeaturesFor::NormalOrDevOrArtifactTarget(Some(target)),
139+
Some(target) => FeaturesFor::ArtifactDep(target),
141140
None => {
142141
if for_host {
143142
FeaturesFor::HostDep
144143
} else {
145-
FeaturesFor::NormalOrDevOrArtifactTarget(None)
144+
FeaturesFor::NormalOrDev
146145
}
147146
}
148147
}
@@ -769,11 +768,11 @@ impl<'a, 'cfg> FeatureResolver<'a, 'cfg> {
769768
self.target_data
770769
.dep_platform_activated(dep, CompileKind::Host)
771770
}
772-
(_, FeaturesFor::NormalOrDevOrArtifactTarget(None)) => self
771+
(_, FeaturesFor::NormalOrDev) => self
773772
.requested_targets
774773
.iter()
775774
.any(|kind| self.target_data.dep_platform_activated(dep, *kind)),
776-
(_, FeaturesFor::NormalOrDevOrArtifactTarget(Some(target))) => self
775+
(_, FeaturesFor::ArtifactDep(target)) => self
777776
.target_data
778777
.dep_platform_activated(dep, CompileKind::Target(target)),
779778
}
@@ -832,17 +831,15 @@ impl<'a, 'cfg> FeatureResolver<'a, 'cfg> {
832831
artifact.is_lib(),
833832
artifact.target().map(|target| match target {
834833
ArtifactTarget::Force(target) => {
835-
vec![FeaturesFor::NormalOrDevOrArtifactTarget(Some(target))]
834+
vec![FeaturesFor::ArtifactDep(target)]
836835
}
837836
ArtifactTarget::BuildDependencyAssumeTarget => self
838837
.requested_targets
839838
.iter()
840839
.filter_map(|kind| match kind {
841840
CompileKind::Host => None,
842841
CompileKind::Target(target) => {
843-
Some(FeaturesFor::NormalOrDevOrArtifactTarget(
844-
Some(*target),
845-
))
842+
Some(FeaturesFor::ArtifactDep(*target))
846843
}
847844
})
848845
.collect(),

src/cargo/ops/cargo_compile.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,7 @@ pub fn resolve_all_features(
14241424
package_id: PackageId,
14251425
) -> HashSet<String> {
14261426
let mut features: HashSet<String> = resolved_features
1427-
.activated_features(package_id, FeaturesFor::NormalOrDevOrArtifactTarget(None))
1427+
.activated_features(package_id, FeaturesFor::NormalOrDev)
14281428
.iter()
14291429
.map(|s| s.to_string())
14301430
.collect();

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)