Xcode 및 Swift 프로젝트에서 컴파일러 플래그 추가하기

Swift // 2024년 07월 17일 작성

하나의 소스 코드로 여러 일을 처리하고 싶은 욕심은 어떤 프로그래머나 가지고 있을 것 같다. 그 중 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 옵션 뒤에 공백 없이 플래그 이름이 바로 나열되어야 한다.