본문 바로가기
공부/[iOS&Swift]

[iOS] Xcode - Target, Project, Scheme, Build setting 에 대하여

by 인생은아름다워 2022. 2. 7.

Xcode에서 프로젝트를 생성하면 프로젝트 파일이 가장 상위에 있고, 그 안에는 Target이나 Project 등이 존재하는 것을 볼 수 있다.

오늘은 이 App project파일에 대해 공부해보고자 한다. **공식문서**를 참고하여 내 Xcode예제 프로젝트를 통해 확인해보면 좋을 듯하다.


✏️ Target

  • Target이란?

Target이란 하나의 product와 워크스페이스(또는 파일 들)에서 product를 빌드하기 위한 지침(instruction)들을 포함한다고 한다. 하나의 Xcode프로젝트는 여러 개의 target을 가질 수 있으며, 하나의 target은 하나의 product를 만들어낸다.

→ 예를 들어서 playground 앱 프로젝트 하나는 여러 개의 target(iOS, iPadOS, 등)을 가질 수 있고, 각각의 target이 하나의 product임을 이해하면 될 듯하다.

→ target의 product가 꼭 하나의 애플리케이션일 필요는 없는 것 같다. framework, Unit test bundle일 수도 있다.

다시 말해서, Target = product(+α)의 느낌?

AppProject에서 target를 선택했을 때, 위의 tap들을 보면 빌드에 관한 사항들이 있는 것으로 보아 여러 가지 Building instructions들을 포함하고 있음을 알 수 있고, 또한 Targets내부의 Autolayout_Ex... 이것이 바로 product라는 것을 알 수 있다. 실제 공식문서에서도 다음과 같이 설명하고 있다.

The instructions for building a product take the form of build settings and build phases, which you can examine and edit in the Xcode project editor.

  • 또한, Target은 프로젝트의 빌드 속성을 상속하지만, target level에서 다른 설정들을 지정하여 프로젝트 설정을 재정의(override)할 수 있다.

이렇게 프로젝트 자체의 빌드 속성을 지정할 수 있는데, 이 속성들을 기본으로 하되, 각 target마다 이 속성들을 재정의할 수 있다는 것 같다!

  • 동시에 하나의 target만이 활성 상태가 될 수 있다. 이는 Xcode scheme에서 지정한다.

여러 개의 target중 하나만 활성화시킬 수 있다는 것은 이해가 가지만 scheme가 어떤 것인지 잘 모르겠으니... scheme를 보고 다시!

  • 여러 개의 target은 서로 영향을 미칠 수 있다. 즉, target 끼리 관련되어있을 수 있다.

예를 들어서 한 target(A)이 같은 프로젝트 내의 다른 target(B)의 output을 필요할 수 있을 것이다. 이런 상황에서 target A는 target B에 의존한다고 말한다. 이런 경우 Xcode가 이런 의존성을 발견하여 빌드 순서를 적절히 조정한다고 한다. 이런 것을 암시적 의존성(implicit dependency)이라고 한다.

당연히 명시적으로 의존성을 지정해줄 수도 있다.(explicit dependency) 예를 들어서 위의 상황에서 Xcode는 B → A의 순서로 빌드하려고 할 것이다. 그런데 만약 사용자가 B의 결과를 A target에서 사용하지 않을 수도 있으니, 이럴 때 명시적 의존성을 만들 수 있다.(암시적 의존성 재정의)

✏️ Build Settings

Build setting은 product의 빌드 프로세스에서 수행되어야 할 것들을 담고 있는 변수(Variable)이다. 이 설정은 Xcode를 통해 컴파일러에게 전달된다. Project레벨과 Target레벨에서의 빌드 세팅이 있는데, 특정 Target 레벨에서 명시적으로 override 해 주지 않는 한 Project레벨의 빌드 세팅이 같은 프로젝트 내의 모든 Target에 적용된다. Build setting은 몇 개를 만들어두고 원하는 것으로 선택하여 빌드할 수 있는데, 이것은 찾아보니 아래 그림처럼 Debug, Release가 기본으로 있고, 추가/삭제도 진행할 수 있는 것처럼 보인다.

사실 아직 이 정도로 빌드 조건을 바꿔가며 해볼 단계는 아니니까, 우선 이정도로 공부해두면 될 것 같고, 블로그들을 찾다가 본 것인데 기본적으로 빌드할 때 command + R을 통해 하는데, 이 과정을 Product → Scheme → Edit scheme 메뉴를 통해 보니 Debug 모드로 빌드하고 있었음을 알게 되었다.

마지막으로 Build setting은 두 가지 파트로 구성되어있는데 하나는 title이고 나머지 하나는 definition이라고 한다. build setting title은 말 그대로 이름이고, build definition은 빌드 설정 값을 결정할 때 사용되는 상수나 공식(constant or fomula)이라고 한다.

아래 그림과 같지 않을까...?

✏️ Project

Xcode project는 모든 파일, 리소스, 빌드 시에 필요 정보들 등 모든 것을 가지고 있는 저장소(repository)이다. Project는 프로덕트를 빌드하는 데 사용되는 모든 요소들과 그 관계들을 가지고 있다. 한 개 또는 여러 개의 Target을 가질 수 있다. 모든 Target에 공통을 적용되는 Build setting을 가지고 있으며, 각 target마다 따로 재정의 하여 가지고 있을 수도 있다.

Xcode project는 다음의 것들을 포함한다.

  • 소스파일에 대한 참조들
    • 헤더파일을 포함하는 소스코드
    • 프레임워크와 라이브러리, internal과 external
    • 리소스 파일들
    • 이미지 파일들
    • 인터페이스 빌드 파일들(nib)
  • Structure navigator(?)에서 소스파일들을 구성하는 데 사용되는 그룹
  • 프로젝트 수준의 빌드 설정(Project level build configraguration) - ex: release, debug
  • Target이 지정하는 target
    • project에 의해 빌드된 하나의 product에 대한 참조
    • 어떤 pruduct를 빌드하는데 필요한 소스파일들에 대한 참조
    • 다른 target과의 의존성 관계를 포함하는 target 수준의 빌드 설정
  • Debug 또는 Test 프로그램에서 사용되는 실행 가능한 환경, 이 환경은 다음의 것들을 포함한다.
    • 실행하거나 디버그할 때 실행할 실행파일
    • 실행파일에 전달할 Command line arguments (if any, 존재한다면)
    • 프로그램이 실행될 때 설정될 환경변수(if any)

Project는 독립적일 수도 있고, 워크스페이스 내에 포함될 수도 있다.

Xcode scheme을 통해 특정 시점에 활성화시킬 target, build configuration, executable configuration을 선택할 수 있다.

✏️ Xcode Scheme

Xcode scheme은 빌드할 target들의 집합, 빌드 설정, 그리고 실행할 테스트들의 모음을 정의한다.

여러 개의 scheme를 가질 수 있지만, 한 가지만 활성화할 수 있다. 또한 실행 대상도 설정할 수 있다.

🗒️ 결론‼️

Xcode Project : 하나의 프로젝트, 이 안에는 여러개의 Target과 Build setting이 존재할 수 있다.

Target : 하나의 최종 결과물

Build setting : 빌드할 때의 설정들, 프로젝트 공통 빌드 세팅이 있고 각 target별로 재정의할 수 있다.

Scheme: 위의 모든 것들을 필요에 따라 조합하여 묶어놓은 것

🍎 참고자료

공식문서

Zedd님 블로그 **Xcode build configuration 세팅하기 (나중에 다시 꼭 읽어보기!)**

댓글