Swift之源碼編譯的環(huán)境搭建和編譯流程
版本準(zhǔn)備:macOS 10.15.3 Xcode 11.5
brew install cmake njnia
Python 2.X
Swift 源碼地址:Apple/Swift
clone 命令:
git clone --branch swift-5.2.4-RELEASE https://github.com/apple/swift.git
1
這里我編譯的是 swift-5.2.4-RELEASE,因?yàn)樵诰幾g源碼的時(shí)候,這是我使用的版本。
如果需要編譯更新的源碼,可自行在官網(wǎng)上尋找對(duì)應(yīng)的版本:Apple/Swift。同時(shí)要注意對(duì)應(yīng)的Xcode的版本要匹配(在官方文檔編譯的時(shí)候會(huì)有具體的說(shuō)明)。
clone 完成如下:
Cloning into 'swift'... remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1170695 (delta 0), reused 0 (delta 0), pack-reused 1170694 Receiving objects: 100% (1170695/1170695), 614.74 MiB | 9.37 MiB/s, done. Resolving deltas: 100% (953771/953771), done. Note: switching to '0bab712aea8f0eb74f3acc303d96857f697a98d8'.
1
2
3
4
5
6
7
8
確保當(dāng)前的目錄在 swift-source 下,然后執(zhí)行以下命令:
./swift/utils/update-checkout --tag swift-5.2.4-RELEASE --clone
1
結(jié)果如下:
Skipping cmake on Darwin Skipping icu on Darwin Skipping clone of 'sourcekit-lsp', directory already exists Skipping clone of 'swift-syntax', directory already exists Skipping clone of 'cmake', requested by user Skipping clone of 'swift-xcode-playground-support', directory already exists Skipping clone of 'swift-format', directory already exists Skipping clone of 'indexstore-db', directory already exists Skipping clone of 'swift-stress-tester', directory already exists Skipping clone of 'llvm-project', directory already exists Skipping clone of 'llbuild', directory already exists Skipping clone of 'cmark', directory already exists Skipping clone of 'swift-corelibs-foundation', directory already exists Skipping clone of 'swift-tools-support-core', directory already exists Skipping clone of 'swift-corelibs-xctest', directory already exists Skipping clone of 'ninja', directory already exists Skipping clone of 'swift-integration-tests', directory already exists Skipping clone of 'swiftpm', directory already exists Skipping clone of 'swift', directory already exists Skipping clone of 'swift-corelibs-libdispatch', directory already exists Skipping clone of 'icu', requested by user
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
這一步特別重要,因?yàn)?update-checkout 會(huì) clone 編譯 swift 相關(guān)的庫(kù),不然之后編譯 swift 的過(guò)程中一定會(huì)失敗。
編譯過(guò)程中,既可以使用 njnia ,也可以使用 Xcode 來(lái)進(jìn)行編譯。在實(shí)際的編譯測(cè)試過(guò)程中,Xcode 編譯之后的支持性不是特別好,推薦使用 njnia 來(lái)編譯。
利用 swift 源碼中的腳本編譯:
./swift/utils/build-script -x -R --debug-swift
1
或者執(zhí)行以下腳本查閱命令:
./swift/utils/build-script -r --debug-swift-stdlib --lldb
1
編譯完成如下:
要在 Xcode 中打開(kāi) Swift 項(xiàng)目,請(qǐng)打開(kāi)/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Swift.xcodeproj。
它將為所有可用目標(biāo)自動(dòng)創(chuàng)建很多方案。常見(jiàn)的調(diào)試流程將涉及:
選擇 swift scheme。
調(diào)出 scheme 編輯器(??<)。
選擇 Arguments 選項(xiàng)卡,然后單擊 +。
添加命令行選項(xiàng),這個(gè)根據(jù)自行需求設(shè)置,如果沒(méi)有特殊需求,正常編譯。
關(guān)閉scheme 編輯器。
編譯并運(yùn)行。
打開(kāi) VSCode 安裝 CodeLLDB 插件,如下所示:
配置JSON 文件,如下所示:
配置內(nèi)容如下:
"version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug", "program": "${workspaceFolder}/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift", "args": [], "cwd": "${workspaceFolder}" } ]
1
2
3
4
5
6
7
8
9
10
11
注意:上面的 program 文件路徑需要和你編譯的文件路徑相同。
Run 之后:
過(guò)掉斷點(diǎn):
示例如下:
在調(diào)試 .swift 文件的時(shí)候,可能不會(huì)出現(xiàn)上面 3 的情況,解決辦法如下:
先找 LLDB 的安裝路徑,如下:
然后找到編譯之后的 LLDB 的文件路徑,把這里面的文件全部拷貝到上面的目錄之下:
同時(shí)修改 CodeLLDB 的 lib 文件下的 dylib 文件:
切換到終端,然后就可調(diào)試 Swift 源碼。
在終端中輸入以下代碼(也可以從 swift 文件拷貝):
在源碼中搜索 *_swift_allocObject,加上斷點(diǎn):
繼續(xù)在終端輸入 var t = YDWTeacher(),然后回車(chē):
這樣我們就可以愉快的玩耍調(diào)試 Swift 源碼啦!
Swift
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。