properly respect rustflags, fix x86-sim issue (#4295)
* properly respect rustflags * typo * drop `-sim`
This commit is contained in:
1 parent
e6ca0baa46
commit
8d5a3a09da
1 file changed
+69
-39
@@ -375,6 +375,7 @@ pub(crate) struct BuildRequest {
|
|||||||
pub(crate) package: String,
|
pub(crate) package: String,
|
||||||
pub(crate) main_target: String,
|
pub(crate) main_target: String,
|
||||||
pub(crate) features: Vec<String>,
|
pub(crate) features: Vec<String>,
|
||||||
|
pub(crate) rustflags: cargo_config2::Flags,
|
||||||
pub(crate) extra_cargo_args: Vec<String>,
|
pub(crate) extra_cargo_args: Vec<String>,
|
||||||
pub(crate) extra_rustc_args: Vec<String>,
|
pub(crate) extra_rustc_args: Vec<String>,
|
||||||
pub(crate) no_default_features: bool,
|
pub(crate) no_default_features: bool,
|
||||||
@@ -629,7 +630,7 @@ impl BuildRequest {
|
|||||||
Architecture::Aarch64(_) if device => "aarch64-apple-ios".parse().unwrap(),
|
Architecture::Aarch64(_) if device => "aarch64-apple-ios".parse().unwrap(),
|
||||||
Architecture::Aarch64(_) => "aarch64-apple-ios-sim".parse().unwrap(),
|
Architecture::Aarch64(_) => "aarch64-apple-ios-sim".parse().unwrap(),
|
||||||
_ if device => "x86_64-apple-ios".parse().unwrap(),
|
_ if device => "x86_64-apple-ios".parse().unwrap(),
|
||||||
_ => "x86_64-apple-ios-sim".parse().unwrap(),
|
_ => "x86_64-apple-ios".parse().unwrap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,16 +646,45 @@ impl BuildRequest {
|
|||||||
|
|
||||||
// Somethings we override are also present in the user's config.
|
// Somethings we override are also present in the user's config.
|
||||||
// If we can't get them by introspecting cargo, then we need to get them from the config
|
// If we can't get them by introspecting cargo, then we need to get them from the config
|
||||||
|
//
|
||||||
|
// This involves specifically two fields:
|
||||||
|
// - The linker since we override it for Android and hotpatching
|
||||||
|
// - RUSTFLAGS since we also override it for Android and hotpatching
|
||||||
let cargo_config = cargo_config2::Config::load().unwrap();
|
let cargo_config = cargo_config2::Config::load().unwrap();
|
||||||
|
let mut custom_linker = cargo_config.linker(triple.to_string()).ok().flatten();
|
||||||
|
let mut rustflags = cargo_config2::Flags::default();
|
||||||
|
|
||||||
let mut custom_linker = if platform == Platform::Android {
|
if matches!(platform, Platform::Android) {
|
||||||
Some(workspace.android_tools()?.android_cc(&triple))
|
rustflags.flags.extend([
|
||||||
} else {
|
"-Clink-arg=-landroid".to_string(),
|
||||||
None
|
"-Clink-arg=-llog".to_string(),
|
||||||
};
|
"-Clink-arg=-lOpenSLES".to_string(),
|
||||||
|
"-Clink-arg=-Wl,--export-dynamic".to_string(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
if let Ok(Some(linker)) = cargo_config.linker(triple.to_string()) {
|
// Make sure to take into account the RUSTFLAGS env var and the CARGO_TARGET_<triple>_RUSTFLAGS
|
||||||
custom_linker = Some(linker);
|
for env in [
|
||||||
|
"RUSTFLAGS".to_string(),
|
||||||
|
format!("CARGO_TARGET_{triple}_RUSTFLAGS"),
|
||||||
|
] {
|
||||||
|
if let Ok(flags) = std::env::var(env) {
|
||||||
|
rustflags
|
||||||
|
.flags
|
||||||
|
.extend(cargo_config2::Flags::from_space_separated(&flags).flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the user's linker if the specify it at the target level
|
||||||
|
if let Ok(target) = cargo_config.target(triple.to_string()) {
|
||||||
|
if let Some(flags) = target.rustflags {
|
||||||
|
rustflags.flags.extend(flags.flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no custom linker is set, then android falls back to us as the linker
|
||||||
|
if custom_linker.is_none() && platform == Platform::Android {
|
||||||
|
custom_linker = Some(workspace.android_tools()?.android_cc(&triple));
|
||||||
}
|
}
|
||||||
|
|
||||||
let target_dir = std::env::var("CARGO_TARGET_DIR")
|
let target_dir = std::env::var("CARGO_TARGET_DIR")
|
||||||
@@ -726,6 +756,7 @@ impl BuildRequest {
|
|||||||
release,
|
release,
|
||||||
package,
|
package,
|
||||||
main_target,
|
main_target,
|
||||||
|
rustflags,
|
||||||
skip_assets: args.skip_assets,
|
skip_assets: args.skip_assets,
|
||||||
base_path: args.base_path.clone(),
|
base_path: args.base_path.clone(),
|
||||||
wasm_split: args.wasm_split,
|
wasm_split: args.wasm_split,
|
||||||
@@ -2245,6 +2276,36 @@ impl BuildRequest {
|
|||||||
env_vars.extend(self.android_env_vars()?);
|
env_vars.extend(self.android_env_vars()?);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// If this is a release build, bake the base path and title into the binary with env vars.
|
||||||
|
// todo: should we even be doing this? might be better being a build.rs or something else.
|
||||||
|
if self.release {
|
||||||
|
if let Some(base_path) = self.base_path() {
|
||||||
|
env_vars.push((ASSET_ROOT_ENV, base_path.to_string()));
|
||||||
|
}
|
||||||
|
env_vars.push((APP_TITLE_ENV, self.config.web.app.title.clone()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assemble the rustflags by peering into the `.cargo/config.toml` file
|
||||||
|
let mut rust_flags = self.rustflags.clone();
|
||||||
|
|
||||||
|
// Disable reference types on wasm when using hotpatching
|
||||||
|
// https://blog.rust-lang.org/2024/09/24/webassembly-targets-change-in-default-target-features/#disabling-on-by-default-webassembly-proposals
|
||||||
|
if self.platform == Platform::Web
|
||||||
|
&& matches!(ctx.mode, BuildMode::Thin { .. } | BuildMode::Fat)
|
||||||
|
{
|
||||||
|
rust_flags.flags.push("-Ctarget-cpu=mvp".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the rust flags for the build if they're not empty.
|
||||||
|
if !rust_flags.flags.is_empty() {
|
||||||
|
env_vars.push((
|
||||||
|
"RUSTFLAGS",
|
||||||
|
rust_flags
|
||||||
|
.encode_space_separated()
|
||||||
|
.context("Failed to encode RUSTFLAGS")?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// If we're either zero-linking or using a custom linker, make `dx` itself do the linking.
|
// If we're either zero-linking or using a custom linker, make `dx` itself do the linking.
|
||||||
if self.custom_linker.is_some()
|
if self.custom_linker.is_some()
|
||||||
|| matches!(ctx.mode, BuildMode::Thin { .. } | BuildMode::Fat)
|
|| matches!(ctx.mode, BuildMode::Thin { .. } | BuildMode::Fat)
|
||||||
@@ -2258,27 +2319,6 @@ impl BuildRequest {
|
|||||||
.write_env_vars(&mut env_vars)?;
|
.write_env_vars(&mut env_vars)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable reference types on wasm when using hotpatching
|
|
||||||
// https://blog.rust-lang.org/2024/09/24/webassembly-targets-change-in-default-target-features/#disabling-on-by-default-webassembly-proposals
|
|
||||||
if self.platform == Platform::Web
|
|
||||||
&& matches!(ctx.mode, BuildMode::Thin { .. } | BuildMode::Fat)
|
|
||||||
{
|
|
||||||
env_vars.push(("RUSTFLAGS", {
|
|
||||||
let mut rust_flags = std::env::var("RUSTFLAGS").unwrap_or_default();
|
|
||||||
rust_flags.push_str(" -Ctarget-cpu=mvp");
|
|
||||||
rust_flags
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this is a release build, bake the base path and title into the binary with env vars.
|
|
||||||
// todo: should we even be doing this? might be better being a build.rs or something else.
|
|
||||||
if self.release {
|
|
||||||
if let Some(base_path) = self.base_path() {
|
|
||||||
env_vars.push((ASSET_ROOT_ENV, base_path.to_string()));
|
|
||||||
}
|
|
||||||
env_vars.push((APP_TITLE_ENV, self.config.web.app.title.clone()));
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(env_vars)
|
Ok(env_vars)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2325,16 +2365,6 @@ impl BuildRequest {
|
|||||||
.to_string(),
|
.to_string(),
|
||||||
));
|
));
|
||||||
|
|
||||||
// Set the rust flags for android which get passed to *every* crate in the graph.
|
|
||||||
env_vars.push(("RUSTFLAGS", {
|
|
||||||
let mut rust_flags = std::env::var("RUSTFLAGS").unwrap_or_default();
|
|
||||||
rust_flags.push_str(" -Clink-arg=-landroid");
|
|
||||||
rust_flags.push_str(" -Clink-arg=-llog");
|
|
||||||
rust_flags.push_str(" -Clink-arg=-lOpenSLES");
|
|
||||||
rust_flags.push_str(" -Clink-arg=-Wl,--export-dynamic");
|
|
||||||
rust_flags
|
|
||||||
}));
|
|
||||||
|
|
||||||
// todo(jon): the guide for openssl recommends extending the path to include the tools dir
|
// todo(jon): the guide for openssl recommends extending the path to include the tools dir
|
||||||
// in practice I couldn't get this to work, but this might eventually become useful.
|
// in practice I couldn't get this to work, but this might eventually become useful.
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in new issue
Block a user