编译环境
- 电脑系统:macOS Catalina 10.15.7
- Xcode:Xcode 12.2
- Python :Python 2.x
- cmake: brew install cmake
- ninja:brew install ninja
cmake
和ninja
可通过 brew list
查看是否安装
编译步骤
开始前先准备一下:
- 新建一个名为
swift-source
的文件夹 - 因为要clone源码,建议搭建小梯子。
第一步:clone swift
源码
git clone --branch swift-5.3.1-RELEASE https://github.com/apple/swift.git
这里编译的是swift-5.3.1-Release
。可以自行在官网找到对应的分支,需要注意的是:swift源码版本需要与Xcode
版本匹配(官方编译文档有说明)。目前最新版本是5.3.1。
clone
完成文件大概700M。
第二步:update-checkou
./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone
确保是在当前的swift-source
目录下,然后执行上面命令。
这一步很重要,update-checkout
会clone
编译 swift
相关的库,不然编译一定会失败。(时间有点长,可以喝杯☕️)
这里编译需要注意一点:文件的路径尽量避免出现中文
,中文有很大的概率会报错。
安装完如下:
完成后文件大概有3G。
第三步:编译
编译过程可以使用ninja
,也可以使用Xcode
,但是Xcode编译之后的支持性不是太好,所以这里采用ninja
编译。
- 利用 swift 源码中的脚本编译:
./swift/utils/build-script -x -R --debug-swift
- 或者执行以下脚本查阅命令:
./swift/utils/build-script -r --debug-swift-stdlib --lldb
编译过程可能会报错:
看报错信息应该是和
CommandLine
有关,直接删除Developer
下的CommandLineTools
,使用Xcode中的就好。
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select -s /Applications/Xcode.app
如果的你的目录有可执行文件swift就编译完成了。
编译完文件大概有50G。
第四步:使用VSCode调试Swift
- 首先下载
VSCode
并安装。 - 使用
VSCode
来安装一个CodeLLDB
插件。
-
将swift-source导入
VSCode
,创建JSON文件,选择LLDB
模式
-
添加配置文件
launch.json
,并修改
{
"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}"
}
]
}
注意的是program的路径需要与你编译的文件路径一致
-
run
起来之后
-
过滤掉断点, 查看终端
这个时候就证明正常跑起来了
这个时候我们可以写swift代码,进行调试
可以看到本地变量没有任何显示(原因是CodeLLDB这个插件的作者没有支持swift语言),当然并不妨碍调试源代码。
设置本地变量显示支持swift
准备工作:做下面步骤的时候最好先备份,防止误操作。
-
找到
CodeLLDB
的安装目录
-
然后找到编译过后的
lldb
文件目录,把目录里面的文件全部拷贝到上面的目录中(lldbcode本质上也是使用bin目录下的lldb来调试我们的源码)
这一步的操作是要让codelldb使用我们编译好的swift中的lldb来调试代码。先找到VSCode插件的安装目录,一般情况下在用户目录下:
-
将
swift
编译后lldb
文件复制到vscode lldb/lib
目录下,删除本来就存在的liblldb.dylib
文件,并将lldb文件重命名为liblldb.dylib
。
lldb
会直接用到自身lib
目录下liblldb.dylib
动态库来调试,liblldb.dylib
本身包含了LLDB.framework文件。这里替换改名的目的是为了让vscode
去找bin
中我们编译之后的LLDB.framework
。(当然如果替换后也不显示,可以拷贝别人相同版本的LLDB.framework
到对应目录使用)