2017-04-16 92 views
5

有没有办法获得configuration flag的价值?例如,我想获得的target_os值作为str/String,而不诉诸以下if-else-if链:如何获取配置标志的值?

if cfg!(target_os = "windows") { 
    "windows" 
} else if cfg!(target_os = "linux") { 
    "linux" 
// ... 
} else { 
    "unknown" 
} 
+1

您可能会发现此问题相关:https://github.com/rust-lang/rust/issues/48823 –

回答

4

号你可以通过欺骗船货流入告诉你他们中的一些。如果将以下为build script

use std::env; 

fn main() { 
    for (key, value) in env::vars() { 
     if key.starts_with("CARGO_CFG_") { 
      println!("{}: {:?}", key, value); 
     } 
    } 
    panic!("stop and dump stdout"); 
} 

...这将显示cfg标志货物是知道的。 panic!只是一个让Cargo实际显示输出而不是隐藏它的简单方法。作为参考,这将产生输出看起来是这样的:

Compiling dump-cfg v0.1.0 (file:///F:/Programming/Rust/sandbox/cargo-test/dump-cfg) 
error: failed to run custom build command for `dump-cfg v0.1.0 (file:///F:/Programming/Rust/sandbox/cargo-test/dump-cfg)` 
process didn't exit successfully: `F:\Programming\Rust\sandbox\cargo-test\dump-cfg\target\debug\build\dump-cfg-8b04f9ac3818f82a\build-script-build` (exit code: 101) 
--- stdout 
CARGO_CFG_TARGET_POINTER_WIDTH: "64" 
CARGO_CFG_TARGET_ENV: "msvc" 
CARGO_CFG_TARGET_OS: "windows" 
CARGO_CFG_TARGET_ENDIAN: "little" 
CARGO_CFG_TARGET_FAMILY: "windows" 
CARGO_CFG_TARGET_ARCH: "x86_64" 
CARGO_CFG_TARGET_HAS_ATOMIC: "16,32,64,8,ptr" 
CARGO_CFG_TARGET_FEATURE: "sse,sse2" 
CARGO_CFG_WINDOWS: "" 
CARGO_CFG_TARGET_VENDOR: "pc" 
CARGO_CFG_DEBUG_ASSERTIONS: "" 

--- stderr 
thread 'main' panicked at 'stop', build.rs:9 
note: Run with `RUST_BACKTRACE=1` for a backtrace. 

您可以提取你想从这个列表中的值,并将其转储到一个生成的源文件,然后可以导入(使用#[path]include!)放入包装的来源。