From 90bb3249069cca053e7fd177f191b3d06fc06527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= Date: Sun, 8 Jun 2025 18:18:01 +0200 Subject: [PATCH] xtask: Add --loom argument to test For now filter to only rtic-sync in ci subcommand --- xtask/src/argument_parsing.rs | 21 +++++++++++++++++--- xtask/src/cargo_command.rs | 37 +++++++++++++++++++++++++++++++---- xtask/src/cargo_test | 1 + xtask/src/main.rs | 17 ++++++++++++++-- xtask/src/run.rs | 7 ++++--- 5 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 xtask/src/cargo_test diff --git a/xtask/src/argument_parsing.rs b/xtask/src/argument_parsing.rs index 07c633044be..ae73782eccc 100644 --- a/xtask/src/argument_parsing.rs +++ b/xtask/src/argument_parsing.rs @@ -93,7 +93,7 @@ impl Package { pub struct TestMetadata {} impl TestMetadata { - pub fn match_package(package: Package, backend: Backends) -> CargoCommand<'static> { + pub fn match_package(package: Package, backend: Backends, loom: bool) -> CargoCommand<'static> { match package { Package::Rtic => { let features = Some(backend.to_target().and_features(backend.to_rtic_feature())); @@ -102,6 +102,7 @@ impl TestMetadata { features, test: Some("ui".to_owned()), deny_warnings: true, + loom, } } Package::RticMacros => CargoCommand::Test { @@ -109,30 +110,35 @@ impl TestMetadata { features: Some(backend.to_rtic_macros_feature().to_owned()), test: None, deny_warnings: true, + loom, }, Package::RticSync => CargoCommand::Test { package: Some(package.name()), features: Some("testing".to_owned()), test: None, deny_warnings: true, + loom, }, Package::RticCommon => CargoCommand::Test { package: Some(package.name()), features: Some("testing".to_owned()), test: None, deny_warnings: true, + loom, }, Package::RticMonotonics => CargoCommand::Test { package: Some(package.name()), features: None, test: None, deny_warnings: true, + loom, }, Package::RticTime => CargoCommand::Test { package: Some(package.name()), features: Some("critical-section/std".into()), test: None, deny_warnings: true, + loom, }, } } @@ -489,7 +495,7 @@ pub enum Commands { Doc(Arg), /// Run tests - Test(PackageOpt), + Test(TestOpt), /// Build books with mdbook Book(Arg), @@ -511,12 +517,21 @@ pub struct FormatOpt { } #[derive(Args, Debug, Clone, Default)] +pub struct TestOpt { + #[clap(flatten)] + pub package: PackageOpt, + /// Should tests be loom tests + #[clap(short, long)] + pub loom: bool, +} + +#[derive(Args, Debug, Clone, Copy, Default)] /// Restrict to package, or run on whole workspace pub struct PackageOpt { /// For which package/workspace member to operate /// /// If omitted, work on all - package: Option, + pub package: Option, } impl PackageOpt { diff --git a/xtask/src/cargo_command.rs b/xtask/src/cargo_command.rs index 1fe37d20446..f73f47a4a0f 100644 --- a/xtask/src/cargo_command.rs +++ b/xtask/src/cargo_command.rs @@ -94,6 +94,7 @@ pub enum CargoCommand<'a> { features: Option, test: Option, deny_warnings: bool, + loom: bool, }, Book { arguments: Option, @@ -336,6 +337,7 @@ impl core::fmt::Display for CargoCommand<'_> { features, test, deny_warnings, + loom: _, } => { let p = p(package); let test = test @@ -576,15 +578,23 @@ impl<'a> CargoCommand<'a> { test, // deny_warnings is exposed through `extra_env` deny_warnings: _, + loom, } => { - let extra = if let Some(test) = test { + let mut extra = if let Some(test) = test { vec!["--test", test] } else { vec![] }; + + let cargofeatures = if *loom { + extra.push(" --lib"); + &None + } else { + features + }; let package = p(package); let extra = extra.into_iter().chain(package); - self.build_args(false, &None, features, None, extra) + self.build_args(false, &None, cargofeatures, None, extra) } CargoCommand::Book { arguments } => { let mut args = vec![]; @@ -740,14 +750,33 @@ impl<'a> CargoCommand<'a> { CargoCommand::Check { deny_warnings, .. } | CargoCommand::ExampleCheck { deny_warnings, .. } - | CargoCommand::Build { deny_warnings, .. } - | CargoCommand::Test { deny_warnings, .. } => { + | CargoCommand::Build { deny_warnings, .. } => { if *deny_warnings { Some(("RUSTFLAGS", "-D warnings".to_string())) } else { None } } + CargoCommand::Test { + deny_warnings, + loom, + .. + } => { + let mut combined_flags = vec![""]; + + if *deny_warnings { + combined_flags.push("-D warnings"); + } + if *loom { + combined_flags.push("--cfg loom"); + } + if !combined_flags.is_empty() { + let rust_flags = combined_flags.join(" ").to_string(); + Some(("RUSTFLAGS", rust_flags)) + } else { + None + } + } _ => None, } } diff --git a/xtask/src/cargo_test b/xtask/src/cargo_test new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/xtask/src/cargo_test @@ -0,0 +1 @@ + diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 5e86fe5d40e..1702a8bde53 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -3,7 +3,7 @@ mod build; mod cargo_command; mod run; -use argument_parsing::{ExtraArguments, FormatOpt, PackageOpt}; +use argument_parsing::{ExtraArguments, FormatOpt, Package, PackageOpt, TestOpt}; use clap::Parser; use core::fmt; use std::{path::Path, str}; @@ -181,6 +181,14 @@ fn main() -> anyhow::Result<()> { // Default set of all packages // CI always runs on all packages let package = PackageOpt::default(); + let testopts = TestOpt::default(); + // Currently only rtic-sync supports loom tests + let testoptsloom = TestOpt { + loom: true, + package: PackageOpt { + package: Some(Package::RticSync), + }, + }; let final_run_results = match &cli.command { Commands::AllCi(args) => { @@ -263,7 +271,12 @@ fn main() -> anyhow::Result<()> { return handle_results(globals, results) .map_err(|_| anyhow::anyhow!("Commands failed")); } - results.append(&mut cargo_test(globals, &package, backend)); + results.append(&mut cargo_test(globals, &testopts, backend)); + if args.failearly { + return handle_results(globals, results) + .map_err(|_| anyhow::anyhow!("Commands failed")); + } + results.append(&mut cargo_test(globals, &testoptsloom, backend)); if args.failearly { return handle_results(globals, results) .map_err(|_| anyhow::anyhow!("Commands failed")); diff --git a/xtask/src/run.rs b/xtask/src/run.rs index 55ad44c23e6..a1222d44757 100644 --- a/xtask/src/run.rs +++ b/xtask/src/run.rs @@ -17,7 +17,7 @@ use iter::{into_iter, CoalescingRunner}; use crate::{ argument_parsing::{ Backends, BuildOrCheck, ExtraArguments, FormatOpt, Globals, PackageOpt, Platforms, - TestMetadata, + TestMetadata, TestOpt, }, cargo_command::{BuildMode, CargoCommand}, }; @@ -341,14 +341,15 @@ pub fn cargo_doc<'c>( /// If no package is specified, loop through all packages pub fn cargo_test<'c>( globals: &Globals, - package: &'c PackageOpt, + testopts: &'c TestOpt, backend: Backends, ) -> Vec> { info!("Running cargo test on backend: {backend:?}"); + let TestOpt { package, loom } = testopts; package .packages() .map(|p| { - let meta = TestMetadata::match_package(p, backend); + let meta = TestMetadata::match_package(p, backend, *loom); (globals, meta, false) }) .run_and_coalesce()