Skip to content

Commit 7de30dd

Browse files
committed
Don't check for dev-dependencies when not needed
1 parent df089f4 commit 7de30dd

File tree

4 files changed

+59
-27
lines changed

4 files changed

+59
-27
lines changed

src/cargo/core/resolver/mod.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,26 @@ pub struct DepsNotReplaced<'a> {
9696

9797
#[derive(Clone, Copy)]
9898
pub enum Method<'a> {
99-
Everything,
99+
Everything, // equivalent to Required { dev_deps: true, all_features: true, .. }
100100
Required {
101101
dev_deps: bool,
102102
features: &'a [String],
103+
all_features: bool,
103104
uses_default_features: bool,
104105
},
105106
}
106107

108+
impl<'r> Method<'r> {
109+
pub fn split_features(features: &[String]) -> Vec<String> {
110+
features.iter()
111+
.flat_map(|s| s.split_whitespace())
112+
.flat_map(|s| s.split(','))
113+
.filter(|s| !s.is_empty())
114+
.map(|s| s.to_string())
115+
.collect::<Vec<String>>()
116+
}
117+
}
118+
107119
// Information about the dependencies for a crate, a tuple of:
108120
//
109121
// (dependency info, candidates, features activated)
@@ -731,6 +743,7 @@ fn activate_deps_loop<'a>(mut cx: Context<'a>,
731743
let method = Method::Required {
732744
dev_deps: false,
733745
features: &features,
746+
all_features: false,
734747
uses_default_features: dep.uses_default_features(),
735748
};
736749
trace!("{}[{}]>{} trying {}", parent.name(), cur, dep.name(),
@@ -1006,7 +1019,8 @@ fn build_requirements<'a, 'b: 'a>(s: &'a Summary, method: &'b Method)
10061019
-> CargoResult<Requirements<'a>> {
10071020
let mut reqs = Requirements::new(s);
10081021
match *method {
1009-
Method::Everything => {
1022+
Method::Everything |
1023+
Method::Required { all_features: true, .. } => {
10101024
for key in s.features().keys() {
10111025
reqs.require_feature(key)?;
10121026
}
@@ -1052,10 +1066,11 @@ impl<'a> Context<'a> {
10521066
}
10531067
debug!("checking if {} is already activated", summary.package_id());
10541068
let (features, use_default) = match *method {
1069+
Method::Everything |
1070+
Method::Required { all_features: true, .. } => return false,
10551071
Method::Required { features, uses_default_features, .. } => {
10561072
(features, uses_default_features)
10571073
}
1058-
Method::Everything => return false,
10591074
};
10601075

10611076
let has_default_feature = summary.features().contains_key("default");

src/cargo/ops/cargo_compile.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use std::sync::Arc;
2929

3030
use core::{Source, Package, Target};
3131
use core::{Profile, TargetKind, Profiles, Workspace, PackageId, PackageIdSpec};
32-
use core::resolver::Resolve;
32+
use core::resolver::{Resolve, Method};
3333
use ops::{self, BuildOutput, Executor, DefaultExecutor};
3434
use util::config::Config;
3535
use util::{CargoResult, profile};
@@ -226,12 +226,18 @@ pub fn compile_ws<'a>(ws: &Workspace<'a>,
226226
let profiles = ws.profiles();
227227

228228
let specs = spec.into_package_id_specs(ws)?;
229-
let resolve = ops::resolve_ws_precisely(ws,
230-
source,
231-
features,
232-
all_features,
233-
no_default_features,
234-
&specs)?;
229+
let features = Method::split_features(features);
230+
let method = Method::Required {
231+
dev_deps: filter.need_dev_deps(),
232+
features: &features,
233+
all_features,
234+
uses_default_features: !no_default_features,
235+
};
236+
let resolve = ops::resolve_ws_with_method(ws,
237+
source,
238+
method,
239+
&specs,
240+
)?;
235241
let (packages, resolve_with_overrides) = resolve;
236242

237243
if specs.is_empty() {
@@ -413,6 +419,14 @@ impl<'a> CompileFilter<'a> {
413419
}
414420
}
415421

422+
pub fn need_dev_deps(&self) -> bool {
423+
match *self {
424+
CompileFilter::Default { .. } => true,
425+
CompileFilter::Only { examples, tests, benches, .. } =>
426+
examples.is_specific() || tests.is_specific() || benches.is_specific()
427+
}
428+
}
429+
416430
pub fn matches(&self, target: &Target) -> bool {
417431
match *self {
418432
CompileFilter::Default { .. } => true,

src/cargo/ops/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub use self::registry::{modify_owners, yank, OwnersOptions, PublishOpts};
2222
pub use self::registry::configure_http_handle;
2323
pub use self::cargo_fetch::fetch;
2424
pub use self::cargo_pkgid::pkgid;
25-
pub use self::resolve::{resolve_ws, resolve_ws_precisely, resolve_with_previous};
25+
pub use self::resolve::{resolve_ws, resolve_ws_precisely, resolve_ws_with_method, resolve_with_previous};
2626
pub use self::cargo_output_metadata::{output_metadata, OutputMetadataOptions, ExportInfo};
2727

2828
mod cargo_clean;

src/cargo/ops/resolve.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,25 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>,
2929
no_default_features: bool,
3030
specs: &[PackageIdSpec])
3131
-> CargoResult<(PackageSet<'a>, Resolve)> {
32-
let features = features.iter()
33-
.flat_map(|s| s.split_whitespace())
34-
.flat_map(|s| s.split(','))
35-
.filter(|s| !s.is_empty())
36-
.map(|s| s.to_string())
37-
.collect::<Vec<String>>();
32+
let features = Method::split_features(features);
33+
let method = if all_features {
34+
Method::Everything
35+
} else {
36+
Method::Required {
37+
dev_deps: true,
38+
features: &features,
39+
all_features: false,
40+
uses_default_features: !no_default_features,
41+
}
42+
};
43+
resolve_ws_with_method(ws, source, method, specs)
44+
}
3845

46+
pub fn resolve_ws_with_method<'a>(ws: &Workspace<'a>,
47+
source: Option<Box<Source + 'a>>,
48+
method: Method,
49+
specs: &[PackageIdSpec])
50+
-> CargoResult<(PackageSet<'a>, Resolve)> {
3951
let mut registry = PackageRegistry::new(ws.config())?;
4052
if let Some(source) = source {
4153
registry.add_preloaded(source);
@@ -68,16 +80,6 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>,
6880
None
6981
};
7082

71-
let method = if all_features {
72-
Method::Everything
73-
} else {
74-
Method::Required {
75-
dev_deps: true, // TODO: remove this option?
76-
features: &features,
77-
uses_default_features: !no_default_features,
78-
}
79-
};
80-
8183
let resolved_with_overrides =
8284
ops::resolve_with_previous(&mut registry,
8385
ws,
@@ -236,6 +238,7 @@ pub fn resolve_with_previous<'a>(registry: &mut PackageRegistry,
236238
let base = Method::Required {
237239
dev_deps: dev_deps,
238240
features: &[],
241+
all_features: false,
239242
uses_default_features: true,
240243
};
241244
let member_id = member.package_id();

0 commit comments

Comments
 (0)