[Rust] Conditional Compilation

iguigu·2022년 6월 22일
0

Conditional Compilation

  • Rust는 #[cfg] 라는 특별한 attribute를 가지고 있음
  • 이는 코드를 컴파일할 때 컴파일러에게 특정 플래그를 전달함
// 기본적인 2가지 형태
#[cfg(foo)]
#[cfg(bar = "baz")]

// helper 제공
#[cfg(any(unix, windows))]
#[cfg(all(unix, target_pointer_width="32"))]
#[cfg((not(foo))]

// nest arbitrarily 
#[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들을 사용할 수 있게 해줌
// 컴파일 타임에 configuration 셋팅에 따라 각각 true, false 중 하나로 치환 됨
if cfg!(target_os = "macos") || cfg!(target_os = ios){
	println!("Think Different!");
}
profile
2929

0개의 댓글