🔥 빌드 구성 설정하기

338자
5분

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

디버그 모드로 빌드하기

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

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

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

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

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

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

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

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

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

릴리즈 모드로 빌드하기

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

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

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

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

shell
$ swiftc -O -whole-module-optimization greet.swift
shell
$ swiftc -O -whole-module-optimization greet.swift
  • 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 패키지 매니저가 제공하는 빌드 구성과 옵션을 잘 활용하면 프로젝트 빌드를 원하는 대로 조종할 수 있어요. 개발할 때는 디버그 모드로, 배포할 때는 릴리즈 모드로 빌드하는 게 좋겠죠?

YouTube 영상

채널 보기
NestJS 인터셉터란? | NestJS 가이드
class-validator 와 DTO | NestJS 가이드
함수 타입과 Hom-Set 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 인터셉터에서 map 연산자로 응답을 변환하는 방법 | NestJS 가이드
변환 파이프로 컨트롤러 코드 깔끔하게 만들기 | NestJS 가이드
Pro펑터, 입력과 출력을 동시에 다루는 펑터 | 프로그래머를 위한 카테고리 이론
Writer 펑터와 클라이슬리 카테고리 | 프로그래머를 위한 카테고리 이론
API 응답 지연과 복잡한 에러, NestJS 인터셉터로 관리하는 방법 | NestJS 가이드