Swift原始碼專案編譯

SofunNiu發表於2020-12-07

前言

本文記錄了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檔案時變數區可能不顯示內容,解決方法如下:
    1. 找到編譯後的LLDB檔案目錄,把bin目錄下的檔案全部拷貝到CodeLLDB的bin目錄下
      LLDB目錄:
      在這裡插入圖片描述
      CodeLLDB目錄:(在當前賬戶的.vscode目錄中)
      在這裡插入圖片描述
    2. 同時修改CodeLLDB的lib檔案下面的liblldb.dylib檔案
      在這裡插入圖片描述

三、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)

相關文章