Auto merge of #64254 - aleksijuvani:fix-macos-sysroot, r=alexcrichton
Fix sysroot on macOS when cross-compiling and SDKROOT is set
Fixes rust-lang/cargo#7283
Closes rust-lang/cargo#7284
r? @alexcrichton
diff --git a/src/librustc_codegen_ssa/back/command.rs b/src/librustc_codegen_ssa/back/command.rs
index 2c2ede5..2d84d67 100644
--- a/src/librustc_codegen_ssa/back/command.rs
+++ b/src/librustc_codegen_ssa/back/command.rs
@@ -15,6 +15,7 @@
program: Program,
args: Vec<OsString>,
env: Vec<(OsString, OsString)>,
+ env_remove: Vec<OsString>,
}
#[derive(Clone)]
@@ -42,6 +43,7 @@
program,
args: Vec::new(),
env: Vec::new(),
+ env_remove: Vec::new(),
}
}
@@ -81,6 +83,17 @@
self.env.push((key.to_owned(), value.to_owned()));
}
+ pub fn env_remove<K>(&mut self, key: K) -> &mut Command
+ where K: AsRef<OsStr>,
+ {
+ self._env_remove(key.as_ref());
+ self
+ }
+
+ fn _env_remove(&mut self, key: &OsStr) {
+ self.env_remove.push(key.to_owned());
+ }
+
pub fn output(&mut self) -> io::Result<Output> {
self.command().output()
}
@@ -106,6 +119,9 @@
};
ret.args(&self.args);
ret.envs(self.env.clone());
+ for k in &self.env_remove {
+ ret.env_remove(k);
+ }
return ret
}
diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs
index c6e0e6a..9b044d9 100644
--- a/src/librustc_codegen_ssa/back/link.rs
+++ b/src/librustc_codegen_ssa/back/link.rs
@@ -533,6 +533,9 @@
for &(ref k, ref v) in &sess.target.target.options.link_env {
cmd.env(k, v);
}
+ for k in &sess.target.target.options.link_env_remove {
+ cmd.env_remove(k);
+ }
if sess.opts.debugging_opts.print_link_args {
println!("{:?}", &cmd);
diff --git a/src/librustc_target/spec/apple_base.rs b/src/librustc_target/spec/apple_base.rs
index 53364e7..f7551aa 100644
--- a/src/librustc_target/spec/apple_base.rs
+++ b/src/librustc_target/spec/apple_base.rs
@@ -51,3 +51,19 @@
let (major, minor) = macos_deployment_target();
format!("{}-apple-macosx{}.{}.0", arch, major, minor)
}
+
+pub fn macos_link_env_remove() -> Vec<String> {
+ let mut env_remove = Vec::with_capacity(2);
+ // Remove the `SDKROOT` environment variable if it's clearly set for the wrong platform, which
+ // may occur when we're linking a custom build script while targeting iOS for example.
+ if let Some(sdkroot) = env::var("SDKROOT").ok() {
+ if sdkroot.contains("iPhoneOS.platform") || sdkroot.contains("iPhoneSimulator.platform") {
+ env_remove.push("SDKROOT".to_string())
+ }
+ }
+ // Additionally, `IPHONEOS_DEPLOYMENT_TARGET` must not be set when using the Xcode linker at
+ // "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld",
+ // although this is apparently ignored when using the linker at "/usr/bin/ld".
+ env_remove.push("IPHONEOS_DEPLOYMENT_TARGET".to_string());
+ env_remove
+}
diff --git a/src/librustc_target/spec/apple_ios_base.rs b/src/librustc_target/spec/apple_ios_base.rs
index 6d3900c..fdbb1bd 100644
--- a/src/librustc_target/spec/apple_ios_base.rs
+++ b/src/librustc_target/spec/apple_ios_base.rs
@@ -38,9 +38,18 @@
// SDKROOT; for rustc, the user or build system can set it, or we
// can fall back to checking for xcrun on PATH.)
if let Some(sdkroot) = env::var("SDKROOT").ok() {
- let sdkroot_path = Path::new(&sdkroot);
- if sdkroot_path.is_absolute() && sdkroot_path != Path::new("/") && sdkroot_path.exists() {
- return Ok(sdkroot);
+ let p = Path::new(&sdkroot);
+ match sdk_name {
+ // Ignore `SDKROOT` if it's clearly set for the wrong platform.
+ "iphoneos" if sdkroot.contains("iPhoneSimulator.platform")
+ || sdkroot.contains("MacOSX.platform") => (),
+ "iphonesimulator" if sdkroot.contains("iPhoneOS.platform")
+ || sdkroot.contains("MacOSX.platform") => (),
+ "macosx10.15" if sdkroot.contains("iPhoneOS.platform")
+ || sdkroot.contains("iPhoneSimulator.platform") => (),
+ // Ignore `SDKROOT` if it's not a valid path.
+ _ if !p.is_absolute() || p == Path::new("/") || !p.exists() => (),
+ _ => return Ok(sdkroot),
}
}
let res = Command::new("xcrun")
@@ -100,6 +109,13 @@
}.to_string()
}
+fn link_env_remove(arch: Arch) -> Vec<String> {
+ match arch {
+ Armv7 | Armv7s | Arm64 | I386 | X86_64 => vec!["MACOSX_DEPLOYMENT_TARGET".to_string()],
+ X86_64_macabi => vec!["IPHONEOS_DEPLOYMENT_TARGET".to_string()],
+ }
+}
+
pub fn opts(arch: Arch) -> Result<TargetOptions, String> {
let pre_link_args = build_pre_link_args(arch)?;
Ok(TargetOptions {
@@ -107,6 +123,7 @@
dynamic_linking: false,
executables: true,
pre_link_args,
+ link_env_remove: link_env_remove(arch),
has_elf_tls: false,
eliminate_frame_pointer: false,
.. super::apple_base::opts()
diff --git a/src/librustc_target/spec/i686_apple_darwin.rs b/src/librustc_target/spec/i686_apple_darwin.rs
index 7d804ea..27d0582 100644
--- a/src/librustc_target/spec/i686_apple_darwin.rs
+++ b/src/librustc_target/spec/i686_apple_darwin.rs
@@ -5,6 +5,7 @@
base.cpu = "yonah".to_string();
base.max_atomic_width = Some(64);
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
+ base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
base.stack_probes = true;
base.eliminate_frame_pointer = false;
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index 2d8ae02..626fa37 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -581,8 +581,10 @@
/// user-defined libraries.
pub post_link_args: LinkArgs,
- /// Environment variables to be set before invoking the linker.
+ /// Environment variables to be set for the linker invocation.
pub link_env: Vec<(String, String)>,
+ /// Environment variables to be removed for the linker invocation.
+ pub link_env_remove: Vec<String>,
/// Extra arguments to pass to the external assembler (when used)
pub asm_args: Vec<String>,
@@ -844,6 +846,7 @@
post_link_objects_crt: Vec::new(),
late_link_args: LinkArgs::new(),
link_env: Vec::new(),
+ link_env_remove: Vec::new(),
archive_format: "gnu".to_string(),
custom_unwind_resume: false,
allow_asm: true,
@@ -1119,6 +1122,7 @@
key!(post_link_objects_crt, list);
key!(post_link_args, link_args);
key!(link_env, env);
+ key!(link_env_remove, list);
key!(asm_args, list);
key!(cpu);
key!(features);
@@ -1335,6 +1339,7 @@
target_option_val!(post_link_objects_crt);
target_option_val!(link_args - post_link_args);
target_option_val!(env - link_env);
+ target_option_val!(link_env_remove);
target_option_val!(asm_args);
target_option_val!(cpu);
target_option_val!(features);
diff --git a/src/librustc_target/spec/x86_64_apple_darwin.rs b/src/librustc_target/spec/x86_64_apple_darwin.rs
index 1821034..d059e44 100644
--- a/src/librustc_target/spec/x86_64_apple_darwin.rs
+++ b/src/librustc_target/spec/x86_64_apple_darwin.rs
@@ -6,6 +6,7 @@
base.max_atomic_width = Some(128); // core2 support cmpxchg16b
base.eliminate_frame_pointer = false;
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
+ base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
base.stack_probes = true;
// Clang automatically chooses a more specific target based on