2017-04-16 15 views
5

Có cách nào để lấy giá trị của configuration flag không? Ví dụ, tôi muốn có được giá trị của target_os như str/String, mà không cần đến các if-else-if chuỗi sau:Cách lấy giá trị của cờ cấu hình?

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

Bạn có thể thấy vấn đề này có liên quan: https://github.com/rust-lang/rust/issues/48823 –

Trả lời

4

số Bạn có thể nhận được một số của họ bằng cách lừa chở hàng vào nói cho bạn. Nếu bạn đặt đoạn mã sau vào một 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"); 
} 

... nó sẽ hiển thị cfg cờ Cargo là nhận thức được. Các panic! là chỉ có như là một cách dễ dàng để có được hàng hóa để thực sự hiển thị đầu ra thay vì ẩn nó. Để tham khảo, sản lượng này tạo ra trông như thế này:

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. 

Bạn có thể trích xuất các giá trị mà bạn đang quan tâm từ danh sách này, và đổ chúng vào một tập tin nguồn tạo ra, mà bạn có thể sau đó nhập khẩu (sử dụng #[path] hoặc include!) vào nguồn của gói.

Các vấn đề liên quan