mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 06:41:48 +00:00
feat: allow customizing the command for running build scripts
This commit is contained in:
parent
24cf957627
commit
73a033e77c
5 changed files with 53 additions and 15 deletions
|
@ -42,22 +42,15 @@ pub(crate) struct BuildScriptOutput {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WorkspaceBuildScripts {
|
impl WorkspaceBuildScripts {
|
||||||
pub(crate) fn run(
|
fn build_command(config: &CargoConfig) -> Command {
|
||||||
config: &CargoConfig,
|
if let Some([program, args @ ..]) = config.run_build_script_command.as_deref() {
|
||||||
workspace: &CargoWorkspace,
|
let mut cmd = Command::new(program);
|
||||||
progress: &dyn Fn(String),
|
cmd.args(args);
|
||||||
) -> Result<WorkspaceBuildScripts> {
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
let mut cmd = Command::new(toolchain::cargo());
|
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"]);
|
cmd.args(&["check", "--quiet", "--workspace", "--message-format=json"]);
|
||||||
|
|
||||||
// --all-targets includes tests, benches and examples in addition to the
|
// --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());
|
cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).stdin(Stdio::null());
|
||||||
|
|
||||||
let mut res = WorkspaceBuildScripts::default();
|
let mut res = WorkspaceBuildScripts::default();
|
||||||
|
@ -104,7 +117,7 @@ impl WorkspaceBuildScripts {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy-pasted from existing cargo_metadata. It seems like we
|
// 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);
|
let mut deserializer = serde_json::Deserializer::from_str(line);
|
||||||
deserializer.disable_recursion_limit();
|
deserializer.disable_recursion_limit();
|
||||||
let message = Message::deserialize(&mut deserializer)
|
let message = Message::deserialize(&mut deserializer)
|
||||||
|
|
|
@ -96,6 +96,8 @@ pub struct CargoConfig {
|
||||||
pub unset_test_crates: UnsetTestCrates,
|
pub unset_test_crates: UnsetTestCrates,
|
||||||
|
|
||||||
pub wrap_rustc_in_build_scripts: bool,
|
pub wrap_rustc_in_build_scripts: bool,
|
||||||
|
|
||||||
|
pub run_build_script_command: Option<Vec<String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CargoConfig {
|
impl CargoConfig {
|
||||||
|
|
|
@ -79,6 +79,10 @@ config_data! {
|
||||||
/// Run build scripts (`build.rs`) for more precise code analysis.
|
/// Run build scripts (`build.rs`) for more precise code analysis.
|
||||||
cargo_runBuildScripts |
|
cargo_runBuildScripts |
|
||||||
cargo_loadOutDirsFromCheck: bool = "true",
|
cargo_loadOutDirsFromCheck: bool = "true",
|
||||||
|
/// Advanced option, fully override the command rust-analyzer uses to
|
||||||
|
/// run build scripts and build procedural macros. The command should
|
||||||
|
/// include `--message-format=json` or a similar option.
|
||||||
|
cargo_runBuildScriptsCommand: Option<Vec<String>> = "null",
|
||||||
/// Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to
|
/// Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to
|
||||||
/// avoid compiling unnecessary things.
|
/// avoid compiling unnecessary things.
|
||||||
cargo_useRustcWrapperForBuildScripts: bool = "true",
|
cargo_useRustcWrapperForBuildScripts: bool = "true",
|
||||||
|
@ -803,6 +807,7 @@ impl Config {
|
||||||
rustc_source,
|
rustc_source,
|
||||||
unset_test_crates: UnsetTestCrates::Only(self.data.cargo_unsetTest.clone()),
|
unset_test_crates: UnsetTestCrates::Only(self.data.cargo_unsetTest.clone()),
|
||||||
wrap_rustc_in_build_scripts: self.data.cargo_useRustcWrapperForBuildScripts,
|
wrap_rustc_in_build_scripts: self.data.cargo_useRustcWrapperForBuildScripts,
|
||||||
|
run_build_script_command: self.data.cargo_runBuildScriptsCommand.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,13 @@ List of features to activate.
|
||||||
--
|
--
|
||||||
Run build scripts (`build.rs`) for more precise code analysis.
|
Run build scripts (`build.rs`) for more precise code analysis.
|
||||||
--
|
--
|
||||||
|
[[rust-analyzer.cargo.runBuildScriptsCommand]]rust-analyzer.cargo.runBuildScriptsCommand (default: `null`)::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
Advanced option, fully override the command rust-analyzer uses to
|
||||||
|
run build scripts and build procedural macros. The command should
|
||||||
|
include `--message-format=json` or a similar option.
|
||||||
|
--
|
||||||
[[rust-analyzer.cargo.useRustcWrapperForBuildScripts]]rust-analyzer.cargo.useRustcWrapperForBuildScripts (default: `true`)::
|
[[rust-analyzer.cargo.useRustcWrapperForBuildScripts]]rust-analyzer.cargo.useRustcWrapperForBuildScripts (default: `true`)::
|
||||||
+
|
+
|
||||||
--
|
--
|
||||||
|
|
|
@ -476,6 +476,17 @@
|
||||||
"default": true,
|
"default": true,
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
|
"rust-analyzer.cargo.runBuildScriptsCommand": {
|
||||||
|
"markdownDescription": "Advanced option, fully override the command rust-analyzer uses to\nrun build scripts and build procedural macros. The command should\ninclude `--message-format=json` or a similar option.",
|
||||||
|
"default": null,
|
||||||
|
"type": [
|
||||||
|
"null",
|
||||||
|
"array"
|
||||||
|
],
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
"rust-analyzer.cargo.useRustcWrapperForBuildScripts": {
|
"rust-analyzer.cargo.useRustcWrapperForBuildScripts": {
|
||||||
"markdownDescription": "Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to\navoid compiling unnecessary things.",
|
"markdownDescription": "Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to\navoid compiling unnecessary things.",
|
||||||
"default": true,
|
"default": true,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue