From 4a5ad5b1ec8649119dba5448ee2d7db11dc9bb42 Mon Sep 17 00:00:00 2001 From: messense Date: Tue, 10 Jan 2023 14:14:20 +0800 Subject: [PATCH] Use `CARGO_ENCODED_RUSTFLAGS` instead of `RUSTFLAGS` https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags There are four mutually exclusive sources of extra flags. They are checked in order, with the first one being used: 1. `CARGO_ENCODED_RUSTFLAGS` environment variable. 2. `RUSTFLAGS` environment variable. 3. All matching `target..rustflags` and `target..rustflags` config entries joined together. 4. `build.rustflags` config value. This requires Rust 1.55+, our MSRV is 1.62 ATM so it's fine. --- Cargo.lock | 8 ++++---- src/compile.rs | 42 +++++++++++++++++------------------------- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d98b8d11..04e97b905 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -215,9 +215,9 @@ dependencies = [ [[package]] name = "cargo-config2" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a3dbc2202646fb5a83a0f0f45259be618f006862edc0d20938f247f2678706" +checksum = "2cac6a46d3472410bc331b230bac4ee58f89e0bb25f02e8cbccb2a211c368f8a" dependencies = [ "cfg-expr", "home", @@ -247,9 +247,9 @@ dependencies = [ [[package]] name = "cargo-xwin" -version = "0.13.6" +version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9653c9f9630bbdb6c3566f9e77ad568e38eeb4c4849b0913a65aa5c43c12df" +checksum = "c47154844233c35279d90d5a68beac22907d85442130d7398038197cfc37dbd2" dependencies = [ "anyhow", "cargo-config2", diff --git a/src/compile.rs b/src/compile.rs index 0cf593156..9fbbc3aef 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -176,7 +176,9 @@ fn compile_target( let target_triple = target.target_triple(); let manifest_dir = context.manifest_path.parent().unwrap(); - let mut rust_flags = get_rustflags(manifest_dir, target_triple)?; + let mut rustflags = cargo_config2::Config::load_with_cwd(manifest_dir)? + .rustflags(target_triple)? + .unwrap_or_default(); // We need to pass --bin / --lib match bridge_model { @@ -191,12 +193,15 @@ fn compile_target( // https://github.com/rust-lang/rust/issues/59302#issue-422994250 // We must only do this for libraries as it breaks binaries // For some reason this value is ignored when passed as rustc argument - if context.target.is_musl_target() { - let flags = rust_flags.get_or_insert_with(Default::default); - if !flags.contains("target-feature=-crt-static") { - debug!("Setting `-C target-features=-crt-static` for musl dylib"); - flags.push_str(" -C target-feature=-crt-static"); - } + if context.target.is_musl_target() + && !rustflags + .flags + .iter() + .any(|f| f == "target-feature=-crt-static") + { + debug!("Setting `-C target-features=-crt-static` for musl dylib"); + rustflags.push("-C"); + rustflags.push("target-feature=-crt-static"); } } } @@ -228,11 +233,11 @@ fn compile_target( cargo_rustc.args.extend(mac_args); } } else if target.is_emscripten() { - let flags = rust_flags.get_or_insert_with(Default::default); // Allow user to override these default flags - if !flags.contains("link-native-libraries") { + if !rustflags.flags.iter().any(|f| f == "link-native-libraries") { debug!("Setting `-Z link-native-libraries=no` for Emscripten"); - flags.push_str(" -Z link-native-libraries=no"); + rustflags.push("-Z"); + rustflags.push("link-native-libraries=no"); } let mut emscripten_args = Vec::new(); // Allow user to override these default settings @@ -336,8 +341,8 @@ fn compile_target( // but forwarding stderr is still useful in case there some non-json error .stderr(Stdio::inherit()); - if let Some(flags) = rust_flags { - build_command.env("RUSTFLAGS", flags); + if !rustflags.flags.is_empty() { + build_command.env("CARGO_ENCODED_RUSTFLAGS", rustflags.encode()?); } if let BridgeModel::BindingsAbi3(_, _) = bridge_model { @@ -509,19 +514,6 @@ fn compile_target( Ok(artifacts) } -/// Get `RUSTFLAGS` in the following order: -/// -/// 1. `RUSTFLAGS` environment variable -/// 2. `rustflags` cargo configuration -fn get_rustflags(workdir: &Path, target: &str) -> Result> { - let cargo_config = cargo_config2::Config::load_with_cwd(workdir)?; - let rustflags = cargo_config.rustflags(target)?; - match rustflags { - Some(rustflags) => Ok(Some(rustflags.encode_space_separated()?)), - None => Ok(None), - } -} - /// Checks that the native library contains a function called `PyInit_` and warns /// if it's missing. ///