Swift進(jìn)階(一)--- 源碼編譯

編譯環(huán)境

  • Xcode 12.2
  • Python 2.7.16
  • ninja 1.10.1

編譯步驟

第一步:clone swift 源碼

git clone --branch swift-5.2.4-RELEASE https://github/apple/swift.git
swift 根據(jù)編譯時(shí)的官方版本來做。
https://github.com/apple/swift

第二步:update-checkout

注意:這一步很關(guān)鍵,需要保證網(wǎng)絡(luò)環(huán)境的穩(wěn)定,必要時(shí)需要科學(xué)上網(wǎng)
確保你當(dāng)前是在 swift-source目錄下,然后執(zhí)行如下命令:
./swift/utils/update-checkout --tag swift-5.2.4-RELEASE --clone
這一步非常重要,因?yàn)?code>update-checkout 會(huì) clone 編譯 swift 的相關(guān)的庫,不然后面在編譯 swift 源碼的過程中一定會(huì)失敗。

第三步:編譯

這里我們使用 ninja,來進(jìn)行編譯。
請檢查是否已經(jīng)安裝ninja,并保證版本不要太舊,如果沒有安裝,請用下面的命令安裝
brew instal ninja
以上確認(rèn)完成之后,執(zhí)行以下命令進(jìn)行編譯:
./swift/utils/build-script -r --debug-swift-stdlib --lldb
該步驟耗時(shí)過長,請耐心等待

第三步遇到的錯(cuò)誤大概率是環(huán)境的問題,可以嘗試: ①重裝cmake,②重裝ninja
如果遇到關(guān)于XcodeTools的相關(guān)問題可以嘗試執(zhí)行下面命令:
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select -s /Applications/Xcode.app
執(zhí)行完之后從新編譯。

編譯成功之后再 swift-source/build下面的 Ninja相關(guān)的文件夾里面會(huì)出現(xiàn)如下四個(gè)文件夾

image.png

第四步:使用 VSCode 來調(diào)試 Swift

首先我們需要安裝一個(gè)插件CodeLLDB

image_0.png

緊接著配置 JSON 文件
image_1.png

注意 program 文件路徑要和你編譯的文件路徑相同
${workspaceFolder}/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift

配置完JSON之后,Run一下工程后如下:


image_2.png

會(huì)出現(xiàn)一個(gè)端點(diǎn),過掉端點(diǎn)之后如下:


image_3.png

此時(shí)源碼編譯的所有裝備工作都完成了,下面我們生成SIL文件,通過SIL文件來探索Swift的執(zhí)行過程

生成SIL文件

show in finder 到你想要查看的文件夾。
如下:

image_4.png

在當(dāng)前文件加下執(zhí)行如下指令:
swiftc -emit-sil main.swift | xcrun swift-demangle >> ./main.sil && code main.sil。

image_5.png

xcrun swift-demangle用于還原混淆的代碼
code main.sil 用于打開main.sil文件(這里是自定義的指令)可以用以下方式設(shè)定:

$ open .zshrc
alias code='/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code'
$ source .zshrc

更多的swiftc 的操作指令,可以使用swiftc -h指令來查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容