본문 바로가기
Apple/Apple_Xcode

xcconfig로 build setting 설정하기.

by LeviiOS 2024. 7. 2.
반응형

.xcconfig를 이용한 빌드 설정의 이유와 장점

 

1. 설정의 분리와 가독성 향상

 

코드와 설정 분리: 빌드 설정을 소스 코드와 분리함으로써, 설정 파일이 더 깔끔하고 관리하기 쉬워집니다.

가독성: 텍스트 파일 형식의 .xcconfig 파일은 Xcode UI보다 설정을 일목요연하게 정리할 수 있습니다.

 

2. 환경별 설정 관리 용이

 

환경별 설정 관리: 개발, 테스트, 프로덕션 등 다양한 빌드 환경별로 설정을 쉽게 관리할 수 있습니다.

중복 최소화: 공통 설정을 하나의 파일로 관리하고, 환경별로 필요한 설정만 덧붙일 수 있어 설정 중복을 최소화할 수 있습니다.

 

3. 버전 관리

 

Git 등 VCS 관리 용이: .xcconfig 파일은 텍스트 파일이므로 Git 등의 버전 관리 시스템에서 변경 이력을 쉽게 추적할 수 있습니다.

협업 용이: 팀 내에서 설정 변경 사항을 명확히 하고 공유할 수 있습니다.

 

4. 자동화와 스크립트 통합

 

자동화 통합: .xcconfig 파일을 사용하여 빌드 설정을 관리하면 CI/CD 파이프라인에서 설정을 쉽게 적용하고 관리할 수 있습니다.

스크립트와의 통합: 커스텀 빌드 스크립트와 쉽게 통합할 수 있습니다. 예를 들어, 특정 빌드 설정에 따라 스크립트를 다르게 실행할 수 있습니다.

 

5. 유지보수성 향상

 

중앙 집중식 관리: 여러 타겟이나 여러 프로젝트에서 공통으로 사용하는 설정을 중앙에서 관리할 수 있습니다.

변경 용이: 특정 설정을 변경할 때, 해당 설정이 적용된 모든 곳에서 일괄적으로 변경할 수 있습니다.

 

6. Tuist로의 이행 준비

(Tuist는 Xcode 프로젝트를 코드로 관리할 수 있게 해주는 도구로, 다양한 설정을 손쉽게 관리하고 자동화할 수 있습니다. )

기초 설정 준비: .xcconfig 파일을 사용하여 빌드 설정을 미리 정리해 두면, Tuist로 전환할 때 설정을 쉽게 통합할 수 있습니다.

이행의 용이성: .xcconfig 파일을 통해 관리하던 설정을 Tuist의 Project.swift 파일로 이전할 때, 기존 설정을 참고하여 쉽게 이전할 수 있습니다.

 

.xcconfig 설정 방법

.xcconfig 파일 생성

1. Xcode 맨 위 File 메뉴를 클릭 후,  New > **File…**을 선택합니다. 그리고 iOS탭 선택 

2. Other탭 위치까지 아래로 스크롤

3. 파일 템플릿 선택 화면에서 Configuration Settings File을 선택합니다. 이 옵션은 ‘Other’ 카테고리 아래에 있습니다.

4. Next 버튼을 클릭합니다.

5. 아래 사진과 같이 생성된 모습을 볼 수 있다.

생성된 .xcconfig 파일

 

생성한 xcconfig 반영하기.

 

1. 프로젝트 선택: 파일 탐색기에서 프로젝트 이름 클릭

2. 프로젝트 설정으로 이동: 프로젝트 이름 클릭

3. Info 탭 선택: Info 탭 클릭

4. Configurations 섹션 확장: Configurations 섹션 확장

5. 빌드 구성 추가: + 버튼 클릭 (Edit Scheme -> Build Configuration을 통해서 추가한 빌드 구성을 설정할 수 있다.)

6. .xcconfig 파일 선택: 각 빌드 구성에 대해 .xcconfig 파일 선택

7. 명령줄 빌드 구성 설정: Use 드롭다운 메뉴에서 명령줄 빌드 구성 설정

 

.xcconfig 파일을 반영한 모습

 

아래 링크를 들어가면 .xcconfig에 설정할 수 있는 내용이 정리 되어있다.

https://help.apple.com/xcode/mac/11.4/#/itcaec37c2a6

 

https://help.apple.com/xcode/mac/11.4/#/itcaec37c2a6

To see this page, you must enable JavaScript. Pour afficher cette page, vous devez activer JavaScript. Zur Anzeige dieser Seite müssen Sie JavaScript aktivieren. このページを表示するには、JavaScript を有効にする必要があります。

help.apple.com

 

아래는 프로젝트에 필요한 내용 정리

App.share.xcconfig를 만들어서 각 .xcconfig에 공통으로 들어갈 내용을 설정할 수 있다.

// 사용자 경로를 항상 검색하지 않도록 설정합니다. 이는 일반적으로 NO로 설정하여 빌드 속도를 최적화합니다.
ALWAYS_SEARCH_USER_PATHS                      = NO

// 로컬화되지 않은 문자열에 대한 경고를 활성화합니다.
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED    = YES

// null 가능성을 분석하도록 설정합니다.
CLANG_ANALYZER_NONNULL                        = YES

// C++ 언어 표준을 지정합니다. 여기서는 gnu++0x 표준을 사용합니다.
CLANG_CXX_LANGUAGE_STANDARD                   = gnu++0x

// 사용할 C++ 라이브러리를 지정합니다. 여기서는 libc++를 사용합니다.
CLANG_CXX_LIBRARY                             = libc++

// Clang 모듈을 활성화합니다. 이는 컴파일 시간을 단축시키고 모듈화된 코드를 사용할 수 있게 합니다.
CLANG_ENABLE_MODULES                          = YES

// Objective-C 자동 참조 카운팅(ARC)을 활성화합니다.
CLANG_ENABLE_OBJC_ARC                         = YES

// 중복 메서드 일치에 대한 경고를 활성화합니다.
CLANG_WARN__DUPLICATE_METHOD_MATCH            = YES

// 블록에서 autoreleasing 변수 캡처에 대한 경고를 활성화합니다.
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING        = YES

// 불리언 값 변환에 대한 경고를 활성화합니다.
CLANG_WARN_BOOL_CONVERSION                    = YES

// 콤마 연산자 사용에 대한 경고를 활성화합니다.
CLANG_WARN_COMMA                              = YES

// 상수 변환에 대한 경고를 활성화합니다.
CLANG_WARN_CONSTANT_CONVERSION                = YES

// 사용되지 않는 Objective-C 구현에 대한 경고를 활성화합니다.
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS    = YES

// 직접적인 isa 사용에 대해 오류를 발생시킵니다.
CLANG_WARN_DIRECT_OBJC_ISA_USAGE              = YES_ERROR

// 빈 코드 블록에 대한 경고를 활성화합니다.
CLANG_WARN_EMPTY_BODY                         = YES

// 열거형 변환에 대한 경고를 활성화합니다.
CLANG_WARN_ENUM_CONVERSION                    = YES

// 무한 재귀 호출에 대한 경고를 활성화합니다.
CLANG_WARN_INFINITE_RECURSION                 = YES

// 정수 변환에 대한 경고를 활성화합니다.
CLANG_WARN_INT_CONVERSION                     = YES

// 리터럴이 아닌 null 변환에 대한 경고를 활성화합니다.
CLANG_WARN_NON_LITERAL_NULL_CONVERSION        = YES

// Objective-C에서 self 암시적 유지에 대한 경고를 활성화합니다.
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF          = YES

// Objective-C 리터럴 변환에 대한 경고를 활성화합니다.
CLANG_WARN_OBJC_LITERAL_CONVERSION            = YES

// Objective-C 루트 클래스 경고를 오류로 처리합니다.
CLANG_WARN_OBJC_ROOT_CLASS                    = YES_ERROR

// 프레임워크 헤더에서 인용 부호로 포함된 파일에 대한 경고를 활성화합니다.
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES

// 범위 기반 루프 분석에 대한 경고를 활성화합니다.
CLANG_WARN_RANGE_LOOP_ANALYSIS                = YES

// 엄격한 프로토타입 규칙에 대한 경고를 활성화합니다.
CLANG_WARN_STRICT_PROTOTYPES                  = YES

// 의심스러운 move 연산에 대한 경고를 활성화합니다.
CLANG_WARN_SUSPICIOUS_MOVE                    = YES

// 도달할 수 없는 코드에 대한 경고를 활성화합니다.
CLANG_WARN_UNREACHABLE_CODE                   = YES

// 코드 서명 스타일을 자동으로 설정합니다. Xcode가 적절한 서명 옵션을 자동으로 선택합니다.
CODE_SIGN_STYLE                               = Automatic

// 릴리즈 빌드에서 디버그 심볼을 제거하지 않도록 설정합니다.
COPY_PHASE_STRIP                              = NO

// 애플 개발자 계정의 팀 ID를 지정합니다. 코드 서명에 사용됩니다.
DEVELOPMENT_TEAM                              = AAAAAA

// Objective-C 메서드 호출을 엄격하게 검증하도록 설정합니다.
ENABLE_STRICT_OBJC_MSGSEND                    = YES

// C 언어 표준을 지정합니다. 여기서는 gnu99 표준을 사용합니다.
GCC_C_LANGUAGE_STANDARD                       = gnu99

// 공통 블록 사용을 금지합니다.
GCC_NO_COMMON_BLOCKS                          = YES

// 64비트에서 32비트로의 변환에 대한 경고를 활성화합니다.
GCC_WARN_64_TO_32_BIT_CONVERSION              = YES

// 반환 타입에 대한 경고를 오류로 처리합니다.
GCC_WARN_ABOUT_RETURN_TYPE                    = YES_ERROR

// 선언되지 않은 셀렉터에 대한 경고를 활성화합니다.
GCC_WARN_UNDECLARED_SELECTOR                  = YES

// 초기화되지 않은 자동 변수에 대한 경고를 활성화합니다.
GCC_WARN_UNINITIALIZED_AUTOS                  = YES_AGGRESSIVE

// 사용되지 않는 함수에 대한 경고를 활성화합니다.
GCC_WARN_UNUSED_FUNCTION                      = YES

// 사용되지 않는 변수에 대한 경고를 활성화합니다.
GCC_WARN_UNUSED_VARIABLE                      = YES

// Info.plist 파일의 전처리기에 사용될 헤더 파일을 지정합니다.
//INFOPLIST_PREFIX_HEADER                       = info_preprocess.h

// Info.plist 파일을 전처리하도록 설정합니다.
INFOPLIST_PREPROCESS                          = YES

// 최소 iOS 배포 대상 버전을 설정합니다.
IPHONEOS_DEPLOYMENT_TARGET                    = 17.0

// 앱의 마케팅 버전을 설정합니다. 이는 앱 스토어에서 표시되는 버전입니다.
MARKETING_VERSION                             = 1.0

// 프로비저닝 프로필을 지정합니다. 이 설정은 프로비저닝 프로필의 UUID를 명시하지 않을 때 사용됩니다.
PROVISIONING_PROFILE_SPECIFIER                =

// 사용할 SDK 루트를 설정합니다. 여기서는 iOS SDK를 사용하도록 설정합니다.
SDKROOT                                       = iphoneos

// 최소 watchOS 배포 대상 버전을 설정합니다.
WATCHOS_DEPLOYMENT_TARGET                     = 9.0

 

App.debug.xcconfig에 설정한 내용이다.

#include "App.shared.xcconfig"

// 코드 서명에 사용할 신원을 지정합니다. 여기서는 “iPhone Developer”로 설정되어 있습니다. 이는 개발자 인증서로 서명하는 것을 의미합니다.
CODE_SIGN_IDENTITY                = iPhone Developer

// iPhoneOS SDK를 사용하는 빌드에 대해 코드 서명 신원을 “iPhone Developer”로 설정합니다.
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer

// 디버그 정보 형식을 DWARF로 설정합니다. DWARF는 디버그 정보를 저장하는 형식으로, 디버깅 시 사용됩니다.
DEBUG_INFORMATION_FORMAT          = dwarf

// 테스트 가능성을 활성화합니다. 이 설정은 XCTest 프레임워크를 사용하여 테스트할 때 필요한 설정입니다.
ENABLE_TESTABILITY                = YES

// Position-Independent Code (PIC)를 비활성화합니다. PIC는 코드가 메모리 내 어느 위치에서도 실행될 수 있도록 하는 기법입니다.
GCC_DYNAMIC_NO_PIC                = NO

// 최적화 레벨을 0으로 설정합니다. 이는 최적화를 하지 않도록 설정하며, 일반적으로 디버그 빌드에서 사용됩니다.
GCC_OPTIMIZATION_LEVEL            = 0

// 전처리기 정의를 설정합니다. 여기서는 DEBUG 매크로를 1로 정의하고, 이전 설정을 상속합니다. 이는 디버그 빌드에서 사용됩니다.
GCC_PREPROCESSOR_DEFINITIONS      = DEBUG=1 $(inherited)

// Metal API 디버그 정보를 활성화합니다. 이는 Metal API를 사용할 때 디버깅을 쉽게 하기 위한 설정입니다.
MTL_ENABLE_DEBUG_INFO             = YES

// 현재 활성화된 아키텍처만 빌드하도록 설정합니다. 이는 빌드 시간을 단축시키기 위해 디버그 빌드에서 자주 사용됩니다.
ONLY_ACTIVE_ARCH                  = YES

 

반응형