From fae15db2163996828c12a7981c1f679b0c7a5cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= Date: Wed, 1 Mar 2023 00:25:05 +0100 Subject: xtask: Split out cargo commands --- xtask/src/cargo_commands.rs | 267 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 xtask/src/cargo_commands.rs (limited to 'xtask/src/cargo_commands.rs') diff --git a/xtask/src/cargo_commands.rs b/xtask/src/cargo_commands.rs new file mode 100644 index 0000000..996fa9c --- /dev/null +++ b/xtask/src/cargo_commands.rs @@ -0,0 +1,267 @@ +use crate::{ + argument_parsing::{Backends, BuildOrCheck, Package, PackageOpt, Sizearguments, TestMetadata}, + command::{BuildMode, CargoCommand}, + command_parser, package_feature_extractor, DEFAULT_FEATURES, +}; +use log::error; +use rayon::prelude::*; + +/// Cargo command to either build or check +pub fn cargo( + operation: BuildOrCheck, + cargoarg: &Option<&str>, + package: &PackageOpt, + backend: Backends, +) -> anyhow::Result<()> { + let features = package_feature_extractor(package, backend); + + let command = match operation { + BuildOrCheck::Check => CargoCommand::Check { + cargoarg, + package: package.package, + target: backend.to_target(), + features, + mode: BuildMode::Release, + }, + BuildOrCheck::Build => CargoCommand::Build { + cargoarg, + package: package.package, + target: backend.to_target(), + features, + mode: BuildMode::Release, + }, + }; + command_parser(&command, false)?; + Ok(()) +} + +/// Cargo command to either build or check all examples +/// +/// The examples are in rtic/examples +pub fn cargo_example( + operation: BuildOrCheck, + cargoarg: &Option<&str>, + backend: Backends, + examples: &[String], +) -> anyhow::Result<()> { + examples.into_par_iter().for_each(|example| { + let features = Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )); + + let command = match operation { + BuildOrCheck::Check => CargoCommand::ExampleCheck { + cargoarg, + example, + target: backend.to_target(), + features, + mode: BuildMode::Release, + }, + BuildOrCheck::Build => CargoCommand::ExampleBuild { + cargoarg, + example, + target: backend.to_target(), + features, + mode: BuildMode::Release, + }, + }; + + if let Err(err) = command_parser(&command, false) { + error!("{err}"); + } + }); + + Ok(()) +} + +/// Run cargo clippy on selected package +pub fn cargo_clippy( + cargoarg: &Option<&str>, + package: &PackageOpt, + backend: Backends, +) -> anyhow::Result<()> { + let features = package_feature_extractor(package, backend); + command_parser( + &CargoCommand::Clippy { + cargoarg, + package: package.package, + target: backend.to_target(), + features, + }, + false, + )?; + Ok(()) +} + +/// Run cargo fmt on selected package +pub fn cargo_format( + cargoarg: &Option<&str>, + package: &PackageOpt, + check_only: bool, +) -> anyhow::Result<()> { + command_parser( + &CargoCommand::Format { + cargoarg, + package: package.package, + check_only, + }, + false, + )?; + Ok(()) +} + +/// Run cargo doc +pub fn cargo_doc(cargoarg: &Option<&str>, backend: Backends) -> anyhow::Result<()> { + let features = Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )); + + command_parser(&CargoCommand::Doc { cargoarg, features }, false)?; + Ok(()) +} + +/// Run cargo test on the selcted package or all packages +/// +/// If no package is specified, loop through all packages +pub fn cargo_test(package: &PackageOpt, backend: Backends) -> anyhow::Result<()> { + if let Some(package) = package.package { + let cmd = match package { + Package::Rtic => TestMetadata::match_package(package, backend), + Package::RticArbiter => TestMetadata::match_package(package, backend), + Package::RticChannel => TestMetadata::match_package(package, backend), + Package::RticCommon => TestMetadata::match_package(package, backend), + Package::RticMacros => TestMetadata::match_package(package, backend), + Package::RticMonotonics => TestMetadata::match_package(package, backend), + Package::RticTime => TestMetadata::match_package(package, backend), + }; + command_parser(&cmd, false)?; + } else { + // Iterate over all workspace packages + for package in [ + Package::Rtic, + Package::RticArbiter, + Package::RticChannel, + Package::RticCommon, + Package::RticMacros, + Package::RticMonotonics, + Package::RticTime, + ] { + let mut error_messages = vec![]; + let cmd = &TestMetadata::match_package(package, backend); + if let Err(err) = command_parser(&cmd, false) { + error_messages.push(err); + } + + if !error_messages.is_empty() { + for err in error_messages { + error!("{err}"); + } + } + } + } + Ok(()) +} + +/// Use mdbook to build the book +pub fn cargo_book(cargoarg: &Option<&str>) -> anyhow::Result<()> { + command_parser( + &CargoCommand::Book { + mdbookarg: cargoarg, + }, + false, + )?; + Ok(()) +} + +/// Run examples +/// +/// Supports updating the expected output via the overwrite argument +pub fn run_test( + cargoarg: &Option<&str>, + backend: Backends, + examples: &[String], + overwrite: bool, +) -> anyhow::Result<()> { + examples.into_par_iter().for_each(|example| { + let cmd = CargoCommand::ExampleBuild { + cargoarg: &Some("--quiet"), + example, + target: backend.to_target(), + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), + mode: BuildMode::Release, + }; + if let Err(err) = command_parser(&cmd, false) { + error!("{err}"); + } + + let cmd = CargoCommand::Qemu { + cargoarg, + example, + target: backend.to_target(), + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), + mode: BuildMode::Release, + }; + + if let Err(err) = command_parser(&cmd, overwrite) { + error!("{err}"); + } + }); + + Ok(()) +} + +/// Check the binary sizes of examples +pub fn build_and_check_size( + cargoarg: &Option<&str>, + backend: Backends, + examples: &[String], + size_arguments: &Option, +) -> anyhow::Result<()> { + examples.into_par_iter().for_each(|example| { + // Make sure the requested example(s) are built + let cmd = CargoCommand::ExampleBuild { + cargoarg: &Some("--quiet"), + example, + target: backend.to_target(), + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), + mode: BuildMode::Release, + }; + if let Err(err) = command_parser(&cmd, false) { + error!("{err}"); + } + + let cmd = CargoCommand::ExampleSize { + cargoarg, + example, + target: backend.to_target(), + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), + mode: BuildMode::Release, + arguments: size_arguments.clone(), + }; + if let Err(err) = command_parser(&cmd, false) { + error!("{err}"); + } + }); + + Ok(()) +} -- cgit v1.2.3 From 39a06368c8f1e6e77c1e838b0a8a39e548c344f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= Date: Thu, 2 Mar 2023 19:40:50 +0100 Subject: xtask: rtic-sync --- xtask/src/cargo_commands.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'xtask/src/cargo_commands.rs') diff --git a/xtask/src/cargo_commands.rs b/xtask/src/cargo_commands.rs index 996fa9c..31250d4 100644 --- a/xtask/src/cargo_commands.rs +++ b/xtask/src/cargo_commands.rs @@ -129,25 +129,16 @@ pub fn cargo_doc(cargoarg: &Option<&str>, backend: Backends) -> anyhow::Result<( /// If no package is specified, loop through all packages pub fn cargo_test(package: &PackageOpt, backend: Backends) -> anyhow::Result<()> { if let Some(package) = package.package { - let cmd = match package { - Package::Rtic => TestMetadata::match_package(package, backend), - Package::RticArbiter => TestMetadata::match_package(package, backend), - Package::RticChannel => TestMetadata::match_package(package, backend), - Package::RticCommon => TestMetadata::match_package(package, backend), - Package::RticMacros => TestMetadata::match_package(package, backend), - Package::RticMonotonics => TestMetadata::match_package(package, backend), - Package::RticTime => TestMetadata::match_package(package, backend), - }; + let cmd = TestMetadata::match_package(package, backend); command_parser(&cmd, false)?; } else { // Iterate over all workspace packages for package in [ Package::Rtic, - Package::RticArbiter, - Package::RticChannel, Package::RticCommon, Package::RticMacros, Package::RticMonotonics, + Package::RticSync, Package::RticTime, ] { let mut error_messages = vec![]; -- cgit v1.2.3 From 3908cbf7e8f3a0e7da7dbe132afd387f227a8a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= Date: Thu, 2 Mar 2023 22:02:19 +0100 Subject: xtask: Allow passing arguments to book and doc --- xtask/src/cargo_commands.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'xtask/src/cargo_commands.rs') diff --git a/xtask/src/cargo_commands.rs b/xtask/src/cargo_commands.rs index 31250d4..f262c9f 100644 --- a/xtask/src/cargo_commands.rs +++ b/xtask/src/cargo_commands.rs @@ -1,5 +1,5 @@ use crate::{ - argument_parsing::{Backends, BuildOrCheck, Package, PackageOpt, Sizearguments, TestMetadata}, + argument_parsing::{Backends, BuildOrCheck, ExtraArguments, Package, PackageOpt, TestMetadata}, command::{BuildMode, CargoCommand}, command_parser, package_feature_extractor, DEFAULT_FEATURES, }; @@ -113,14 +113,25 @@ pub fn cargo_format( } /// Run cargo doc -pub fn cargo_doc(cargoarg: &Option<&str>, backend: Backends) -> anyhow::Result<()> { +pub fn cargo_doc( + cargoarg: &Option<&str>, + backend: Backends, + arguments: &Option, +) -> anyhow::Result<()> { let features = Some(format!( "{},{}", DEFAULT_FEATURES, backend.to_rtic_feature() )); - command_parser(&CargoCommand::Doc { cargoarg, features }, false)?; + command_parser( + &CargoCommand::Doc { + cargoarg, + features, + arguments: arguments.clone(), + }, + false, + )?; Ok(()) } @@ -158,10 +169,10 @@ pub fn cargo_test(package: &PackageOpt, backend: Backends) -> anyhow::Result<()> } /// Use mdbook to build the book -pub fn cargo_book(cargoarg: &Option<&str>) -> anyhow::Result<()> { +pub fn cargo_book(arguments: &Option) -> anyhow::Result<()> { command_parser( &CargoCommand::Book { - mdbookarg: cargoarg, + arguments: arguments.clone(), }, false, )?; @@ -218,7 +229,7 @@ pub fn build_and_check_size( cargoarg: &Option<&str>, backend: Backends, examples: &[String], - size_arguments: &Option, + arguments: &Option, ) -> anyhow::Result<()> { examples.into_par_iter().for_each(|example| { // Make sure the requested example(s) are built @@ -247,7 +258,7 @@ pub fn build_and_check_size( backend.to_rtic_feature() )), mode: BuildMode::Release, - arguments: size_arguments.clone(), + arguments: arguments.clone(), }; if let Err(err) = command_parser(&cmd, false) { error!("{err}"); -- cgit v1.2.3 From 3789798e33f613dbdc91576eb57bf7691ba0568a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= Date: Sat, 4 Mar 2023 20:52:29 +0100 Subject: xtask: clippy fixes --- xtask/src/cargo_commands.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xtask/src/cargo_commands.rs') diff --git a/xtask/src/cargo_commands.rs b/xtask/src/cargo_commands.rs index f262c9f..7ac7aea 100644 --- a/xtask/src/cargo_commands.rs +++ b/xtask/src/cargo_commands.rs @@ -154,7 +154,7 @@ pub fn cargo_test(package: &PackageOpt, backend: Backends) -> anyhow::Result<()> ] { let mut error_messages = vec![]; let cmd = &TestMetadata::match_package(package, backend); - if let Err(err) = command_parser(&cmd, false) { + if let Err(err) = command_parser(cmd, false) { error_messages.push(err); } -- cgit v1.2.3