準備工作
- 磁盤空間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 查看
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"
安裝完了大概這樣
文件大小大概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中的。
- sudo rm -rf /Library/Developer/CommandLineTools
-
sudo xcode-select -s /Applications/Xcode.app
執行完上述命令后重新編譯
編譯完成后
image.png
debug模式和release模式下大小差很多,debug模式下編譯完文件大小大概50G左右。
四:配置VSCode調試Swift
安裝CodeLLDB插件
配置json文件
選擇的時候選擇創建lldb json文件,目的是去到我們編譯好的文件目錄加載swift可執行文件。
文件路徑為編譯文件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
過掉斷點查看終端
這個時候就證明已經正常跑起來了。
*** 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)
這個時候我們可以寫swift代碼,在forEach中打個斷點
可以看到本地變量沒有任何顯示(原因是
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
我們找到lldb
目錄下的bin
文件夾,把編譯過后的swif
t代碼中lldb
下的bin
文件夾內容全部復制到vscode lldb/bin
目錄下。(這里最好先將vscode lldb/bin
目錄下的內容備份,防止出現錯誤)
/Users/***/***/swift-source/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/lldb-macosx-x86_64/bin
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
。(記得備份)。
重啟vscode
再次嘗試應該就能在debug
下面看到變量了。
終端輸入swift
代碼調試
當然我們也可以直接在終端中輸入swift代碼
class HotpotCat {
var name : String = "hotpot"
}
定義一個實例變量,
var hotpot = HotpotCat()
這里我們先不要回車,先找到私有方法_swift_allocObject_
打個斷點接著回車,可以在debug下面看到變量的情況,這里我們可以看到
p
這個變量占了32
個字節。至此,我們就已經編譯和配置好
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