Skip to content

Commit 8b17895

Browse files
committed
Add logic for testing implicit binary dependency features.
1 parent f1d46e3 commit 8b17895

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

src/cargo/core/compiler/unit_dependencies.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::core::profiles::{Profile, UnitFor};
2323
use crate::core::resolver::features::{FeaturesFor, ResolvedFeatures};
2424
use crate::core::resolver::Resolve;
2525
use crate::core::{InternedString, Package, PackageId, Target};
26+
use crate::ops::resolve_all_features;
2627
use crate::CargoResult;
2728
use log::trace;
2829
use std::collections::{HashMap, HashSet};
@@ -309,13 +310,20 @@ fn compute_deps<'a, 'cfg>(
309310
.targets()
310311
.iter()
311312
.filter(|t| {
312-
let no_required_features = Vec::new();
313-
314-
t.is_bin() &&
315-
// Skip binaries with required features that have not been selected.
316-
t.required_features().unwrap_or(&no_required_features).iter().all(|f| {
317-
unit.features.contains(&InternedString::new(f.as_str()))
318-
})
313+
// Skip binaries with required features that have not been selected.
314+
match t.required_features() {
315+
Some(rf) if t.is_bin() => {
316+
let features = resolve_all_features(
317+
state.resolve(),
318+
state.features(),
319+
bcx.packages,
320+
id,
321+
);
322+
rf.iter().all(|f| features.contains(f))
323+
}
324+
None if t.is_bin() => true,
325+
_ => false,
326+
}
319327
})
320328
.map(|t| {
321329
new_unit_dep(
@@ -692,16 +700,20 @@ impl<'a, 'cfg> State<'a, 'cfg> {
692700
}
693701
}
694702

703+
fn features(&self) -> &'a ResolvedFeatures {
704+
if self.is_std {
705+
self.std_features.unwrap()
706+
} else {
707+
self.usr_features
708+
}
709+
}
710+
695711
fn activated_features(
696712
&self,
697713
pkg_id: PackageId,
698714
features_for: FeaturesFor,
699715
) -> Vec<InternedString> {
700-
let features = if self.is_std {
701-
self.std_features.unwrap()
702-
} else {
703-
self.usr_features
704-
};
716+
let features = self.features();
705717
features.activated_features(pkg_id, features_for)
706718
}
707719

src/cargo/ops/cargo_compile.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ fn generate_targets<'a>(
949949
///
950950
/// Dependencies are added as `dep_name/feat_name` because `required-features`
951951
/// wants to support that syntax.
952-
fn resolve_all_features(
952+
pub fn resolve_all_features(
953953
resolve_with_overrides: &Resolve,
954954
resolved_features: &features::ResolvedFeatures,
955955
package_set: &PackageSet<'_>,

src/cargo/ops/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
pub use self::cargo_clean::{clean, CleanOptions};
2-
pub use self::cargo_compile::{compile, compile_with_exec, compile_ws, CompileOptions};
2+
pub use self::cargo_compile::{
3+
compile, compile_with_exec, compile_ws, resolve_all_features, CompileOptions,
4+
};
35
pub use self::cargo_compile::{CompileFilter, FilterRule, LibRule, Packages};
46
pub use self::cargo_doc::{doc, DocOptions};
57
pub use self::cargo_fetch::{fetch, FetchOptions};

0 commit comments

Comments
 (0)