Skip to content

Commit fe2bc68

Browse files
qticaUebelAndre
andauthored
fix(cargo-bazel): ignore example crates when checking if proc-macro (bazelbuild#2596)
# WHAT * ignore example crate types when checking if it is a proc-macro # WHY When building the list of `deps` and `proc_macro_deps` for a given crate, dependency crates which contain examples in their Cargo.yaml of of type `proc-macro` cause the dependency to be added to the `proc_macro_deps`. The example crate types should be ignored. Fixes bazelbuild#2577 Co-authored-by: UebelAndre <[email protected]>
1 parent 4769fe6 commit fe2bc68

File tree

5 files changed

+2157
-4
lines changed

5 files changed

+2157
-4
lines changed

crate_universe/src/metadata/dependency.rs

+28-4
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,10 @@ fn is_lib_package(package: &Package) -> bool {
197197
}
198198

199199
fn is_proc_macro_package(package: &Package) -> bool {
200-
package
201-
.targets
202-
.iter()
203-
.any(|target| target.crate_types.iter().any(|t| t == "proc-macro"))
200+
package.targets.iter().any(|target| {
201+
target.crate_types.iter().any(|t| t == "proc-macro")
202+
&& !target.kind.iter().any(|t| t == "example")
203+
})
204204
}
205205

206206
fn is_dev_dependency(node_dep: &NodeDep) -> bool {
@@ -425,6 +425,30 @@ mod test {
425425
.unwrap()
426426
}
427427

428+
#[test]
429+
fn example_proc_macro_dep() {
430+
let metadata = metadata::example_proc_macro_dep();
431+
432+
let node = find_metadata_node("example-proc-macro-dep", &metadata);
433+
let dependencies = DependencySet::new_for_node(node, &metadata);
434+
435+
let normal_deps: Vec<_> = dependencies
436+
.normal_deps
437+
.items()
438+
.into_iter()
439+
.map(|(_, dep)| dep.target_name)
440+
.collect();
441+
assert_eq!(normal_deps, vec!["proc-macro-rules"]);
442+
443+
let proc_macro_deps: Vec<_> = dependencies
444+
.proc_macro_deps
445+
.items()
446+
.into_iter()
447+
.map(|(_, dep)| dep.target_name)
448+
.collect();
449+
assert_eq!(proc_macro_deps, Vec::<&str>::new());
450+
}
451+
428452
#[test]
429453
fn sys_dependencies() {
430454
let metadata = metadata::build_scripts();

crate_universe/src/test.rs

+8
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ pub(crate) mod metadata {
139139
.unwrap()
140140
}
141141

142+
pub(crate) fn example_proc_macro_dep() -> cargo_metadata::Metadata {
143+
serde_json::from_str(include_str!(concat!(
144+
env!("CARGO_MANIFEST_DIR"),
145+
"/test_data/metadata/example_proc_macro_dep/metadata.json"
146+
)))
147+
.unwrap()
148+
}
149+
142150
pub(crate) fn git_repos() -> cargo_metadata::Metadata {
143151
serde_json::from_str(include_str!(concat!(
144152
env!("CARGO_MANIFEST_DIR"),

crate_universe/test_data/metadata/example_proc_macro_dep/Cargo.lock

+74
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "example-proc-macro-dep"
3+
version = "0.1.0"
4+
edition = "2018"
5+
6+
# Required to satisfy cargo but no `lib.rs` is expected to
7+
# exist within test data.
8+
[lib]
9+
path = "lib.rs"
10+
11+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
12+
13+
[dependencies]
14+
proc-macro-rules = "=0.4.0"

0 commit comments

Comments
 (0)