mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 22:31:43 +00:00
Auto merge of #11956 - fee1-dead:master, r=flodiebold
feat: allow customizing the command for running build scripts I have tested this locally and it fixed #9201 with some small changes on the compiler side with suggestions from https://github.com/rust-analyzer/rust-analyzer/issues/9201#issuecomment-1019554086. I have also added an environment variable `IS_RA_BUILDSCRIPT_CHECK` for crates to detect that it is a check for buildscripts, and allows defaulting to bogus values for expected environment variables.
This commit is contained in:
commit
15844bf48c
5 changed files with 53 additions and 15 deletions
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue