Conditional Compilation
- Rust는
#[cfg]
라는 특별한 attribute를 가지고 있음
- 이는 코드를 컴파일할 때 컴파일러에게 특정 플래그를 전달함
#[cfg(foo)]
#[cfg(bar = "baz")]
#[cfg(any(unix, windows))]
#[cfg(all(unix, target_pointer_width="32"))]
#[cfg((not(foo))]
#[cfg(any(not(unix)),all(target_os="macos", target_arch="powerpc"))]
- Cargo를 이용한다면,
Cargo.toml
에 [feature]
에 특정 기능을 on/off하기 위해 세팅하는 것이 가능
[feature]
# no features by default
default = []
# Add feature "foo" here, then you can use it
# Our "foo" feature depends on nothing else.
foo = []
- Cargo는 flag를 다음과 같은 방법으로
rustc
에 전달함
--cfg feature="${feature_name}"
cfg
flag들은 어느 것이 활성화 될것인지, 어떤 코드가 컴파일 될 것인지를 결정함
#[cfg(feature = "foo")]
mod foo{
}
cargo build --feautres "foo"
로 컴파일 하였다면, --cfg feature="foo"
flag가 rustc
에 전달될 것이고, 결과적으로 mod foo
를 가질 것임
cargo build
로 컴파일 시엔 flag가 전달되지 않아 foo
모듈이 존재하지 않음
cfg_attr
#[cfg_attr(a,b)]
- a가
cfg
attribute에 의해 셋팅되었다면 #[b]
와 동일하게 동작하고, 그렇지 않다면 아무것도 아님
cfg!
cfg!
매크로는 코드에 있는 flag들을 사용할 수 있게 해줌
if cfg!(target_os = "macos") || cfg!(target_os = ios){
println!("Think Different!");
}