🔥 빌드 구성 설정하기

338자
5분

Swift 패키지 매니저는 개발자에게 디버그(Debug)와 릴리즈(Release), 두 가지 빌드 구성을 제공해요. 기본값은 디버그입니다.

디버그 모드로 빌드하기

swift build 명령을 실행하면 Swift 패키지 매니저는 기본적으로 디버그 구성으로 빌드해요. swift build -c debug 명령으로 디버그 모드를 명시할 수도 있죠. 디버그 모드로 빌드한 결과물은 빌드 폴더 아래 debug 디렉토리에 담깁니다.

디버그 모드에서 Swift 패키지 매니저는 Swift 타겟을 다음 플래그와 함께 빌드해요:

  • Onone: 최적화 없이 컴파일합니다.
  • g: 디버깅 정보를 생성합니다.
  • enable-testing: Swift 컴파일러의 테스트 기능을 활성화합니다.

이런 Swift 코드가 있다고 해 보죠:

func greet(name: String) {
    print("Hello, \(name)!")
}
 
greet(name: "Steve")
swift

위 코드를 디버그 모드로 빌드하면 Swift 패키지 매니저가 다음 명령을 실행할 거예요:

$ swiftc -g -Onone -enable-testing greet.swift
shell

C 언어 타겟은 디버그 모드에서 이런 플래그로 빌드돼요:

  • O0: 최적화 없이 컴파일합니다.
  • g: 디버깅 정보를 생성합니다.

릴리즈 모드로 빌드하기

swift build -c release 명령으로 릴리즈 모드 빌드를 할 수 있어요. 릴리즈 모드 빌드 결과물은 빌드 폴더 아래 release 디렉토리에 저장됩니다.

릴리즈 모드에서 Swift 패키지 매니저는 Swift 타겟을 이런 플래그로 빌드해요:

  • O: 최적화하며 컴파일합니다.
  • whole-module-optimization: 입력 파일을 하나씩 최적화하지 않고 모듈 단위로 한꺼번에 최적화합니다.

앞의 Swift 코드 예제를 릴리즈 모드로 빌드하려면 이렇게 하면 돼요:

$ swiftc -O -whole-module-optimization greet.swift
shell
  • O 플래그로 최적화를 하고, whole-module-optimization 플래그로 전체 모듈을 최적화하는 거죠.

C 언어 타겟은 릴리즈 모드에서 이런 플래그로 빌드됩니다:

  • O2: 최적화하며 컴파일합니다.

추가 플래그 전달하기

C, C++, 또는 Swift 컴파일러에 추가 플래그를 전달하는 세 가지 방법이 있어요:

  1. XccXswiftc 같은 커맨드 라인 플래그로 모든 타겟에 C 또는 Swift 플래그를 전달하기
  2. 매니페스트에서 cSettingsswiftSettings 옵션으로 특정 타겟에 컴파일 플래그를 상세히 지정하기
  3. 목적지 JSON 파일 사용하기. 여러 타겟에 같은 커맨드 라인 플래그를 써야 한다면 JSON 파일에 모아 -destination example.json 식으로 전달하고 extra-cc-flagsextra-swiftc-flags를 설정하는 거예요.
    • 예제는 Utilities/build_ubuntu_cross_compilation_toolchain를 참고해 보세요.
  • Xcc로 준 C 플래그나 cSettings에 지정한 플래그는 편의상 Swift 컴파일러에도 전달되지만, extra-cc-flags는 그렇지 않다는 점이 다릅니다.

이렇게 Swift 패키지 매니저가 제공하는 빌드 구성과 옵션을 잘 활용하면 프로젝트 빌드를 원하는 대로 조종할 수 있어요. 개발할 때는 디버그 모드로, 배포할 때는 릴리즈 모드로 빌드하는 게 좋겠죠?