feat: allow customizing the command for running build scripts

This commit is contained in:
Deadbeef 2022-04-11 13:13:50 +10:00
parent 24cf957627
commit 73a033e77c
No known key found for this signature in database
GPG key ID: 6D017A96D8E6C2F9
5 changed files with 53 additions and 15 deletions

View file

@ -42,22 +42,15 @@ pub(crate) struct BuildScriptOutput {
}
impl WorkspaceBuildScripts {
pub(crate) fn run(
config: &CargoConfig,
workspace: &CargoWorkspace,
progress: &dyn Fn(String),
) -> Result<WorkspaceBuildScripts> {
fn build_command(config: &CargoConfig) -> Command {
if let Some([program, args @ ..]) = config.run_build_script_command.as_deref() {
let mut cmd = Command::new(program);
cmd.args(args);
return cmd;
}
let mut cmd = Command::new(toolchain::cargo());
if config.wrap_rustc_in_build_scripts {
// Setup RUSTC_WRAPPER to point to `rust-analyzer` binary itself. We use
// that to compile only proc macros and build scripts during the initial
// `cargo check`.
let myself = std::env::current_exe()?;
cmd.env("RUSTC_WRAPPER", myself);
cmd.env("RA_RUSTC_WRAPPER", "1");
}
cmd.current_dir(workspace.workspace_root());
cmd.args(&["check", "--quiet", "--workspace", "--message-format=json"]);
// --all-targets includes tests, benches and examples in addition to the
@ -81,6 +74,26 @@ impl WorkspaceBuildScripts {
}
}
cmd
}
pub(crate) fn run(
config: &CargoConfig,
workspace: &CargoWorkspace,
progress: &dyn Fn(String),
) -> Result<WorkspaceBuildScripts> {
let mut cmd = Self::build_command(config);
if config.wrap_rustc_in_build_scripts {
// Setup RUSTC_WRAPPER to point to `rust-analyzer` binary itself. We use
// that to compile only proc macros and build scripts during the initial
// `cargo check`.
let myself = std::env::current_exe()?;
cmd.env("RUSTC_WRAPPER", myself);
cmd.env("RA_RUSTC_WRAPPER", "1");
}
cmd.current_dir(workspace.workspace_root());
cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).stdin(Stdio::null());
let mut res = WorkspaceBuildScripts::default();
@ -104,7 +117,7 @@ impl WorkspaceBuildScripts {
}
// Copy-pasted from existing cargo_metadata. It seems like we
// should be using sered_stacker here?
// should be using serde_stacker here?
let mut deserializer = serde_json::Deserializer::from_str(line);
deserializer.disable_recursion_limit();
let message = Message::deserialize(&mut deserializer)

View file

@ -96,6 +96,8 @@ pub struct CargoConfig {
pub unset_test_crates: UnsetTestCrates,
pub wrap_rustc_in_build_scripts: bool,
pub run_build_script_command: Option<Vec<String>>,
}
impl CargoConfig {