From 92e9778f2a837fb4cd53f2d84f1cc450ffd03d5e Mon Sep 17 00:00:00 2001 From: Andres Riofrio Date: Mon, 20 Feb 2023 21:16:30 -0500 Subject: [PATCH] feat: run benchmarks in non-bench targets --- src/app.rs | 8 +++++--- src/instruments.rs | 6 ++++-- src/opt.rs | 25 ++++++++++++++++++++----- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/app.rs b/src/app.rs index b161d9b..888962e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -4,6 +4,7 @@ use std::path::{Path, PathBuf}; use std::process::Command; use anyhow::{anyhow, Result}; +use cargo::util::command_prelude::CompileMode; use cargo::{ core::Workspace, ops::CompileOptions, @@ -147,7 +148,9 @@ fn build_target(cargo_options: &CargoOpts, workspace: &Workspace) -> Result Ok(unit_output.path.clone()), [] => Err(anyhow!("no targets found")), other => Err(anyhow!( @@ -166,10 +169,9 @@ fn build_target(cargo_options: &CargoOpts, workspace: &Workspace) -> Result Result { - use cargo::core::compiler::CompileMode; use cargo::ops::CompileFilter; - let mut compile_options = CompileOptions::new(cfg, CompileMode::Build)?; + let mut compile_options = CompileOptions::new(cfg, cargo_options.mode)?; let profile = &cargo_options.profile; compile_options.build_config.requested_profile = InternedString::new(profile); diff --git a/src/instruments.rs b/src/instruments.rs index 7eb4efe..cdd165c 100644 --- a/src/instruments.rs +++ b/src/instruments.rs @@ -456,8 +456,10 @@ pub(crate) fn profile_target( command.arg(target_filepath); - if !app_config.target_args.is_empty() { - command.args(app_config.target_args.as_slice()); + let bench_args = app_config.benchmarks.then_some("--bench".to_string()); + let target_args = bench_args.iter().chain(&app_config.target_args).collect::>(); + if !target_args.is_empty() { + command.args(target_args.as_slice()); } let output = command.output()?; diff --git a/src/opt.rs b/src/opt.rs index b66db13..ca025ac 100644 --- a/src/opt.rs +++ b/src/opt.rs @@ -3,6 +3,7 @@ use anyhow::Result; use cargo::core::resolver::CliFeatures; use cargo::ops::Packages; +use cargo::util::command_prelude::CompileMode; use std::fmt; use std::path::PathBuf; use structopt::StructOpt; @@ -53,6 +54,8 @@ pub(crate) struct AppConfig { bin: Option, /// Benchmark target to run + /// + /// Use --benchmarks to execute benchmarks in non-bench targets. #[structopt(long, group = "target", value_name = "NAME")] bench: Option, @@ -64,6 +67,10 @@ pub(crate) struct AppConfig { #[structopt(long, value_name = "NAME")] profile: Option, + /// Execute benchmarks like `cargo bench`. + #[structopt(long)] + pub(crate) benchmarks: bool, + /// Output .trace file to the given path /// /// Defaults to `target/instruments/{name}_{template-name}_{date}.trace`. @@ -161,6 +168,7 @@ impl fmt::Display for Target { /// Cargo-specific options pub(crate) struct CargoOpts { + pub(crate) mode: CompileMode, pub(crate) package: Package, pub(crate) target: Target, pub(crate) profile: String, @@ -169,6 +177,7 @@ pub(crate) struct CargoOpts { impl AppConfig { pub(crate) fn to_cargo_opts(&self) -> Result { + let mode = if self.benchmarks { CompileMode::Bench } else { CompileMode::Build }; let package = self.get_package(); let target = self.get_target(); let features = self.features.clone().map(|s| vec![s]).unwrap_or_default(); @@ -177,11 +186,17 @@ impl AppConfig { self.all_features, !self.no_default_features, )?; - let profile = self - .profile - .clone() - .unwrap_or_else(|| (if self.release { "release" } else { "dev" }).to_owned()); - Ok(CargoOpts { package, target, profile, features }) + let profile = self.profile.clone().unwrap_or_else(|| { + (if self.release { + "release" + } else if self.benchmarks { + "bench" + } else { + "dev" + }) + .to_owned() + }); + Ok(CargoOpts { mode, package, target, profile, features }) } fn get_package(&self) -> Package {