-
Swift Build TechnologiesSwift 2025. 11. 1. 09:03
안녕하세요. 그린입니다 🍏
수백만 개의 App Store 앱과 Apple 자사 운영체제를 빌드하는 데 사용되는 Xcode의 빌드 엔진을 오픈소스로 공개를 2월에 했었죠!
이번 포스팅에서는 Swift Build가 무엇이고, 왜 중요하며, 기존 SwiftPM 빌드 시스템과 어떻게 다른지 자세히 살펴보겠습니다 🙋🏻

Swift가 크로스 플랫폼 언어로 성장
Swift는 2015년 오픈소스로 공개된 이후 많은 성장을 해왔습니다.
2015: iOS/macOS 전용 ↓ 2017: Linux 지원 ↓ 2020: Windows 지원 ↓ 2024: 임베디드 시스템 (마이크로컨트롤러) ↓ 2025: Android 지원이제 Swift는
- ⌚️ Wearables (Apple Watch)
- 📱 Mobile (iOS, Android)
- 💻 Desktop (macOS, Windows, Linux)
- 🖥 Server (Vapor, Hummingbird)
- 🔧 Embedded (마이크로컨트롤러, IoT)
다양한 플랫폼에서 사용되는 진정한 크로스 플랫폼 언어가 되었습니다!
빌드 시스템의 중요성
Swift가 확장됨에 따라, 모든 플랫폼에서 강력하고 일관되며 유연한 경험을 제공하는 크로스 플랫폼 빌드 도구에 투자할 가치가 생겼습니다.
빌드 시스템은 단순히 코드를 컴파일하는 것 이상입니다.
빌드 시스템의 역할 ├── 소스 코드 → 실행 파일 변환 ├── 의존성 관리 및 해결 ├── 증분 빌드 (변경된 부분만 빌드) ├── 병렬 빌드로 속도 최적화 └── 개발자 생산성에 직접적 영향빌드 시스템의 성능과 신뢰성은 개발자 생산성에 직접적인 영향을 미칩니다.
Swift Build 소개
Swift Build란?
파워풀하며 확장 가능한 빌드 엔진으로, Swift 프로젝트를 빌드하기 위한 빌드 규칙 세트를 제공합니다.
가장 중요한 점
- ✅ Xcode에서 사용하는 바로 그 빌드 엔진입니다.
- ✅ 수백만 개의 App Store 앱을 빌드합니다.
- ✅ Apple 자사 운영체제의 내부 빌드 프로세스를 담당합니다.
- ✅ 이제 Linux와 Windows도 지원합니다.
빌드 시스템의 기본 책임
빌드 시스템의 주요 책임은 사용자가 작성한 입력(프로젝트 설명, 소스 코드 등)을 출력 아티팩트(명령줄 도구, 라이브러리, 애플리케이션)로 변환하는 것입니다.
Input Build System Output ──────────────────────────────────────────────────────────── 프로젝트 설명 → → 실행 파일 소스 코드 → Swift Build → 라이브러리 리소스 파일 → → 애플리케이션 의존성 → → 프레임워크빌드 시스템은 개발자 경험을 제공하는 데 중요한 역할을 하며, 사용자가 프로젝트를 어떻게 구조화하고 작업하는지를 결정하는 상위 레벨 기능을 가능하게 합니다.
Swift Build의 위치
Swift Build는 Swift Package Manager나 Xcode와 같은 상위 레벨 클라이언트가 요청한 빌드를 계획하고 실행하도록 설계된 인프라 컴포넌트입니다.
┌─────────────────────────────────────────┐ │ 상위 레벨 클라이언트 │ │ ┌──────────┐ ┌───────────┐ │ │ │ Xcode │ │ SwiftPM │ │ │ └──────────┘ └───────────┘ │ └─────────────────────────────────────────┘ ↓ 빌드 요청 ┌─────────────────────────────────────────┐ │ Swift Build │ │ (빌드 계획 & 실행) │ └─────────────────────────────────────────┘ ↓ 저수준 빌드 ┌─────────────────────────────────────────┐ │ llbuild │ │ (범용 빌드 엔진) │ └─────────────────────────────────────────┘
llbuild
Swift Build를 이해하려면 먼저 llbuild를 알아야 합니다.
llbuild란?
빌드 시스템을 구축하기 위한 라이브러리 세트입니다.
핵심 철학
- 대부분의 빌드 시스템 프로젝트는 빌드를 설명하는 구문에 초점을 맞춤
- llbuild는 재사용 가능하고 유연하며 확장 가능한 범용 빌드 엔진에 초점
전통적 빌드 시스템: 빌드 설명 구문(Makefile, Gradle 등)에 집중 llbuild의 접근: 범용 빌드 엔진 + 라이브러리 기반 설계
llbuild의 특징
1. 유연한 핵심 엔진
- 실행 중에 새로운 작업을 발견할 수 있음
- 수백만 개의 노드에 도달하는 의존성 그래프 확장성
2. Ninja 매니페스트 지원
- LLVM, Clang, Swift 빌드 가능
- 기존 도구와의 호환성
3. 라이브러리 기반 설계
- 임베딩과 재사용을 위한 설계
- LLVM 철학의 연속
llbuild가 사용되는 곳
llbuild를 기반으로 구축된 것들: ├── Swift Build (새로 공개!) ├── Xcode의 새 빌드 시스템 (Xcode 9+) ├── Swift Package Manager └── Swift Playgrounds히스토리
- 2017: Xcode 9에서 새 빌드 시스템 도입
- 2018: Xcode 10에서 기본값이 됨
- 2025: Swift Build로 오픈소스화
Swift Build의 핵심 기능
Swift Build는 기존 llbuild 프로젝트 위에 구축되어 다음 기능을 추가합니다.
1. Swift 컴파일러와의 강력한 통합
// Swift Build는 Swift 컴파일러와 긴밀하게 통합 // - 모듈 의존성 자동 추적 // - 증분 컴파일 최적화 // - 컴파일러 진단 메시지 통합Swift 프로젝트 빌드를 안정적이고 효율적으로 조율합니다.
2. 다양한 제품 타입 지원
지원하는 제품 타입: ├── 라이브러리 (Static, Dynamic) ├── 명령줄 도구 (CLI Tools) ├── GUI 애플리케이션 │ ├── iOS 앱 │ ├── macOS 앱 │ └── watchOS 앱 └── 고급 빌드 구성 옵션3. 빌드 그래프 최적화
Swift와 C 코드를 빌드할 때 병렬성을 최대화하는 빌드 그래프 최적화를 제공합니다.
Sequential Build (기존): Task A → Task B → Task C → Task D (총 시간: 40초) Parallel Build (Swift Build): Task A ─┐ Task B ─┼→ Task D Task C ─┘ (총 시간: 15초)기존 문제: 두 개의 빌드 시스템
Xcode vs SwiftPM의 차이
Apple 플랫폼에서는 패키지를 빌드하는 두 가지 다른 방법이 있었습니다.
┌─────────────────────────────────────────┐ │ Xcode │ │ - 강력한 빌드 엔진 │ │ - 복잡한 프로젝트 지원 │ │ - Apple 플랫폼에 최적화 │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ SwiftPM │ │ - 단순한 빌드 엔진 │ │ - 크로스 플랫폼 │ │ - 패키지 관리에 집중 │ └─────────────────────────────────────────┘문제점
1. 사용자 혼란
- 두 구현의 동작이 일치하지 않을 때 혼란 발생
- "Xcode에서는 되는데 SwiftPM에서는 안 돼요" 😫
2. 기능 불일치
Xcode에서만 가능: - 복잡한 빌드 설정 - 고급 최적화 - Scheme 관리 SwiftPM에서만 가능: - 크로스 플랫폼 빌드 - 간단한 패키지 관리3. Duplicate Effort
- 같은 기능을 두 번 구현
- 버그 수정도 두 번
- 개선사항도 두 번
통합된 빌드 엔진의 비전
SwiftPM에 Swift Build 통합
Apple은 Swift Build를 오픈소스로 공개하면서 SwiftPM에 통합하는 PR을 제출했습니다.
# 프리뷰로 Swift Build 사용하기 swift build --build-system swiftbuild목표
- 모든 플랫폼에서 통합된 빌드 실행 엔진 제공
- 사용자에게 투명하게 작동
- 기존 패키지와 완전한 호환성 유지
- 일관된 크로스 플랫폼 경험 제공
이점
1. 일관성
Before (두 개의 빌드 시스템): Xcode 빌드 결과 ≠ SwiftPM 빌드 결과 (때때로) After (통합 빌드 엔진): Xcode 빌드 결과 = SwiftPM 빌드 결과 (항상!)2. 새로운 기능 활성화
- 모든 플랫폼과 도구에서 새로운 기능
- 새로운 성능 최적화 잠금 해제
- 개발자 친화적 기능
3. 생태계 건강성
- 어떤 IDE를 사용하든 일관된 경험
- 어떤 플랫폼을 타겟하든 일관된 경험
- 건강한 패키지 생태계
코드 살펴보기
Package.swift 구조
Swift Build의 Package.swift는 400줄이 넘는 복잡한 매니페스트입니다.
// swift-build/Package.swift (일부) let package = Package( name: "SwiftBuild", platforms: [ .macOS(.v13), .iOS(.v16), ], products: [ .library(name: "SwiftBuild", targets: ["SwiftBuild"]), .library(name: "SWBUtil", targets: ["SWBUtil"]), // ... 더 많은 제품들 ], dependencies: [ .package(url: "https://github.com/apple/swift-llbuild.git", branch: "main"), .package(url: "https://github.com/apple/swift-tools-support-core.git", branch: "main"), // ... 더 많은 의존성들 ], targets: [ // 많은 타겟들... ] )환경 기반 의존성
// Context.environment를 기반으로 로컬/원격 패키지 선택 let useLocalDeps = Context.environment["USE_LOCAL_DEPS"] == "1" if useLocalDeps { dependencies.append( .package(path: "../swift-llbuild") ) } else { dependencies.append( .package(url: "https://github.com/apple/swift-llbuild.git", branch: "main") ) }이 패턴은 로컬 개발과 CI 빌드 모두를 지원합니다.
Swift Concurrency 마이그레이션
코드를 살펴보면 Swift Concurrency 경고가 많이 보입니다.
// SWBDispatch.swift extension SWBQueue { @available(*, noasync) public static func concurrentPerform(iterations: Int, _ block: @Sendable (Int) -> Void) { assertNoConcurrency { DispatchQueue.concurrentPerform(iterations: iterations, execute: block) } } }의미하는 것
- Apple 엔지니어들도 Swift Concurrency로의 마이그레이션에 어려움을 겪고 있음
- GCD와 Swift Concurrency를 혼합하지 않도록 주의
- 대규모 코드베이스에서의 현실적인 마이그레이션 과정을 보여줌
재미있는 FIXME들
// FIXME: There is a race here, we might install the system // after we receive the cancellation, but before the low-level // build starts. // FIXME: This API is not thread safe, and we can't fix the // concurrency issues outside of llbuild itself.Swift Build vs SwiftPM 빌드 시스템
아키텍처 비교
SwiftPM 기존 빌드 시스템: ┌──────────────┐ │ SwiftPM │ └──────────────┘ ↓ ┌──────────────┐ │ llbuild │ └──────────────┘ SwiftPM + Swift Build: ┌──────────────┐ │ SwiftPM │ └──────────────┘ ↓ ┌──────────────┐ │ Swift Build │ ← Xcode와 동일! └──────────────┘ ↓ ┌──────────────┐ │ llbuild │ └──────────────┘
Conclusion
핵심을 정리해볼까요?
Swift Build의 의미
- 🎯 Xcode 빌드 엔진의 오픈소스화
- 🌍 크로스 플랫폼 통합 빌드 엔진
- 🚀 SwiftPM과 Xcode의 일관성
- 💪 Apple 프로덕션 검증 완료
주요 이점
- 더 강력한 Swift 컴파일러 통합
- 최대화된 병렬 빌드
- 다양한 제품 타입 지원
- 빌드 그래프 최적화
개인적으로 Swift Build의 오픈소스화는 Swift 생태계의 성숙도를 보여주는 중요한 이정표라고 생각합니다.
앞으로 몇 년간 Swift 빌드 시스템이 어떻게 진화할지 정말 기대됩니다! 🚀
References
The Next Chapter in Swift Build Technologies
Swift continues to grow in popularity as a cross-platform language supporting a wide variety of use cases, with support on a variety of embedded devices, form factors that encompass wearables to server, and a wide variety of operating systems. As Swift exp
www.swift.org
'Swift' 카테고리의 다른 글
NSAttributedString Performance Optimization (0) 2025.12.06 Swift Closure Capture Semantics (0) 2025.11.15 Swift SDK for Android - Android 앱을 Swift로 개발하기 (0) 2025.10.26 Iterate Over Parameter Packs (0) 2025.10.18 Swift Profile Recorder (0) 2025.10.12