Swift源碼編譯

準備工作

  • 磁盤空間60G

編譯環境

  • Xcode 12.2(12B45b)
  • Visual studio Code( 1.51.1)
  • Python 3.9.0
  • macOS Big Sur 11.0.1
  • brew install cmake //3.19.1
  • brew install ninja //1.10.2
# build tools
brew install cmake ninja

安裝完成后 brew list 查看


image.png

Xcode,swift,macOS最好用對應的版本。

編譯步驟

一:clone swift 源碼

我這里是clone的最新的5.3.1版本源碼地址

mkdir swift-source
cd swift-source
git clone --branch  swift-5.3.1-RELEASE https://github.com/apple/swift.git

如果clone緩慢的話換成:參考來源

git clone --branch  swift-5.3.1-RELEASE https://github.com.cnpmjs.org/apple/swift.git

5.3.1版本克隆下來大概700M的樣子。

二:update-checkout

在swift-source目錄下操作:

./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone

這一步的目的是拉取我們在編譯源碼過程中所需要的其它分支文件,如果不拉取后續第三步編譯swift源碼的時候一定會失敗。

錯誤處理

fatal: unable to access 'https://github.com/apple/swift-syntax.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/swift-package-manager.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/jpsim/Yams.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-integration-tests.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/swift-driver.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/sourcekit-lsp.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/indexstore-db.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/llvm-project.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/swift-xcode-playground-support.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/ninja-build/ninja.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-corelibs-xctest.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com.cnpmjs.org/apple/swift.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-corelibs-foundation.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-llbuild.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

解決

?  ~ git config --global http.postBuffer 524288000
?  ~ git config --global http.sslVerify "false"

安裝完了大概這樣


image.png

文件大小大概3.4G左右。

三:編譯

編譯的過程中可以使用ninja,也可以使用Xcode。由于Xcode需要和特定版本綁定,并且Xcode編譯之后的支持性不是特別好。推薦使用njnja來作為編譯工具。
命令如下:

./swift/utils/build-script -r --debug-swift-stdlib --lldb

我編譯的時候主要是遇到如下錯誤:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:325:9: error: no member named 'isless' in the global namespace
using ::isless;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:326:9: error: no member named 'islessequal' in the global namespace
using ::islessequal;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:327:9: error: no member named 'islessgreater' in the global namespace
using ::islessgreater;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:328:9: error: no member named 'isunordered' in the global namespace
using ::isunordered;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:329:9: error: no member named 'isunordered' in the global namespace
using ::isunordered;
/Users/zaizai/improve/swift-source/llvm-project/llvm/include/llvm/Analysis/ScalarEvolution.h:1696:22: warning: '\c' command does not have a valid word argument [-Wdocumentation]
  /// by a call to \c @llvm.experimental.guard in \p BB.
                   ~~^
1 warning and 13 errors generated.
[42/1341][  3%][56.500s] Building CXX ...MakeFiles/swiftIRGen.dir/GenCast.cpp.o
ninja: build stopped: subcommand failed.
ERROR: command terminated with a non-zero exit status 1, aborting

解決方案:
看報錯信息應該是和CommandLine有關,直接刪除Developer下的CommandLineTools,使用Xcode中的。

  1. sudo rm -rf /Library/Developer/CommandLineTools
  2. sudo xcode-select -s /Applications/Xcode.app
    執行完上述命令后重新編譯
    編譯完成后


    image.png

    debug模式和release模式下大小差很多,debug模式下編譯完文件大小大概50G左右。

四:配置VSCode調試Swift

安裝CodeLLDB插件

image.png

配置json文件

選擇的時候選擇創建lldb json文件,目的是去到我們編譯好的文件目錄加載swift可執行文件。


image.png

文件路徑為編譯文件swift路徑

/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift

launch json文件如下:

{
  "version": "0.2.0",
  "configurations": [

    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug",
      //此處路徑為swift編譯文件的路徑
      "program": "${workspaceFolder}//build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift",
      "args": [],
      "cwd": "${workspaceFolder}"
    }
  ]
}

接下來我們直接run起來后斷點內容如下:

Launching: /Users/***/swift-source/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift
Launched process 89514
Stop reason: exec
image.png

過掉斷點查看終端
這個時候就證明已經正常跑起來了。

***  You are running Swift's integrated REPL,  ***
***  intended for compiler and stdlib          ***
***  development and testing purposes only.    ***
***  The full REPL is built as part of LLDB.   ***
***  Type ':help' for assistance.              ***
(swift) 

image.png

這個時候我們可以寫swift代碼,在forEach中打個斷點
image.png

可以看到本地變量沒有任何顯示(原因是CodeLLDB這個插件的作者沒有支持swift語言),當然并不妨礙調試源代碼。

本地變量顯示支持swift

lldbcode本質上也是使用bin目錄下的lldb來調試我們的源碼。
1.復制編譯的lldb目錄下的bin文件到vscode目錄
這一步的操作是要讓codelldb使用我們編譯好的swift中的lldb來調試代碼。先找到VSCode插件的安裝目錄,一般情況下在用戶目錄下:

/Users/***/.vscode/extensions/vadimcn.vscode-lldb-1.6.0/lldb/lib
image.png

我們找到lldb目錄下的bin文件夾,把編譯過后的swift代碼中lldb下的bin文件夾內容全部復制到vscode lldb/bin目錄下。(這里最好先將vscode lldb/bin目錄下的內容備份,防止出現錯誤)

/Users/***/***/swift-source/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/lldb-macosx-x86_64/bin
image.png

2.復制編譯好的lldb文件到vscode lib目錄下
lldb會直接用到自身lib目錄下liblldb.dylib動態庫來調試,liblldb.dylib本身包含了LLDB.framework文件。這里替換改名的目的是為了讓vscode去找bin中我們編譯之后的LLDB.framework。(當然如果替換后也不顯示,可以拷貝別人相同版本的LLDB.framework到對應目錄使用)
swift編譯后lldb/bin下的lldb文件復制到vscode lldb/lib目錄下,刪除本來就存在的liblldb.dylib文件,并將lldb文件改名為liblldb.dylib。(記得備份)。

image.png

重啟vscode再次嘗試應該就能在debug下面看到變量了。

image.png

終端輸入swift代碼調試

當然我們也可以直接在終端中輸入swift代碼

class HotpotCat {
    var name : String = "hotpot"
}

image.png

定義一個實例變量,var hotpot = HotpotCat()這里我們先不要回車,先找到私有方法_swift_allocObject_打個斷點
image.png

接著回車,可以在debug下面看到變量的情況,這里我們可以看到p這個變量占了32個字節。
image.png

至此,我們就已經編譯和配置好swift源碼環境了。

編譯總結:

一般到第二步都沒問題,第三步遇見錯誤大概率是環境的問題,不行就

  • 1.刪除/usr/local/include 文件夾
  • 2.重裝Homebrew(慎重,之前通過brew裝的都會沒)
  • 3.重裝cmake
  • 4.重裝ninja
  • 5.配置CommandLine
    sudo rm -rf /Library/Developer/CommandLineTools
    sudo xcode-select -s /Applications/Xcode.app

然后重新編譯。我大概是這么折騰好第三步的,最好別用公司電腦折騰,別導致工作環境出現問題。僅供參考。
當然我們也可以直接下載使用別人編譯好的文件,只不過需要解壓目錄和別人編譯的路徑完全一樣(編譯源碼的過程中文件路徑已經寫死)。

參考

Xcode releases:這個網站匯總了Xcode版本信息,比官網清晰。下載資源使用官方渠道。
Swift version:這個網站匯總了Swift版本和Xcode版本相關的信息。
https://stackoverflow.com/questions/59071881/problems-with-c-and-gems-on-osx-catalina

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容