From c22f569b049fa5151956473cdc91b2af186cd6ff Mon Sep 17 00:00:00 2001 From: Jane Losare-Lusby Date: Mon, 25 Nov 2024 16:00:57 -0800 Subject: [PATCH 1/4] Add new tool for dumping feature status based on tidy --- Cargo.lock | 10 +++++++ Cargo.toml | 1 + src/tools/features-status-dump/Cargo.toml | 10 +++++++ src/tools/features-status-dump/src/main.rs | 31 ++++++++++++++++++++++ src/tools/tidy/Cargo.toml | 1 + src/tools/tidy/src/features.rs | 2 ++ src/tools/tidy/src/features/version.rs | 1 + 7 files changed, 56 insertions(+) create mode 100644 src/tools/features-status-dump/Cargo.toml create mode 100644 src/tools/features-status-dump/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 29176a3ae8e20..190eaed1a0095 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1187,6 +1187,15 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +[[package]] +name = "features-status-dump" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tidy", +] + [[package]] name = "field-offset" version = "0.3.6" @@ -5249,6 +5258,7 @@ dependencies = [ "regex", "rustc-hash 2.0.0", "semver", + "serde", "similar", "termcolor", "walkdir", diff --git a/Cargo.toml b/Cargo.toml index b773030b4cab4..68d142ebe9265 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ members = [ "src/tools/coverage-dump", "src/tools/rustc-perf-wrapper", "src/tools/wasm-component-ld", + "src/tools/features-status-dump", ] exclude = [ diff --git a/src/tools/features-status-dump/Cargo.toml b/src/tools/features-status-dump/Cargo.toml new file mode 100644 index 0000000000000..fd5ac7c13ee23 --- /dev/null +++ b/src/tools/features-status-dump/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "features-status-dump" +version = "0.1.0" +license = "MIT OR Apache-2.0" +edition = "2021" + +[dependencies] +serde = { version = "1.0.125", features = [ "derive" ] } +serde_json = "1.0.59" +tidy = { path = "../tidy" } diff --git a/src/tools/features-status-dump/src/main.rs b/src/tools/features-status-dump/src/main.rs new file mode 100644 index 0000000000000..24ea4f758b433 --- /dev/null +++ b/src/tools/features-status-dump/src/main.rs @@ -0,0 +1,31 @@ +use std::collections::HashMap; +use std::io::BufWriter; +use std::{env, fs::File}; +use std::path::Path; +use tidy::features::{collect_lang_features, collect_lib_features, Feature}; + +#[derive(serde::Serialize)] +struct FeaturesStatus { + lang_features_status: HashMap, + lib_features_status: HashMap, +} + +fn main() { + let library_path_str = env::args_os().nth(1).expect("library/ path required"); + let compiler_path_str = env::args_os().nth(2).expect("compiler/ path required"); + let output_path_str = env::args_os().nth(3).expect("output path required"); + let library_path = Path::new(&library_path_str); + let compiler_path = Path::new(&compiler_path_str); + let output_path = Path::new(&output_path_str); + let lang_features_status = collect_lang_features(compiler_path, &mut false); + let lib_features_status = collect_lib_features(library_path) + .into_iter() + .filter(|&(ref name, _)| !lang_features_status.contains_key(name)) + .collect(); + let features_status = FeaturesStatus { + lang_features_status, lib_features_status + }; + let writer = File::create(output_path).expect("output path should be a valid path"); + let writer = BufWriter::new(writer); + serde_json::to_writer_pretty(writer, &features_status).unwrap(); +} diff --git a/src/tools/tidy/Cargo.toml b/src/tools/tidy/Cargo.toml index bc75787fb1abe..60402f829ab86 100644 --- a/src/tools/tidy/Cargo.toml +++ b/src/tools/tidy/Cargo.toml @@ -12,6 +12,7 @@ miropt-test-tools = { path = "../miropt-test-tools" } walkdir = "2" ignore = "0.4.18" semver = "1.0" +serde = { version = "1.0.125", features = [ "derive" ] } termcolor = "1.1.3" rustc-hash = "2.0.0" fluent-syntax = "0.11.1" diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs index 4f24eb2124207..6390d1eeccacd 100644 --- a/src/tools/tidy/src/features.rs +++ b/src/tools/tidy/src/features.rs @@ -27,6 +27,7 @@ const FEATURE_GROUP_START_PREFIX: &str = "// feature-group-start"; const FEATURE_GROUP_END_PREFIX: &str = "// feature-group-end"; #[derive(Debug, PartialEq, Clone)] +#[derive(serde::Serialize)] pub enum Status { Accepted, Removed, @@ -45,6 +46,7 @@ impl fmt::Display for Status { } #[derive(Debug, Clone)] +#[derive(serde::Serialize)] pub struct Feature { pub level: Status, pub since: Option, diff --git a/src/tools/tidy/src/features/version.rs b/src/tools/tidy/src/features/version.rs index 0830c226caf41..13d55b4845851 100644 --- a/src/tools/tidy/src/features/version.rs +++ b/src/tools/tidy/src/features/version.rs @@ -8,6 +8,7 @@ mod tests; pub const VERSION_PLACEHOLDER: &str = "CURRENT_RUSTC_VERSION"; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[derive(serde::Serialize)] pub enum Version { Explicit { parts: [u32; 3] }, CurrentPlaceholder, From b7d2d1fb8bad49c8d705761c0595a3a7cb796f13 Mon Sep 17 00:00:00 2001 From: Jane Losare-Lusby Date: Tue, 26 Nov 2024 14:33:30 -0800 Subject: [PATCH 2/4] format files --- src/tools/features-status-dump/src/main.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tools/features-status-dump/src/main.rs b/src/tools/features-status-dump/src/main.rs index 24ea4f758b433..9738310f0717c 100644 --- a/src/tools/features-status-dump/src/main.rs +++ b/src/tools/features-status-dump/src/main.rs @@ -1,8 +1,10 @@ use std::collections::HashMap; +use std::env; +use std::fs::File; use std::io::BufWriter; -use std::{env, fs::File}; use std::path::Path; -use tidy::features::{collect_lang_features, collect_lib_features, Feature}; + +use tidy::features::{Feature, collect_lang_features, collect_lib_features}; #[derive(serde::Serialize)] struct FeaturesStatus { @@ -22,9 +24,7 @@ fn main() { .into_iter() .filter(|&(ref name, _)| !lang_features_status.contains_key(name)) .collect(); - let features_status = FeaturesStatus { - lang_features_status, lib_features_status - }; + let features_status = FeaturesStatus { lang_features_status, lib_features_status }; let writer = File::create(output_path).expect("output path should be a valid path"); let writer = BufWriter::new(writer); serde_json::to_writer_pretty(writer, &features_status).unwrap(); From a5e54538473f3c51d0686a3b3e1a2d218349388f Mon Sep 17 00:00:00 2001 From: Jieyou Xu Date: Thu, 28 Nov 2024 11:13:29 +0800 Subject: [PATCH 3/4] features-status-dump: pass key paths via cli flags + misc changes --- Cargo.lock | 2 + src/tools/features-status-dump/Cargo.toml | 2 + src/tools/features-status-dump/src/main.rs | 52 +++++++++++++++------- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 190eaed1a0095..2f96444bb676a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1191,6 +1191,8 @@ checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" name = "features-status-dump" version = "0.1.0" dependencies = [ + "anyhow", + "clap", "serde", "serde_json", "tidy", diff --git a/src/tools/features-status-dump/Cargo.toml b/src/tools/features-status-dump/Cargo.toml index fd5ac7c13ee23..f258485599606 100644 --- a/src/tools/features-status-dump/Cargo.toml +++ b/src/tools/features-status-dump/Cargo.toml @@ -5,6 +5,8 @@ license = "MIT OR Apache-2.0" edition = "2021" [dependencies] +anyhow = { version = "1", features = ["backtrace"] } +clap = { version = "4", features = ["derive"] } serde = { version = "1.0.125", features = [ "derive" ] } serde_json = "1.0.59" tidy = { path = "../tidy" } diff --git a/src/tools/features-status-dump/src/main.rs b/src/tools/features-status-dump/src/main.rs index 9738310f0717c..1ce98d1506d1c 100644 --- a/src/tools/features-status-dump/src/main.rs +++ b/src/tools/features-status-dump/src/main.rs @@ -1,31 +1,53 @@ use std::collections::HashMap; -use std::env; use std::fs::File; use std::io::BufWriter; -use std::path::Path; +use std::path::PathBuf; +use anyhow::{Context, Result}; +use clap::Parser; use tidy::features::{Feature, collect_lang_features, collect_lib_features}; -#[derive(serde::Serialize)] +#[derive(Debug, Parser)] +struct Cli { + /// Path to `library/` directory. + #[arg(long)] + library_path: PathBuf, + /// Path to `compiler/` directory. + #[arg(long)] + compiler_path: PathBuf, + /// Path to `output/` directory. + #[arg(long)] + output_path: PathBuf, +} + +#[derive(Debug, serde::Serialize)] struct FeaturesStatus { lang_features_status: HashMap, lib_features_status: HashMap, } -fn main() { - let library_path_str = env::args_os().nth(1).expect("library/ path required"); - let compiler_path_str = env::args_os().nth(2).expect("compiler/ path required"); - let output_path_str = env::args_os().nth(3).expect("output path required"); - let library_path = Path::new(&library_path_str); - let compiler_path = Path::new(&compiler_path_str); - let output_path = Path::new(&output_path_str); - let lang_features_status = collect_lang_features(compiler_path, &mut false); - let lib_features_status = collect_lib_features(library_path) +fn main() -> Result<()> { + let Cli { compiler_path, library_path, output_path } = Cli::parse(); + + let lang_features_status = collect_lang_features(&compiler_path, &mut false); + let lib_features_status = collect_lib_features(&library_path) .into_iter() .filter(|&(ref name, _)| !lang_features_status.contains_key(name)) .collect(); let features_status = FeaturesStatus { lang_features_status, lib_features_status }; - let writer = File::create(output_path).expect("output path should be a valid path"); - let writer = BufWriter::new(writer); - serde_json::to_writer_pretty(writer, &features_status).unwrap(); + + let output_dir = output_path.parent().with_context(|| { + format!("failed to get parent dir of output path `{}`", output_path.display()) + })?; + std::fs::create_dir_all(output_dir).with_context(|| { + format!("failed to create output directory at `{}`", output_dir.display()) + })?; + + let output_file = File::create(&output_path).with_context(|| { + format!("failed to create file at given output path `{}`", output_path.display()) + })?; + let writer = BufWriter::new(output_file); + serde_json::to_writer_pretty(writer, &features_status) + .context("failed to write json output")?; + Ok(()) } From a5429535d9d4779a0b91d05bf5873f7fbc098eed Mon Sep 17 00:00:00 2001 From: Jieyou Xu Date: Thu, 28 Nov 2024 11:13:59 +0800 Subject: [PATCH 4/4] bootstrap: register `features-status-dump` as runnable tool --- src/bootstrap/src/core/build_steps/run.rs | 31 ++++++++++++++++++++++ src/bootstrap/src/core/build_steps/tool.rs | 1 + src/bootstrap/src/core/builder/mod.rs | 1 + 3 files changed, 33 insertions(+) diff --git a/src/bootstrap/src/core/build_steps/run.rs b/src/bootstrap/src/core/build_steps/run.rs index c76504761beb2..de355f74bca99 100644 --- a/src/bootstrap/src/core/build_steps/run.rs +++ b/src/bootstrap/src/core/build_steps/run.rs @@ -304,3 +304,34 @@ impl Step for UnicodeTableGenerator { cmd.run(builder); } } + +#[derive(Debug, PartialOrd, Ord, Clone, Hash, PartialEq, Eq)] +pub struct FeaturesStatusDump; + +impl Step for FeaturesStatusDump { + type Output = (); + const ONLY_HOSTS: bool = true; + + fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { + run.path("src/tools/features-status-dump") + } + + fn make_run(run: RunConfig<'_>) { + run.builder.ensure(FeaturesStatusDump); + } + + fn run(self, builder: &Builder<'_>) { + let mut cmd = builder.tool_cmd(Tool::FeaturesStatusDump); + + cmd.arg("--library-path"); + cmd.arg(builder.src.join("library")); + + cmd.arg("--compiler-path"); + cmd.arg(builder.src.join("compiler")); + + cmd.arg("--output-path"); + cmd.arg(builder.out.join("features-status-dump.json")); + + cmd.run(builder); + } +} diff --git a/src/bootstrap/src/core/build_steps/tool.rs b/src/bootstrap/src/core/build_steps/tool.rs index 3cfbef27f87ad..b717a28966444 100644 --- a/src/bootstrap/src/core/build_steps/tool.rs +++ b/src/bootstrap/src/core/build_steps/tool.rs @@ -359,6 +359,7 @@ bootstrap_tool!( RustcPerfWrapper, "src/tools/rustc-perf-wrapper", "rustc-perf-wrapper"; WasmComponentLd, "src/tools/wasm-component-ld", "wasm-component-ld", is_unstable_tool = true, allow_features = "min_specialization"; UnicodeTableGenerator, "src/tools/unicode-table-generator", "unicode-table-generator"; + FeaturesStatusDump, "src/tools/features-status-dump", "features-status-dump"; ); /// These are the submodules that are required for rustbook to work due to diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/builder/mod.rs index e6902bb8cee5f..a09115b3bffd8 100644 --- a/src/bootstrap/src/core/builder/mod.rs +++ b/src/bootstrap/src/core/builder/mod.rs @@ -1009,6 +1009,7 @@ impl<'a> Builder<'a> { run::GenerateWindowsSys, run::GenerateCompletions, run::UnicodeTableGenerator, + run::FeaturesStatusDump, ), Kind::Setup => { describe!(setup::Profile, setup::Hook, setup::Link, setup::Editor)