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專案原始碼並編譯為Eclipse專案Spring原始碼編譯Eclipse
- 學習Hibernate原始碼一_下載hibernate原始碼並編譯為eclipse專案原始碼編譯Eclipse
- 深入wepy原始碼:wpy檔案編譯過程原始碼編譯
- 原始碼編譯Vim 8原始碼編譯
- MongoDB(0)- 原始碼編譯MongoDB原始碼編譯
- 編譯Android原始碼編譯Android原始碼
- 編譯hibernate原始碼編譯原始碼
- Docker編譯Azerothcore原始碼Docker編譯原始碼
- Spring原始碼編譯Spring原始碼編譯
- 專案編譯報錯編譯
- 在專案中自定義路徑放入element-ui並修改編譯原始碼UI編譯原始碼
- 編譯FFMPEG原始碼的指令碼編寫案例編譯原始碼指令碼
- WebRTC研究 (一) 編譯原始碼Web編譯原始碼
- 原始碼編譯 apache2.4原始碼編譯Apache
- Kubernetes原始碼編譯原始碼編譯
- 龍芯原始碼編譯MySQL原始碼編譯MySql
- Ceph原始碼編譯與打包原始碼編譯
- nvme driver 原始碼修改、編譯原始碼編譯
- 原始碼編譯安裝Redis原始碼編譯Redis
- LAMP原始碼編譯安裝LAMP原始碼編譯
- osg原始碼編譯步驟原始碼編譯
- Android原始碼編譯--整理Android原始碼編譯
- XCode 編譯 PAG 原始碼XCode編譯原始碼
- Android原始碼閱讀-編譯8.0原始碼Android原始碼編譯
- 優化 Swift 編譯速度優化Swift編譯
- Vue3原始碼分析——編譯模組和編譯器Vue原始碼編譯
- MySQL5.5原始碼編譯新增編譯備註資訊~MySql原始碼編譯
- OC與Swift混編專案遷移到Swift4.2小記Swift
- Java 原始碼編譯成 Class 檔案的過程分析Java原始碼編譯
- 反編譯APK資原始檔與原始碼編譯APK原始碼
- Dubbo原始碼之動態編譯原始碼編譯
- MacOS X 編譯Android原始碼Mac編譯Android原始碼
- 原始碼編譯安裝的原理原始碼編譯
- openssl原始碼編譯及配置方法原始碼編譯
- Android FrameWork 之原始碼編譯AndroidFramework原始碼編譯
- 用mingw編譯tcc原始碼編譯原始碼
- 原始碼的下載與編譯原始碼編譯