Skip to content

Commit 2130c41

Browse files
committed
crate_universe: synthesize build-script edge at render time
A library/binary/proc-macro built from a crate with a build script depends on that crate's own build_script_build target. That edge was recorded as a self-referential entry in common_attrs.deps, which also feeds workspace_member_deps() and produced a spurious crate-hub alias for any workspace member that is a library with a build script (issue #4089). Stop recording the self-edge in common_attrs.deps (reserved for cross-crate deps) and instead synthesize the build_script_build edge during rendering from the presence of the build-script target. workspace_member_deps() then naturally excludes it with no filtering. Upstream issue: #4089
1 parent fb01b69 commit 2130c41

3 files changed

Lines changed: 31 additions & 25 deletions

File tree

crate_universe/src/context.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,6 @@ mod test {
412412
.map(|dep| (&dep.id, context.has_duplicate_workspace_member_dep_by_alias(dep)))
413413
.collect::<Vec<_>>(),
414414
[
415-
(&CrateId::new("child".to_owned(), Version::new(0, 1, 0)), false),
416415
(&CrateId::new("tonic".to_owned(), Version::new(0, 4, 3)), false),
417416
(&CrateId::new("tonic-build".to_owned(), Version::new(0, 4, 2)), false),
418417
],

crate_universe/src/context/crate_context.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ pub(crate) struct CommonAttributes {
115115
#[serde(skip_serializing_if = "Select::is_empty")]
116116
pub(crate) deps: Select<BTreeSet<CrateDependency>>,
117117

118+
/// The crate's own build script, which its library/binary/proc-macro targets
119+
/// depend on for the script's generated outputs.
120+
#[serde(skip_serializing_if = "Option::is_none")]
121+
pub(crate) build_script_dep: Option<CrateDependency>,
122+
118123
#[serde(skip_serializing_if = "Select::is_empty")]
119124
pub(crate) extra_deps: Select<BTreeSet<Label>>,
120125

@@ -161,6 +166,7 @@ impl Default for CommonAttributes {
161166
data: Default::default(),
162167
data_glob: Default::default(),
163168
deps: Default::default(),
169+
build_script_dep: Default::default(),
164170
extra_deps: Default::default(),
165171
deps_dev: Default::default(),
166172
edition: Default::default(),
@@ -495,19 +501,17 @@ impl CrateContext {
495501
});
496502

497503
let build_script_attrs = if let Some(target) = build_script_target {
498-
// Track the build script dependency
499-
common_attrs.deps.insert(
500-
CrateDependency {
501-
id: current_crate_id,
502-
target: target.crate_name.clone(),
503-
alias: None,
504-
local_path: match source_annotations.get(&annotation.node.id) {
505-
Some(SourceAnnotation::Path { path }) => Some(path.clone()),
506-
_ => None,
507-
},
504+
// Kept out of `common_attrs.deps` (which feeds workspace-member alias
505+
// generation) so the crate is not aliased to itself.
506+
common_attrs.build_script_dep = Some(CrateDependency {
507+
id: current_crate_id,
508+
target: target.crate_name.clone(),
509+
alias: None,
510+
local_path: match source_annotations.get(&annotation.node.id) {
511+
Some(SourceAnnotation::Path { path }) => Some(path.clone()),
512+
_ => None,
508513
},
509-
None,
510-
);
514+
});
511515

512516
let build_deps = annotation.deps.build_deps.clone().map(new_crate_dep);
513517
let build_link_deps = annotation.deps.build_link_deps.clone().map(new_crate_dep);

crate_universe/src/rendering.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -680,13 +680,14 @@ impl Renderer {
680680
krate: &CrateContext,
681681
target: &TargetAttributes,
682682
) -> Result<RustProcMacro> {
683+
let mut deps = krate.common_attrs.deps.clone();
684+
if let Some(dep) = krate.common_attrs.build_script_dep.clone() {
685+
deps.insert(dep, None);
686+
}
683687
Ok(RustProcMacro {
684688
name: target.crate_name.clone(),
685689
deps: SelectSet::new(
686-
self.make_deps(
687-
krate.common_attrs.deps.clone(),
688-
krate.common_attrs.extra_deps.clone(),
689-
),
690+
self.make_deps(deps, krate.common_attrs.extra_deps.clone()),
690691
platforms,
691692
),
692693
proc_macro_deps: SelectSet::new(
@@ -707,13 +708,14 @@ impl Renderer {
707708
krate: &CrateContext,
708709
target: &TargetAttributes,
709710
) -> Result<RustLibrary> {
711+
let mut deps = krate.common_attrs.deps.clone();
712+
if let Some(dep) = krate.common_attrs.build_script_dep.clone() {
713+
deps.insert(dep, None);
714+
}
710715
Ok(RustLibrary {
711716
name: target.crate_name.clone(),
712717
deps: SelectSet::new(
713-
self.make_deps(
714-
krate.common_attrs.deps.clone(),
715-
krate.common_attrs.extra_deps.clone(),
716-
),
718+
self.make_deps(deps, krate.common_attrs.extra_deps.clone()),
717719
platforms,
718720
),
719721
proc_macro_deps: SelectSet::new(
@@ -742,10 +744,11 @@ impl Renderer {
742744
.iter()
743745
.any(|rule| matches!(rule, Rule::ProcMacro(_)));
744746

745-
let mut deps = self.make_deps(
746-
krate.common_attrs.deps.clone(),
747-
krate.common_attrs.extra_deps.clone(),
748-
);
747+
let mut crate_deps = krate.common_attrs.deps.clone();
748+
if let Some(dep) = krate.common_attrs.build_script_dep.clone() {
749+
crate_deps.insert(dep, None);
750+
}
751+
let mut deps = self.make_deps(crate_deps, krate.common_attrs.extra_deps.clone());
749752
let mut proc_macro_deps = self.make_deps(
750753
krate.common_attrs.proc_macro_deps.clone(),
751754
krate.common_attrs.extra_proc_macro_deps.clone(),

0 commit comments

Comments
 (0)