본 글은 Xcode Target, Xcode Scheme, Build Settings, Xcode Project, Xcode Workspace (Xcode Concepts)를 한국어로 번역하여 옮긴 글입니다.
타겟(target)은 빌드할 산출물(product)을 지정하며, 프로젝트나 워크스페이스의 파일 묶음을 산출물로 빌드하기 위한 지침(instruction)을 포함합니다. 타겟은 단일 산출물을 정의합니다. 타겟은 산출물로 빌드하기 위해 필요한 소스 파일과 해당 소스 파일을 처리하기 위한 지침을 빌드 시스템 내부에서 입력으로 구성합니다. 프로젝트는 하나의 산출물을 생산하는 하나 이상의 타겟을 포함할 수 있습니다.
산출물을 빌드하기 위한 지침은 Xcode 프로젝트 에디터에서 확인하고 편집할 수 있는 빌드 설정(settings)과 빌드 단계(phases)의 형태로 구성됩니다. 타겟은 프로젝트 빌드 세팅을 상속하며, 타겟 계층에서 다른 세팅을 지정함으로써 프로젝트 빌드 세팅을 재정의할 수 있습니다. 한번에 오직 하나만 활성 타겟이 될 수 있으며, Xcode 스킴(scheme)이 그 활성 타겟을 지정합니다.
타겟과 생성되는 산출물은 다른 타겟에 연관되어 있을 수 있습니다. 하나의 타겟이 빌드를 위해 다른 타겟의 출력 결과를 필요로 한다면, 첫 번째 타겟은 두 번째 타겟에 의존한다(depend)고 말합니다. 두 타겟이 동일한 워크스페이스에 있다면, Xcode는 그 의존성을 발견할 수 있으며, 이 경우 필요한 순서로 산출물을 빌드합니다. 이러한 관계를 암시적 의존성(implicit dependency)이라고 부릅니다. 또한, 프로젝트 빌드 설정에서 명시적 의존성(explicit dependency)을 지정할 수 있으며, Xcode가 암시적 의존성을 가진다고 예상하는 두 타겟이 실제로는 의존하지 않음을 명시할 수 있습니다. 예를 들어, 동일한 워크스페이스에서 라이브러리와 해당 라이브러리를 연결하는 애플리케이션을 함께 빌드할 수 있습니다. Xcode는 이러한 관계를 발견하고, 자동으로 라이브러리를 먼저 빌드합니다. 그러나, 워크스페이스에서 빌드된 라이브러리가 아닌 다른 버전의 라이브러리를 연결하고 싶다면, 빌드 설정에서 암시적 의존성을 재정의하여 명시적 의존성을 생성할 수 있습니다.
Xcode 스킴은 빌드할 타겟의 모음, 빌드할 때 사용할 구성과 실행할 테스트의 모음을 정의합니다.
원하는 만큼 많은 스킴을 가질 수 있습니다. 그러나, 한번에 오직 하나의 스킴만 활성화될 수 있습니다. 프로젝트에 스킴을 저장할지 말지 여부를 지정할 수 있습니다. 전자의 경우, 해당 프로젝트나 워크스페이스를 포함하는 모든 워크스페이스가 해당 스킴을 사용할 수 있습니다. 후자의 경우, 오직 해당 워크스페이스에서만 사용할 수 있습니다. 활성 스킴을 선택하면, 실행 대상(run destination)도 함께 선택됩니다(실행 대상은 산출물이 빌드될 하드웨어의 아키텍처를 의미합니다).
빌드 설정은 산출물의 빌드 과정에서 특정 측면을 어떻게 수행할지에 대한 정보를 담은 변수(variable)입니다. 예를 들어, 빌드 설정에 포함된 정보는 Xcode가 컴파일러에 어느 옵션을 전달할지 지정할 수 있습니다.
빌드 설정은 프로젝트나 타겟 계층에서 지정할 수 있습니다. 프로젝트 계층의 빌드 설정은 특정 타겟에서 명시적으로 빌드 설정을 재정의하지 않는 한, 프로젝트의 모든 타겟에 적용됩니다.
각 타겟은 산출물 하나를 빌드하는 데 필요로 하는 소스 파일을 구성합니다. 빌드 구성(configuration)은 특정 방식으로 타겟의 산출물을 빌드하는 데 사용되는 빌드 설정의 모음을 지정합니다. 예를 들어, 산출물의 디버그 및 릴리즈 빌드를 위해 별도의 빌드 구성을 가지는 것이 일반적입니다. Xcode에서 빌드 설정은 설정 제목(title)과 정의(definition)라는 두 부분으로 되어 있습니다. 빌드 설정 제목은 해당 빌드 설정을 식별하며, 다른 설정 내에서 사용될 수 있습니다. 빌드 설정 정의는 Xcode가 빌드 시간에 빌드 설정 값을 결정하는 데 사용하는 상수 또는 수식입니다. 빌드 설정에는 표시 이름(display name)이 있을 수 있으며, 이는 Xcode 사용자 인터페이스에서 빌드 설정을 표시하는 데 사용됩니다. Xcode가 제공하는 기본적인 빌드 설정 외에도, 프로젝트 템플릿을 사용해 새로운 프로젝트를 생성할 때, 프로젝트나 특정 타겟을 위한 사용자 정의 빌드 설정을 생성할 수 있습니다. 마찬가지로 조건부 빌드 설정(conditional build setting)도 지정할 수 있습니다. 조건부 빌드 설정의 값은 하나 이상의 전제 조건(prerequisite)을 만족하는지에 따라 달라집니다. 예를 들어, 이러한 메커니즘은 대상 아키텍처(targeted architecture)에 따라 산출물을 빌드할 때 사용할 SDK를 지정할 수 있습니다.
Xcode 프로젝트는 모든 파일, 리소스와 하나 이상의 소프트웨어 산출물을 빌드하는 데 필요한 정보를 담은 저장소(repository)입니다. 프로젝트는 산출물을 빌드하는 데 필요한 모든 요소와 해당 요소 간의 관계를 포함합니다. 프로젝트는 산출물을 어떻게 빌드할 지 지정하는 하나 이상의 타겟을 포함합니다. 프로젝트는 프로젝트 내 모든 타겟에 대한 기본 빌드 설정을 정의합니다(각 타겟은 프로젝트 빌드 설정을 재정의해 자신만의 빌드 설정을 지정할 수 있습니다).
Xcode 프로젝트 파일은 아래 정보를 포합합니다:
소스 파일에 대한 참조:
구조(structure) 네비게이터에서 소스 파일을 구성하기 위한 그룹(group)
프로젝트 수준의 빌드 구성(configuration). 프로젝트에서 하나 이상의 빌드 구성을 지정할 수 있습니다. 예를 들어, 프로젝트는 debug과 release 빌드 구성을 가질 수 있습니다.
각 타겟이 지정하는 대상입니다:
디버깅하거나 프로그램을 테스트할 때 사용할 수 있는 실행 환경으로, 각 실행 환경은 다음을 지정합니다:
+ Xcode에서 실행하거나 디버깅할 때 실행할 실행 파일
+ 실행 파일에 전달할 명령어 인자(있을 경우)
+ 프로그램 실행 시 설정할 환경 변수(있을 경우)
프로젝트는 독립적으로 존재하거나 워크스페이스에 포함될 수 있습니다.
Xcode 스킴을 사용하여 특정 시간에 활성화할 타겟, 빌드 구성과 실행 구성을 지정할 수 있습니다.
워크스페이스는 프로젝트와 기타 문서를 하나로 묶어 함께 작업할 수 있도록 하는 Xcode 문서입니다. 워크스페이스는 원하는 만큼의 Xcode 프로젝트뿐만 아니라 포함하고자 하는 기타 문서도 추가할 수 있습니다. 각 Xcode 프로젝트에 모든 파일을 구성하는 것뿐만 아니라, 워크스페이스는 포함된 프로젝트와 해당 타겟 간의 명시적 및 암시적 관계도 제공합니다.
프로젝트 파일은 빌드 구성과 기타 프로젝트 정보와 함께, 프로젝트 내 모든 파일에 대한 포인터(pointer)를 포함합니다. Xcode 3 및 이전 버전에서는 프로젝트 파일이 항상 그룹 및 파일 계층 구조에서 최상위(root) 위치에 있습니다. 프로젝트에서 다른 프로젝트를 참조할 수 있지만, Xcode 3에서는 서로 연관있는 프로젝트를 작업하는 건 꽤나 복잡했습니다. 대다수 작업의 흐름(workflow)은 단일 프로젝트로 한정되었습니다. Xcode 4 및 이후 버전에서는 하나 이상의 프로젝트뿐만 아니라 포함하고자 하는 기타 파일도 관리할 수 있도록 워크스페이스를 생성할 수 있습니다.
워크스페이스는 각 Xcode 프로젝트에 포함된 모든 파일에 접근할 수 있을 뿐만 아니라, 중요한 Xcode 작업의 흐름 범위를 확장합니다. 예를 들어, 전체 워크스페이스에 걸쳐 인덱싱(indexing)이 이루어지므로, 코드 완성(code completion), 정의로 이동(jump to definition)과 기타 기능들이 워크스페이스 내 모든 프로젝트에서 원활하게 작동합니다. 리팩토링 연산이 워크스페이스의 모든 컨텐츠에 걸쳐 이루어지므로, 프레임워크 프로젝트와 해당 프레임워크를 사용하는 일부 애플리케이션 프로젝트의 API를 한번의 연산으로 리팩토링할 수 있습니다. 빌드할 때, 하나의 프로젝트는 워크스페이스 내 다른 프로젝트의 산출물은 활용할 수 있습니다.
워크스페이스 문서는 포함된 프로젝트와 기타 파일에 대한 포인터만 포함하며, 그 외의 데이터는 저장하지 않습니다. 프로젝트는 하나 이상의 워크스페이스에 속할 수 있습니다. 아래 그림은 두 개의 Xcode 프로젝트(Sketch와 TextEdit)와 문서 프로젝트(Xcode4TransGuideDocPlan)가 포함된 워크스페이스를 보여줍니다.
기본적으로 워크스페이스 내 모든 Xcode 프로젝트는 워크스페이스 빌드 디렉토리(workspace build directory)라 불리는 동일한 디렉토리에 빌드됩니다. 각 워크스페이스는 자신만의 빌드 디렉토리를 가집니다. 워크스페이스 내 모든 프로젝트의 파일은 동일한 빌드 디렉토리에 위치하므로, 각 프로젝트에서 모든 파일을 확인할 수 있습니다. 그러므로, 두 개 이상의 프로젝트가 동일한 라이브러리를 사용한다면, 해당 라이브러리를 각 프로젝트 폴더에 개별적으로 복사할 필요가 없습니다.
Xcode는 암시적 의존성을 찾기 위해 빌드 디렉토리 내 파일을 검사합니다. 예를 들어, 워크스페이스에 포함된 한 프로젝트가 동일한 워크스페이스 내 다른 프로젝트에서 링크하는 라이브러리를 빌드한다면, Xcode는 해당 라이브러리를 먼저 빌드한 후 다른 프로젝트를 빌드합니다. 이는 빌드 구성이 이러한 의존성을 명시적으로 지정하지 않아도 자동으로 수행합니다. 필요하다면, 이러한 암시적 의존성을 명시적인 빌드 설정으로 재정의할 수 있습니다. 명시적 의존성을 하려면 반드시 프로젝트 참조를 생성해야 합니다.
워크스페이스 내 각 프로젝트는 자신만의 고유한 식별자(identity)를 가집니다. 워크스페이스 내 다른 프로젝트에 영향을 주거나 받지 않고 특정 프로젝트에서 작업하려면, 프로젝트를 워크스페이스없이 직접 열거나, 다른 워크스페이스에 추가하면 됩니다. 프로젝트는 여러 개의 워크스페이스에 속할 수 있으므로, 각 프로젝트나 워크스페이스를 다시 구성할 필요 없이 다양한 조합으로 작업할 수 있습니다.
워크스페이스의 기본 빌드 디렉토리를 사용할 수 있고, 직접 지정할 수 있습니다. 프로젝트가 빌드 디렉토리를 지정하더라도, 해당 프로젝트가 속한 워크스페이스의 빌드 디렉토리가 이를 재정의하게 된다는 점을 유의하세요.