TIL

[iOS] Xcode Build System

Kim Roks 2025. 1. 8. 19:43

개요

  • 시작은 Static Library와 Dynamic Library였는데 파다 보니 여기까지 왔네요. 분명 알아야 할 내용일 거라 생각해서 짚고 넘어갑니다!
  • 우리가 0과 1로 이뤄진 기계어나, 어셈블리어 처럼 어려운 언어 대신 swift, java 등의 상위 수준의 코드로 프로그래밍을 할 수 있다는 건 컴파일러, 인터프리터라는 번역가들이 열일해 줘서 라는건 많은 분들이 알고 계실 거 같아요.
  • 오늘은 그 과정이 Xcode에선 어떻게 이뤄지는지, 또한 그 과정에서 의문의 시작이었던 스태틱 라이브러리와 다이내믹 라이브러리의 동작에 대해 간단히 보겠습니다.

Xcode 빌드 시스템이란?

  • 실행 가능한 프로그램을 생성하는 다양한 작업의 실행을 조율하는 것

과정

  • swift, xcode 기준으로 접근했지만, 대부분의 언어 처리 시스템은 5가지로 이뤄져서 진행된다고 합니다
    • 돌고 돌아 CS..!
  • PreProcessor
  • Compiler
  • Assembler
  • Linker
  • Loader

순서대로 살펴보겠습니다

PreProcessing(전처리기)

  • 컴파일러에 공급할 수 있도록 프로그램을 변환하는 과정입니다.
    • 당연히 컴파일타임보다 이전에 진행되겠죠?
  • 이 과정에서 매크로를 그 정의로 대체하고, 의존성을 발견하고, 전처리 지시문을 해결합니다.
    • 이 과정은 사실 xcode, swift에서의 방식이 아닌 전통적인 컴파일 과정에서의 전처리입니다.
  • 하지만 Swift는 전처리기가 없습니다
    • Swift에서 전처리기를 사용할 수는 없지만, Xcode 빌드 시스템은 Active Compilation Conditions라는 기능을 제공합니다.
      이 기능을 통해 특정 조건에 따라 코드를 컴파일할 수 있게 합니다.
      예를 들어, DEBUG와 같은 컴파일 조건을 설정하면, 코드에서 #if DEBUG와 같은 조건문을 사용하여 특정 코드 블록을 컴파일할지 말지 결정할 수 있습니다.
      이 방식은 전통적인 전처리기의 기능을 부분적으로 대체합니다.

Compiler(컴파일러)

  • 컴파일러가 뭔가요? (링크)
  • XCode는 이 과정에서 swift 나 objective C 같은 소스 코드를 어셈블리어로 변환하는 과정을 거칩니다.
  • Symbol Table을 생성하고 관리합니다.
    • 심볼은 코드 또는 데이터 조각의 이름입니다.
  • 과정에서 clang이나 swiftc처럼 한 번쯤 들어본 내용이 있긴 한데, 해당 내용은 다음에 기회 되면 다루는 걸로 하겠습니다.

Assembler(어셈블러)

  • 어셈블리어를 기계어(machine code)로 바꿉니다.
    • Object 파일을 출력하는 과정입니다.
    • 코드와 데이터의 모음이자, iOS와 macOS 운영 체제용 특수파일을 Mach-O 파일이라고 칭합니다.
      • . o 확장자를 사용합니다.

Linker(링커)

  • 링커는 다양한 Object File과 Library를 병합하여 iOS 또는 macOS 시스템에서 실행할 수 있는 하나의 Mach-O를 만드는 과정입니다.
  • 어셈블리에서도 Object파일 (mach-o)를 출력한다고 하는데 어셈블리에선 미완성인 상태임.
  • 컴파일러 단계에서 생성된 신볼 테이블을 사요 해서 여러 객체 파일과 라이브러리에서 참조를 해결해서 완제품 Mach-O를 만들어냄앞서 언급한 특성을 가진 Xcode에서 Swift 프로젝트를 빌드할 때 "정의되지 않은 심볼" 오류를 이미 경험했을 수 있습니다.… tuist 마이그레이션하며 진짜 해당 오류때문에 정신 나가는 줄 알았는데 이런 이유였군요

Loader(로더)

  • 마지막으로 로더는 프로그램을 메모리로 가져와서 실행
  • 로더는 프로그램을 실행시키는데 필수적인 메모리 공간을 할당해 주고 레지스터를 초기상태로 초기화합니다.

마치며..

  • tuist 마이그레이션 과정에서 꽤 많이 부딪혔는데 과정에서 겪은 문제들은 대부분이 이 지식을 통해 해결할 수 있는 부분이었네요
    물론 다 해결하고 궁금해져서 찾아보게 되었지만..ㅎ swift 외적으로도 cs적인 학습이 많이 포함된 거 같아 재밌던 주제였습니다
    참조의 첫 번째 글에서 훨씬 더 자세한 내용을 확인하실 수 있습니다.

참조

https://www.vadimbulavin.com/xcode-build-system/

https://ios-development.tistory.com/1336