use clap;
use log::debug;
use crate::cmake;
use crate::preset;
use crate::runner;
use crate::utils;
#[derive(clap::Parser, Debug)]
pub struct BuildArgs {
#[arg(short = 'j', long, default_value_t = utils::num_cpus())]
pub jobs: u32,
#[arg(short, long)]
pub target: Option<String>,
#[arg(long)]
pub clean: bool,
#[arg(short = 'k', long)]
pub keep_going: bool,
#[arg(short = 'D', value_name = "VAR=VALUE")]
pub defines: Vec<String>,
#[arg(short, long)]
pub reconfigure: bool,
#[arg(short, long)]
pub fresh: bool,
#[arg(short, long)]
pub verbose: bool,
}
pub fn run(ctx: &runner::Context, args: BuildArgs) -> anyhow::Result<()> {
preset::ensure_project_root(ctx)?;
debug!("Begin");
let preset = preset::resolve(ctx, None)?;
let bdir = cmake::binary_dir(&preset);
if args.reconfigure || args.fresh || bdir.is_none() {
debug!("Begin reconfigure");
cmake::reconf(ctx, &preset, args.fresh, &args.defines)?;
}
if bdir.is_some() && !args.defines.is_empty() && !args.reconfigure && !args.fresh {
anyhow::bail!(
"{} -D values given but build directory exists and no --reconfigure;
values will not be applied",
args.defines.len()
);
}
let mut cmd = cmake::base_build(&preset);
cmd.args(["--parallel", &args.jobs.to_string()]);
if args.clean {
cmd.arg("--clean-first");
}
if args.verbose {
cmd.arg("--verbose");
}
if let Some(target) = &args.target {
cmd.args(["--target", target]);
}
if args.keep_going {
cmd = cmake::with_keep_going(cmd, &preset)?;
}
ctx.run(&mut cmd)?;
Ok(())
}