Swift原始碼專案編譯
前言
本文記錄了Swift原始碼專案在macOS系統下的編譯過程,電腦配置低,4G記憶體 + 128G硬碟,最後編譯下來大約使用了50多G硬碟空間,耗時大概7個小時。編譯過程建議學習ninja和build-script相關引數按自己所需進行配置
。
一、編譯環境
- Python3:一些指令碼python寫的
- Xcode
- 硬碟空間:原始碼大約3.5G,根據構建設定不同,構建完成在5G~70G之間。
- CMake:CMake是用於C和C ++的跨平臺構建系統
- Ninja:增量構建,可替代Xcode構建,更快
- Sccache:編譯器快取工具(可選)
通過Homebrew安裝cmake、ninja,我這裡沒有使用sccache
brew install cmake ninja
我的編譯環境:
- macOS 10.15.4 (sw_vers)
- Xcode 12.2 (xcodebuild -version)
- Cmake 3.18.0 (cmake --version)
- Python 3.6.4 (python3 --version)
- VSCode 1.51.1 (code --version)
二、編譯步驟
- 第一步: clone swift原始碼
//建立目錄
mkdir swift-source
cd swift-source
git clone --branch swift-5.3.1-RELEASE https://github.com/apple/swift.git
- 第二步:update-checkout
utils / update-checkout是一個指令碼,可以幫助你一起使用所有單獨的git儲存庫,而不是手動克隆/更新每個git儲存庫。
./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone
clone編譯Swift相關的庫
- 第三步:編譯
utils / build-script是一個高階自動化指令碼,用於處理配置(通過CMake),構建(通過Ninja或Xcode),快取(通過Sccache),執行測試等。
./swift/utils/build-script -r --debug-swift-stdlib --lldb
可通過./swift/utils/build-script -h
瞭解相關的引數。
-r, --release-debuginfo
:構建所有內容的RelWithDebInfo變體(預設是None)
--debug-swift-stdlib
:構建Swift標準庫和SDK覆蓋層的Debug變體
-l, --lldb
: 構建LLDB
- 第四步:使用VSCode除錯Swift
- 把swift-source拖進VSCode開啟,然後在擴充套件搜尋CodeLLDB並安裝
- 然後在執行中配置launch.json檔案
- 修改program為編譯檔案路徑:
build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift
,儲存後執行
執行起來後會到斷點處
過掉斷點後
- 在除錯.swift檔案時變數區可能不顯示內容,解決方法如下:
- 找到編譯後的LLDB檔案目錄,把bin目錄下的檔案全部拷貝到CodeLLDB的bin目錄下
LLDB目錄:
CodeLLDB目錄:(在當前賬戶的.vscode目錄中)
- 同時修改CodeLLDB的lib檔案下面的liblldb.dylib檔案
- 把swift-source拖進VSCode開啟,然後在擴充套件搜尋CodeLLDB並安裝
三、Ninja增量編譯
因電腦硬碟只有128G,擠出50多G空間還是很費事的(可以考慮在行動硬碟中編譯),另一方面這樣編譯下來的時間也很長(中間因誤操作失敗重新編譯一次白白花費5個小時)。最後編譯下來發現有以下四個目錄
其中llvm-macosx-x86_64佔用了28G左右的空間,當我把llvm刪除後也能執行和除錯swift。
在官方文件中看到如下內容:
以及
TODO:學習ninja以及build-script相關引數,以達到根據自己當前需要的內容進行編譯,從而節省時間和空間。
參考文章:
官方教程:[GettingStarted.md](https://github.com/apple/swift/blob/main/docs/HowToGuides/GettingStarted.md) HotPotCat:[Swift原始碼編譯](https://www.jianshu.com/p/270268b0b9d3)相關文章
- Sublime 編寫編譯 swift程式碼編譯Swift
- Spring原始碼編譯Spring原始碼編譯
- Kubernetes原始碼編譯原始碼編譯
- 深入wepy原始碼:wpy檔案編譯過程原始碼編譯
- XCode 編譯 PAG 原始碼XCode編譯原始碼
- Docker編譯Azerothcore原始碼Docker編譯原始碼
- 原始碼編譯Vim 8原始碼編譯
- MongoDB(0)- 原始碼編譯MongoDB原始碼編譯
- 專案編譯報錯編譯
- OC與Swift混編專案遷移到Swift4.2小記Swift
- 在專案中自定義路徑放入element-ui並修改編譯原始碼UI編譯原始碼
- 龍芯原始碼編譯MySQL原始碼編譯MySql
- 原始碼編譯 apache2.4原始碼編譯Apache
- WebRTC研究 (一) 編譯原始碼Web編譯原始碼
- MacOS X 編譯Android原始碼Mac編譯Android原始碼
- 原始碼編譯安裝Redis原始碼編譯Redis
- nvme driver 原始碼修改、編譯原始碼編譯
- Android FrameWork 之原始碼編譯AndroidFramework原始碼編譯
- [譯] 優化 Swift 的編譯時間優化Swift編譯
- 編譯開源 Swift Foundation 庫編譯Swift
- android 反編譯APK取原始碼。Android編譯APK原始碼
- 【轉】MySQL原始碼編譯安裝MySql原始碼編譯
- 原始碼編譯安裝的原理原始碼編譯
- openssl原始碼編譯及配置方法原始碼編譯
- Dubbo原始碼之動態編譯原始碼編譯
- [譯] 輕鬆管理 Swift 專案中的不同環境Swift
- Vue3原始碼分析——編譯模組和編譯器Vue原始碼編譯
- 寫Java這麼久,JDK原始碼編譯過沒?編譯JDK原始碼踩坑紀實JavaJDK原始碼編譯
- Ubuntu 15.04編譯Android 6.0.1原始碼-Nexus5真機編譯Ubuntu編譯Android原始碼
- 【Visual Leak Detector】原始碼編譯 VLD 庫原始碼編譯
- Flink1.9.2原始碼編譯和使用原始碼編譯
- grpc-java原始碼環境編譯RPCJava原始碼編譯
- 編譯除錯Net6原始碼編譯除錯原始碼
- nginx原始碼編譯安裝(詳解)Nginx原始碼編譯
- RocketMQ--原始碼編譯和介紹MQ原始碼編譯
- 編譯python(cpython)的原始碼及其用途編譯Python原始碼
- 阿里雲mysql原始碼編譯安裝阿里MySql原始碼編譯
- Android 11 原始碼下載+編譯教程Android原始碼編譯