Remove env vars instead of setting them to an empty string
This commit is contained in:
parent
2e9eba7f38
commit
e715d03275
@ -14,6 +14,7 @@ pub struct Command {
|
||||
program: Program,
|
||||
args: Vec<OsString>,
|
||||
env: Vec<(OsString, OsString)>,
|
||||
env_remove: Vec<OsString>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@ -41,6 +42,7 @@ impl Command {
|
||||
program,
|
||||
args: Vec::new(),
|
||||
env: Vec::new(),
|
||||
env_remove: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -75,6 +77,17 @@ impl Command {
|
||||
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()
|
||||
}
|
||||
@ -100,6 +113,9 @@ impl Command {
|
||||
};
|
||||
ret.args(&self.args);
|
||||
ret.envs(self.env.clone());
|
||||
for k in &self.env_remove {
|
||||
ret.env_remove(k);
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
|
@ -532,6 +532,9 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
|
||||
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);
|
||||
|
@ -52,18 +52,18 @@ pub fn macos_llvm_target(arch: &str) -> String {
|
||||
format!("{}-apple-macosx{}.{}.0", arch, major, minor)
|
||||
}
|
||||
|
||||
pub fn macos_link_env() -> Vec<(String, String)> {
|
||||
let mut env = Vec::with_capacity(2);
|
||||
// Ignore the `SDKROOT` environment variable if it's clearly set for the wrong platform, which
|
||||
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.push(("SDKROOT".to_string(), String::new()))
|
||||
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.push(("IPHONEOS_DEPLOYMENT_TARGET".to_string(), String::new()));
|
||||
env
|
||||
env_remove.push("IPHONEOS_DEPLOYMENT_TARGET".to_string());
|
||||
env_remove
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ pub fn target() -> TargetResult {
|
||||
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.extend(super::apple_base::macos_link_env());
|
||||
base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
|
||||
base.stack_probes = true;
|
||||
base.eliminate_frame_pointer = false;
|
||||
|
||||
|
@ -580,8 +580,10 @@ pub struct TargetOptions {
|
||||
/// 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>,
|
||||
@ -843,6 +845,7 @@ impl Default for TargetOptions {
|
||||
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,
|
||||
@ -1118,6 +1121,7 @@ impl Target {
|
||||
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);
|
||||
@ -1334,6 +1338,7 @@ impl ToJson for Target {
|
||||
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);
|
||||
|
@ -6,7 +6,7 @@ pub fn target() -> TargetResult {
|
||||
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.extend(super::apple_base::macos_link_env());
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user