Skip to content

Commit 6332c71

Browse files
committed
generate-copyright: pass the list of manifests from bootstrap
1 parent 0c2b067 commit 6332c71

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

src/bootstrap/src/core/build_steps/run.rs

+15
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::Mode;
99
use crate::core::build_steps::dist::distdir;
1010
use crate::core::build_steps::test;
1111
use crate::core::build_steps::tool::{self, SourceType, Tool};
12+
use crate::core::build_steps::vendor::default_paths_to_vendor;
1213
use crate::core::builder::{Builder, Kind, RunConfig, ShouldRun, Step};
1314
use crate::core::config::TargetSelection;
1415
use crate::core::config::flags::get_completion;
@@ -212,7 +213,21 @@ impl Step for GenerateCopyright {
212213
let dest = builder.out.join("COPYRIGHT.html");
213214
let dest_libstd = builder.out.join("COPYRIGHT-library.html");
214215

216+
let paths_to_vendor = default_paths_to_vendor(builder);
217+
for (_, submodules) in &paths_to_vendor {
218+
for submodule in submodules {
219+
builder.build.require_submodule(submodule, None);
220+
}
221+
}
222+
let cargo_manifests = paths_to_vendor
223+
.into_iter()
224+
.map(|(path, _submodules)| path.to_str().unwrap().to_string())
225+
.inspect(|path| assert!(!path.contains(','), "{path} contains a comma in its name"))
226+
.collect::<Vec<_>>()
227+
.join(",");
228+
215229
let mut cmd = builder.tool_cmd(Tool::GenerateCopyright);
230+
cmd.env("CARGO_MANIFESTS", &cargo_manifests);
216231
cmd.env("LICENSE_METADATA", &license_metadata);
217232
cmd.env("DEST", &dest);
218233
cmd.env("DEST_LIBSTD", &dest_libstd);

src/tools/generate-copyright/src/cargo_metadata.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub fn get_metadata_and_notices(
5454
cargo: &Path,
5555
vendor_path: &Path,
5656
root_path: &Path,
57-
manifest_paths: &[&Path],
57+
manifest_paths: &[PathBuf],
5858
) -> Result<BTreeMap<Package, PackageMetadata>, Error> {
5959
let mut output = get_metadata(cargo, root_path, manifest_paths)?;
6060

@@ -77,7 +77,7 @@ pub fn get_metadata_and_notices(
7777
pub fn get_metadata(
7878
cargo: &Path,
7979
root_path: &Path,
80-
manifest_paths: &[&Path],
80+
manifest_paths: &[PathBuf],
8181
) -> Result<BTreeMap<Package, PackageMetadata>, Error> {
8282
let mut output = BTreeMap::new();
8383
// Look at the metadata for each manifest
@@ -114,7 +114,7 @@ pub fn get_metadata(
114114
}
115115

116116
/// Run cargo-vendor, fetching into the given dir
117-
fn run_cargo_vendor(cargo: &Path, dest: &Path, manifest_paths: &[&Path]) -> Result<(), Error> {
117+
fn run_cargo_vendor(cargo: &Path, dest: &Path, manifest_paths: &[PathBuf]) -> Result<(), Error> {
118118
let mut vendor_command = std::process::Command::new(cargo);
119119
vendor_command.env("RUSTC_BOOTSTRAP", "1");
120120
vendor_command.arg("vendor");

src/tools/generate-copyright/src/main.rs

+28-7
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,35 @@ fn main() -> Result<(), Error> {
2222
let cargo = env_path("CARGO")?;
2323
let license_metadata = env_path("LICENSE_METADATA")?;
2424

25-
let root_path = std::path::absolute(".")?;
25+
let cargo_manifests = env_string("CARGO_MANIFESTS")?
26+
.split(",")
27+
.map(|manifest| manifest.into())
28+
.collect::<Vec<PathBuf>>();
29+
let library_manifests = cargo_manifests
30+
.iter()
31+
.filter(|path| {
32+
if let Ok(stripped) = path.strip_prefix(&src_dir) {
33+
stripped.starts_with("library")
34+
} else {
35+
panic!("manifest {path:?} not relative to source dir {src_dir:?}");
36+
}
37+
})
38+
.cloned()
39+
.collect::<Vec<_>>();
2640

2741
// Scan Cargo dependencies
2842
let mut collected_cargo_metadata = cargo_metadata::get_metadata_and_notices(
2943
&cargo,
3044
&out_dir.join("vendor"),
3145
&src_dir,
32-
&[
33-
Path::new("./Cargo.toml"),
34-
Path::new("./src/tools/cargo/Cargo.toml"),
35-
Path::new("./library/Cargo.toml"),
36-
],
46+
&cargo_manifests,
3747
)?;
3848

3949
let library_collected_cargo_metadata = cargo_metadata::get_metadata_and_notices(
4050
&cargo,
4151
&out_dir.join("library-vendor"),
4252
&src_dir,
43-
&[Path::new("./library/Cargo.toml")],
53+
&library_manifests,
4454
)?;
4555

4656
for (key, value) in collected_cargo_metadata.iter_mut() {
@@ -194,6 +204,17 @@ struct License {
194204
copyright: Vec<String>,
195205
}
196206

207+
/// Grab an environment variable as string, or fail nicely.
208+
fn env_string(var: &str) -> Result<String, Error> {
209+
match std::env::var(var) {
210+
Ok(var) => Ok(var),
211+
Err(std::env::VarError::NotUnicode(_)) => {
212+
anyhow::bail!("environment variable {var} is not utf-8")
213+
}
214+
Err(std::env::VarError::NotPresent) => anyhow::bail!("missing environment variable {var}"),
215+
}
216+
}
217+
197218
/// Grab an environment variable as a PathBuf, or fail nicely.
198219
fn env_path(var: &str) -> Result<PathBuf, Error> {
199220
if let Some(var) = std::env::var_os(var) {

0 commit comments

Comments
 (0)