From c8c258183c3fe577983cadc8c10ae8143b948220 Mon Sep 17 00:00:00 2001 From: klensy Date: Fri, 28 Feb 2025 13:07:27 +0300 Subject: [PATCH 1/4] x.py clippy: allow to set clippy.toml --- src/bootstrap/src/core/build_steps/clippy.rs | 41 ++++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/bootstrap/src/core/build_steps/clippy.rs b/src/bootstrap/src/core/build_steps/clippy.rs index fe8c89f7a5394..e5bf466d57a33 100644 --- a/src/bootstrap/src/core/build_steps/clippy.rs +++ b/src/bootstrap/src/core/build_steps/clippy.rs @@ -1,9 +1,11 @@ //! Implementation of running clippy on the compiler, standard library and various tools. +use std::path::PathBuf; + use super::compile::{run_cargo, rustc_cargo, std_cargo}; use super::tool::{SourceType, prepare_tool_cargo}; use super::{check, compile}; -use crate::builder::{Builder, ShouldRun}; +use crate::builder::{Builder, Cargo, ShouldRun}; use crate::core::build_steps::compile::std_crates_for_run_make; use crate::core::builder; use crate::core::builder::{Alias, Kind, RunConfig, Step, crate_description}; @@ -92,13 +94,15 @@ pub struct LintConfig { pub warn: Vec, pub deny: Vec, pub forbid: Vec, + // Path to folder containing clippy.toml, if any + clippy_cfg_path: Option, } impl LintConfig { - fn new(builder: &Builder<'_>) -> Self { + fn new(builder: &Builder<'_>, clippy_config: Option) -> Self { match builder.config.cmd.clone() { Subcommand::Clippy { allow, deny, warn, forbid, .. } => { - Self { allow, warn, deny, forbid } + Self { allow, warn, deny, forbid, clippy_cfg_path: clippy_config } } _ => unreachable!("LintConfig can only be called from `clippy` subcommands."), } @@ -114,8 +118,19 @@ impl LintConfig { warn: merged(&self.warn, &other.warn), deny: merged(&self.deny, &other.deny), forbid: merged(&self.forbid, &other.forbid), + // FIXME: this skip merging clippy.toml, + // but maybe there is a better way? + clippy_cfg_path: self.clippy_cfg_path.clone(), } } + + fn apply_clippy_cfg(&self, cargo: &mut Cargo, builder: &Builder<'_>) { + let Some(cfg_path) = &self.clippy_cfg_path else { + return; + }; + let absolute_path = builder.src.join(cfg_path); + cargo.env("CLIPPY_CONF_DIR", absolute_path); + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -136,7 +151,7 @@ impl Step for Std { fn make_run(run: RunConfig<'_>) { let crates = std_crates_for_run_make(&run); - let config = LintConfig::new(run.builder); + let config = LintConfig::new(run.builder, None); run.builder.ensure(Std { target: run.target, config, crates }); } @@ -155,6 +170,8 @@ impl Step for Std { Kind::Clippy, ); + self.config.apply_clippy_cfg(&mut cargo, builder); + std_cargo(builder, target, compiler.stage, &mut cargo); for krate in &*self.crates { @@ -195,7 +212,7 @@ impl Step for Rustc { fn make_run(run: RunConfig<'_>) { let crates = run.make_run_crates(Alias::Compiler); - let config = LintConfig::new(run.builder); + let config = LintConfig::new(run.builder, None); run.builder.ensure(Rustc { target: run.target, config, crates }); } @@ -228,6 +245,8 @@ impl Step for Rustc { Kind::Clippy, ); + self.config.apply_clippy_cfg(&mut cargo, builder); + rustc_cargo(builder, &mut cargo, target, &compiler, &self.crates); // Explicitly pass -p for all compiler crates -- this will force cargo @@ -275,7 +294,7 @@ macro_rules! lint_any { } fn make_run(run: RunConfig<'_>) { - let config = LintConfig::new(run.builder); + let config = LintConfig::new(run.builder, None); run.builder.ensure($name { target: run.target, config, @@ -288,7 +307,7 @@ macro_rules! lint_any { builder.ensure(check::Rustc::new(target, builder).build_kind(Some(Kind::Check))); - let cargo = prepare_tool_cargo( + let mut cargo = prepare_tool_cargo( builder, compiler, Mode::ToolRustc, @@ -299,6 +318,8 @@ macro_rules! lint_any { &[], ); + self.config.apply_clippy_cfg(&mut cargo, builder); + let _guard = builder.msg_tool( Kind::Clippy, Mode::ToolRustc, @@ -370,7 +391,7 @@ impl Step for CI { } fn make_run(run: RunConfig<'_>) { - let config = LintConfig::new(run.builder); + let config = LintConfig::new(run.builder, None); run.builder.ensure(CI { target: run.target, config }); } @@ -382,6 +403,7 @@ impl Step for CI { warn: vec![], deny: vec!["warnings".into()], forbid: vec![], + clippy_cfg_path: None, }), }); let library_clippy_cfg = LintConfig { @@ -400,6 +422,7 @@ impl Step for CI { "clippy::to_string_in_format_args".into(), ], forbid: vec![], + clippy_cfg_path: None, }; builder.ensure(Std { target: self.target, @@ -425,6 +448,7 @@ impl Step for CI { "clippy::to_string_in_format_args".into(), ], forbid: vec![], + clippy_cfg_path: None, }; builder.ensure(Rustc { target: self.target, @@ -437,6 +461,7 @@ impl Step for CI { warn: vec![], deny: vec!["warnings".into()], forbid: vec![], + clippy_cfg_path: None, }; builder.ensure(CodegenGcc { target: self.target, From 285a8904b221c529c1edfa4fa12b5602825d8e2f Mon Sep 17 00:00:00 2001 From: klensy Date: Fri, 28 Feb 2025 15:10:20 +0300 Subject: [PATCH 2/4] apply clippy.toml to bootstrap and compiler --- src/bootstrap/src/core/build_steps/clippy.rs | 51 ++++++++++++++------ src/etc/clippy_configs/bootstrap/clippy.toml | 1 + src/etc/clippy_configs/compiler/clippy.toml | 1 + 3 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/etc/clippy_configs/bootstrap/clippy.toml create mode 100644 src/etc/clippy_configs/compiler/clippy.toml diff --git a/src/bootstrap/src/core/build_steps/clippy.rs b/src/bootstrap/src/core/build_steps/clippy.rs index e5bf466d57a33..24ed827d401a0 100644 --- a/src/bootstrap/src/core/build_steps/clippy.rs +++ b/src/bootstrap/src/core/build_steps/clippy.rs @@ -108,7 +108,8 @@ impl LintConfig { } } - fn merge(&self, other: &Self) -> Self { + /// prefer_self - use self.clippy_cfg_path when merging, otherwise - other.clippy_cfg_path + fn merge(&self, other: &Self, prefer_self: bool) -> Self { let merged = |self_attr: &[String], other_attr: &[String]| -> Vec { self_attr.iter().cloned().chain(other_attr.iter().cloned()).collect() }; @@ -120,7 +121,11 @@ impl LintConfig { forbid: merged(&self.forbid, &other.forbid), // FIXME: this skip merging clippy.toml, // but maybe there is a better way? - clippy_cfg_path: self.clippy_cfg_path.clone(), + clippy_cfg_path: if prefer_self { + self.clippy_cfg_path.clone() + } else { + other.clippy_cfg_path.clone() + }, } } @@ -212,7 +217,10 @@ impl Step for Rustc { fn make_run(run: RunConfig<'_>) { let crates = run.make_run_crates(Alias::Compiler); - let config = LintConfig::new(run.builder, None); + let config = LintConfig::new( + run.builder, + Some("src/etc/clippy_configs/compiler/clippy.toml".into()), + ); run.builder.ensure(Rustc { target: run.target, config, crates }); } @@ -274,6 +282,7 @@ impl Step for Rustc { macro_rules! lint_any { ($( $name:ident, $path:expr, $readable_name:expr + $(,clippy_cfg = $cfg_path:expr)? $(,lint_by_default = $lint_by_default:expr)* ; )+) => { @@ -294,7 +303,14 @@ macro_rules! lint_any { } fn make_run(run: RunConfig<'_>) { - let config = LintConfig::new(run.builder, None); + #[allow(unused_mut, unused_assignments)] // optional cfg_path + let mut clippy_cfg: Option = None; + + $( + clippy_cfg = Some($cfg_path.into()); + )? + + let config = LintConfig::new(run.builder, clippy_cfg); run.builder.ensure($name { target: run.target, config, @@ -349,7 +365,7 @@ macro_rules! lint_any { } lint_any!( - Bootstrap, "src/bootstrap", "bootstrap"; + Bootstrap, "src/bootstrap", "bootstrap", clippy_cfg = "src/etc/clippy_configs/bootstrap/clippy.toml"; BuildHelper, "src/build_helper", "build_helper"; BuildManifest, "src/tools/build-manifest", "build-manifest"; CargoMiri, "src/tools/miri/cargo-miri", "cargo-miri"; @@ -398,13 +414,16 @@ impl Step for CI { fn run(self, builder: &Builder<'_>) -> Self::Output { builder.ensure(Bootstrap { target: self.target, - config: self.config.merge(&LintConfig { - allow: vec![], - warn: vec![], - deny: vec!["warnings".into()], - forbid: vec![], - clippy_cfg_path: None, - }), + config: self.config.merge( + &LintConfig { + allow: vec![], + warn: vec![], + deny: vec!["warnings".into()], + forbid: vec![], + clippy_cfg_path: Some("src/etc/clippy_configs/bootstrap/clippy.toml".into()), + }, + false, + ), }); let library_clippy_cfg = LintConfig { allow: vec!["clippy::all".into()], @@ -426,7 +445,7 @@ impl Step for CI { }; builder.ensure(Std { target: self.target, - config: self.config.merge(&library_clippy_cfg), + config: self.config.merge(&library_clippy_cfg, true), crates: vec![], }); @@ -448,11 +467,11 @@ impl Step for CI { "clippy::to_string_in_format_args".into(), ], forbid: vec![], - clippy_cfg_path: None, + clippy_cfg_path: Some("src/etc/clippy_configs/compiler/clippy.toml".into()), }; builder.ensure(Rustc { target: self.target, - config: self.config.merge(&compiler_clippy_cfg), + config: self.config.merge(&compiler_clippy_cfg, false), crates: vec![], }); @@ -465,7 +484,7 @@ impl Step for CI { }; builder.ensure(CodegenGcc { target: self.target, - config: self.config.merge(&rustc_codegen_gcc), + config: self.config.merge(&rustc_codegen_gcc, true), }); } } diff --git a/src/etc/clippy_configs/bootstrap/clippy.toml b/src/etc/clippy_configs/bootstrap/clippy.toml new file mode 100644 index 0000000000000..cda8d17eed44c --- /dev/null +++ b/src/etc/clippy_configs/bootstrap/clippy.toml @@ -0,0 +1 @@ +avoid-breaking-exported-api = false diff --git a/src/etc/clippy_configs/compiler/clippy.toml b/src/etc/clippy_configs/compiler/clippy.toml new file mode 100644 index 0000000000000..cda8d17eed44c --- /dev/null +++ b/src/etc/clippy_configs/compiler/clippy.toml @@ -0,0 +1 @@ +avoid-breaking-exported-api = false From 47cce2160045d59248c991d67a9557788e0bcb61 Mon Sep 17 00:00:00 2001 From: klensy Date: Fri, 28 Feb 2025 15:18:49 +0300 Subject: [PATCH 3/4] fix name displayed when running x.py clippy librustdoc It was clippy, now - rustdoc. --- src/bootstrap/src/core/build_steps/clippy.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bootstrap/src/core/build_steps/clippy.rs b/src/bootstrap/src/core/build_steps/clippy.rs index 24ed827d401a0..d88b836c42dae 100644 --- a/src/bootstrap/src/core/build_steps/clippy.rs +++ b/src/bootstrap/src/core/build_steps/clippy.rs @@ -385,7 +385,7 @@ lint_any!( RemoteTestServer, "src/tools/remote-test-server", "remote-test-server"; Rls, "src/tools/rls", "rls"; RustAnalyzer, "src/tools/rust-analyzer", "rust-analyzer"; - Rustdoc, "src/librustdoc", "clippy"; + Rustdoc, "src/librustdoc", "rustdoc"; Rustfmt, "src/tools/rustfmt", "rustfmt"; RustInstaller, "src/tools/rust-installer", "rust-installer"; Tidy, "src/tools/tidy", "tidy"; From ba7eeacf7cc0537796751b2bef5fbd994a540807 Mon Sep 17 00:00:00 2001 From: klensy Date: Fri, 28 Feb 2025 19:29:42 +0300 Subject: [PATCH 4/4] fix bootstrap tests --- src/bootstrap/src/core/build_steps/clippy.rs | 2 +- src/bootstrap/src/core/config/tests.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bootstrap/src/core/build_steps/clippy.rs b/src/bootstrap/src/core/build_steps/clippy.rs index d88b836c42dae..68e4d684f403c 100644 --- a/src/bootstrap/src/core/build_steps/clippy.rs +++ b/src/bootstrap/src/core/build_steps/clippy.rs @@ -95,7 +95,7 @@ pub struct LintConfig { pub deny: Vec, pub forbid: Vec, // Path to folder containing clippy.toml, if any - clippy_cfg_path: Option, + pub clippy_cfg_path: Option, } impl LintConfig { diff --git a/src/bootstrap/src/core/config/tests.rs b/src/bootstrap/src/core/config/tests.rs index eff5e0337428c..1bad6dcc3cde8 100644 --- a/src/bootstrap/src/core/config/tests.rs +++ b/src/bootstrap/src/core/config/tests.rs @@ -318,7 +318,7 @@ fn order_of_clippy_rules() { let actual = match config.cmd.clone() { crate::Subcommand::Clippy { allow, deny, warn, forbid, .. } => { - let cfg = LintConfig { allow, deny, warn, forbid }; + let cfg = LintConfig { allow, deny, warn, forbid, clippy_cfg_path: None }; get_clippy_rules_in_order(&args, &cfg) } _ => panic!("invalid subcommand"), @@ -342,7 +342,7 @@ fn clippy_rule_separate_prefix() { let actual = match config.cmd.clone() { crate::Subcommand::Clippy { allow, deny, warn, forbid, .. } => { - let cfg = LintConfig { allow, deny, warn, forbid }; + let cfg = LintConfig { allow, deny, warn, forbid, clippy_cfg_path: None }; get_clippy_rules_in_order(&args, &cfg) } _ => panic!("invalid subcommand"),