Xcode 및 Swift 프로젝트에서 컴파일러 플래그 추가하기
하나의 소스 코드로 여러 일을 처리하고 싶은 욕심은 어떤 프로그래머나 가지고 있을 것 같다. 그 중 C 등의 컴파일 되는 언어에서 유래한 흔한 방식으로 바로 전처리기(Proprocessor)를 활용하는 방법이 있다. 코드가 아닌 빌드 도구 차원에서 빌드하는 코드가 어떻게 동작할 지를 결정할 수 있는 좋은 방법이니 말이다.
그렇다면 Xcode에서 작업 중인 Swift 프로젝트에서는 이런 전처리기 플래그를 어떻게 추가하면 좋을까?
물론 Xcode에서 쉽게 할 수 있게 방법은 갖춰 놓고 있다. 그저 직관적으로 쉽게 할 수 있는 방법이 없을 뿐이다. 그렇다고 어려운 건 절대로 아니다.
Swift 프로젝트에 컴파일러 플래그 추가하기
플래그를 추가하기 위해서 Xcode에서 해당 프로젝트의 Target을 선택한 후 Build Settings에서 아래와 같은 루트로 혹은 검색으로 Other Swift Flags 항목을 찾아보자.
Build Settings - Swift Compiler - Custom Flags - Other Swift Flags
여기에서 원하는 빌드 환경에서 +
버튼을 눌러서 원하는 플래그를 -D
옵션을 붙여서 추가해주자. 예를 들어 SPECIAL_FEATURE
라는 플래그를 추가해 주고 싶다면 -DSPECIAL_FEATURE
라고 적어주면 된다. 두 개 이상 추가하고 싶다면 각 플래그 이름마다 이렇게 -D
를 앞에 붙여서 계속 추가해 주면 된다. 물론 -D
뿐만 아니라 다양한 컴파일러 옵션을 사용할 수도 있지만 이 글의 주제는 어디까지나 플래그 추가다.
이후 Swift에서 #if
를 이용해 이 플래그가 정의되었을 경우의 동작을 코딩할 수 있다. 예를 들어 위에서처럼 플래그에 -DSPECIAL_FEATURE
를 추가한 경우 아래와 같은 식이다.
#if SPECIAL_FEATURE
useSpecialFeature()
#else
useNormalFeature()
#endif
C에 익숙하다면 왜 #ifdef
나 #if defined()
가 아닌가 고민할 수도 있겠지만 Swift에선 이렇게 하면 되니 괜히 고민하지 말자. 난이도도 한 번만 해보면 참 간단한 일이라고 느낄 것이다.
트러블슈팅
플래그를 추가하고 빌드하는데 아래와 같은 오류를 만날 수도 있다.
Conditional compilation flags must be valid Swift identifiers (rather than ' FLAGNAME')
이 오류는 뭔가를 잘못 적은 것 같다는 의미로 이해하면 된다. 혹시 플래그를 추가할 때 -DNAME
형식이 아닌 -D NAME
등 이상한 형식으로 입력되지 않았나 확인해 보자. 기본적으로 -D
옵션 뒤에 공백 없이 플래그 이름이 바로 나열되어야 한다.