From 5013952e4a1b15198c3569fdcb9890af70f06ab9 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 4 May 2017 11:06:51 -0700 Subject: [PATCH] rustc: Stabilize `-C target-feature=+crt-static` This commit stabilizes the `crt-static` feature accepted by the compiler. Note that this does not stabilize the `#[cfg]` attribute for `crt-static` as that's going to be covered by #29717. This only stabilizes a few small pieces: * The `crt-static` feature as accepted by the `-C target-feature` flag, and its connection with the platform-specific definition of `crt-static`. * The semantics of `--print cfg` printing out activated `crt-static` feature, if available. This should be enough to get the benefits of `crt-static` on stable Rust with MSVC and with musl, but sidsteps the issue of stabilizing #29717 first. Closes #37406 --- src/librustc_driver/lib.rs | 19 ++++++++++++++++--- src/librustc_driver/target_features.rs | 11 ----------- src/test/compile-fail/crt-static-gated.rs | 14 -------------- 3 files changed, 16 insertions(+), 28 deletions(-) delete mode 100644 src/test/compile-fail/crt-static-gated.rs diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 889f4dd4b9aac..eef3b38a8b5e9 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -635,11 +635,24 @@ impl RustcDefaultCalls { node: ast::MetaItemKind::Word, span: DUMMY_SP, }); - if !allow_unstable_cfg && gated_cfg.is_some() { - continue; + + // Note that crt-static is a specially recognized cfg + // directive that's printed out here as part of + // rust-lang/rust#37406, but in general the + // `target_feature` cfg is gated under + // rust-lang/rust#29717. For now this is just + // specifically allowing the crt-static cfg and that's + // it, this is intended to get into Cargo and then go + // through to build scripts. + let value = value.as_ref().map(|s| s.as_str()); + let value = value.as_ref().map(|s| s.as_ref()); + if name != "target_feature" || value != Some("crt-static") { + if !allow_unstable_cfg && gated_cfg.is_some() { + continue; + } } - cfgs.push(if let &Some(ref value) = value { + cfgs.push(if let Some(value) = value { format!("{}=\"{}\"", name, value) } else { format!("{}", name) diff --git a/src/librustc_driver/target_features.rs b/src/librustc_driver/target_features.rs index 4f3abbb362ff9..e383f92d7b80e 100644 --- a/src/librustc_driver/target_features.rs +++ b/src/librustc_driver/target_features.rs @@ -12,7 +12,6 @@ use syntax::ast; use llvm::LLVMRustHasFeature; use rustc::session::Session; use rustc_trans::back::write::create_target_machine; -use syntax::feature_gate::UnstableFeatures; use syntax::symbol::Symbol; use libc::c_char; @@ -50,8 +49,6 @@ pub fn add_configuration(cfg: &mut ast::CrateConfig, sess: &Session) { } let requested_features = sess.opts.cg.target_feature.split(','); - let unstable_options = sess.opts.debugging_opts.unstable_options; - let is_nightly = UnstableFeatures::from_environment().is_nightly_build(); let found_negative = requested_features.clone().any(|r| r == "-crt-static"); let found_positive = requested_features.clone().any(|r| r == "+crt-static"); @@ -65,14 +62,6 @@ pub fn add_configuration(cfg: &mut ast::CrateConfig, sess: &Session) { found_positive }; - // If we switched from the default then that's only allowed on nightly, so - // gate that here. - if (found_positive || found_negative) && (!is_nightly || !unstable_options) { - sess.fatal("specifying the `crt-static` target feature is only allowed \ - on the nightly channel with `-Z unstable-options` passed \ - as well"); - } - if crt_static { cfg.insert((tf, Some(Symbol::intern("crt-static")))); } diff --git a/src/test/compile-fail/crt-static-gated.rs b/src/test/compile-fail/crt-static-gated.rs deleted file mode 100644 index 6c7c60b653a25..0000000000000 --- a/src/test/compile-fail/crt-static-gated.rs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-flags:-C target-feature=+crt-static -// error-pattern: specifying the `crt-static` target feature is only allowed - -fn main() {}