공식문서로 알아보는 Xcode Target

공식문서로 알아보는 Xcode Target
Photo by Jan Antonin Kolar / Unsplash

Xcode에서 파일을 생성할 때 자주 보는 target과 group에 대해 Apple의 article과 문서를 읽어보며 알아보자.

먼저 target부터 알아보자.

Building and running an app | Apple Developer Documentation
Compile your source files and assemble an app bundle to run on a device or simulator.

위 문서에서는

Xcode determines how to build apps and other products from your project’s target information.
A target contains the tasks required to create an executable, and the settings to use to build it.
For example, an app target might contain the list of files to compile, the resources to copy into the app’s bundle, and other steps needed to configure the app.

Xcode는 프로젝트의 target 정보를 통해 앱 및 기타 product의 빌드 방법을 결정하고, target에는 실행 파일을 생성하는 데 필요한 작업과 build에 사용할 설정을 포함한다고 한다.

여기서 product는 app을 실행(run)하거나, 빌드했을 때의 결과물을 의미합니다.

예를들어 app target에는 컴파일할 목록, app bundle에 복사할 리소스 및 app을 구성하는데 필요한 작업들의 순서가 포함될 수 있다.

아래의 문서를 보며 target이 뭔지 조금 더 자세히 알아보자

Target은 하나의 product를 build하는데 필요한 source file, source file 처리를 위한 instruction등 build system에 대한 input을 구성(organize)한다.

build system은 뭘까?
Build system | Apple Developer Documentation
Compile your code into a binary format, and customize your project settings to build your code.

build system은 코드 및 리소스 파일을 완성된 앱(프로덕트)로 변환하는 도구이며, Xcode build system은 이러한 도구를 관리한다.

Xcode를 이용해 프로젝트를 build 하면, build system은 프로젝트 설정(Project Setting)을 이용해 수행할 작업들의 집합을 조합한다.

따라서 Target을 통해 build system에 대한 input을 구성해 개발자의 의도에 따른 product를 build할 수 있다.

Product를 빌드하기 위한 instruction들은 build phase형태로 제공된다.

따라서 Xcode 프로젝트 에디터에서 검토하고 편집할 수 있다.

예를 들어

위와 같이 Build Phases에 SwiftLint를 실행하는 instruction을 포함하여, Build Phases를 구성할 수 있다.

Target은 projuct build setting을 상속받지만 target에서 다른 설정을 지정해 project setting을 override할 수 있다.

다음과 같이

한번에 하나의 active target만 있을 수 있으며, Xcode scheme은 active target을 지정한다.

target과 target이 생성하는 product는 다른 target과 연관될 수 있다.  만약  target이 build하기 위해 다른 target의 output이 필요한 경우, 첫 번째 target은 두 번째 target을 의존한다고 한다.

이 두 target이 동일한 workspace에 있다면, Xcode는 의존성(dependency)를 발견할 수 있으며, 필요한 순서대로 product를 build한다.

이러한 관계를 묵시적 의존성(Implicit Dependency)라고 한다.

Build Settings에서 명시적 의존성(Exlplicit Dependency)을 지정할 수 있으며, Xcode가 묵시적 의존성을 가질 것으로 예상하는 두 target이 실제로 의존하지 않도록 지정 할 수도 있다.

예를 들어 동일한 Workspace에서 라이브러리와 해당 라이브러리를 링크하는 application을 모두 빌드할 수 있으며, Xcode는 해당 관계를 감지해 자동으로 라이브러리를 먼저 빌드할 수 있다.

만약 Workspace에 build된 라이브러리 버전이 아닌 다른 버전의 라이브러리에 대해 링크하려는 경우 Build Settings에서 명시적 의존성을 생성해 묵시적 의존성을 override할 수 있다.

Build Settings는 뭘까?

Build Setting은 product의 build process의 특정 측면을 어떻게 수행해야 하는지에 대한 정보를 포함하는 변수이다.

예를들어 build setting을 이용해 Xcode가 compiler에 전달할 옵션을 지정할 수 있다.

Project 또는 target level에서 build setting을 지정할 수 있으며, target은 project level의 build settings를 상속받기 때문에 특정 target에 대해 명시적으로 override하지 않는 이상 한 프로젝트의 모든 target에 적용된다.

아래의 영상에서는 build settings를 이용해 build 속도를 빠르게 하는 법을 소개하고 있다.

10. 맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
NAVER Engineering | 발표자: 이재성 (NAVER) * 개요 프로젝트가 커질수록 빌드 속도로 인해 낭비하는 시간들이 많아지게 됩니다. 별 생각없이 하고 있었던 행동들 또는 미쳐 알지 못했던 부분들로 인해 느리던 빌드속도를 해결할 수 있는 1부터 10까지 방법들을 왜 느리게되는지 어떻게 해야하는지 등등 하나하나 살펴보며 개발자들의 시간을 아낄수 있는 방법을 공유하려 합니다.

프로젝트에는 하나 이상의 target이 포함될 수 있으며, 각 target은 하나의 product를 생성한다.

Xcode에서 프로젝트 템플릿을 이용해 프로젝트를 생성할 때 Xcode는 프로젝트에 하나 이상의 target을 자동으로 추가한다.

참고

Xcode Target
Describes concepts developers must understand to use Xcode effectively.
Build Settings
Describes concepts developers must understand to use Xcode effectively.
Configuring a new target in your project | Apple Developer Documentation
Configure your project to build a new product, and add the code and resources the product requires.