1. 前言
OC 的底层研究结束后,下面我们研究 Swift 底层,研究 Swift 底层首先要对 Swift 源码进行编译,下面我们就来编译一下 Swift 源码
2. 编译环境
MacOS Catalina 10.15.5
Xcode 12.2
Python 2.x
brew install cmake ninja
3. 编译步骤
▐ 3.1 准备工作
- 新建一个文件夹,命名为 swift-compile
- 由于拉取资源过程需要访问外网,所以需要访问国外网站
▐ 3.2 clone swift源码
这里我编译的是 swift-5.3.1-Release
,可以自行在官网上找到对应的分支,需要注意的是:Swift 源码版本需要与Xcode版本匹配
(官方编译文档有说明)
git clone --branch swift-5.3.1-RELEASE https://github.com/apple/swift.git
此时完成文件的大小应该有 3 个多 G
大小
▐ 3.3 update-checkout
这步非常重要,因为 update-checkout
会 clone 编译 swift 相关的库
,不然在后面编译时一定会失败
,这步很关键!(编译过程会很长,我编译1个多小时,建议休息时间编译)
./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone
▐ 3.4 编译
编译过程中既可以使用 ninja
,也可以使用 Xcode
进行编译。但是 Xcode 编译
后的支持性不是特别好
,所以这里就使用了 ninja
来作为编译工具了
./swift/utils/build-script -r --debug-swift-stdlib --lldb
此时包的大小如下图所示:
▐ 3.4 使用 VSCode 调试 Swift
首先,在 VSCode 中安装 CodeLLDB
插件
添加配置 JSON 文件
program 上的路径需要与编译的文件路径一致
不一致编译会报错
点击 Debug 运行
,此时会断住,如下图所示:
到此说明编译已经成功了,下面我们进行调试
3. 调试
切换至终端
在终端中写入一下代码
源码中搜索 swift_allocObject
(这个在后面会研究,再次仅做调试的例子),加上断点
继续在终端输入 var t = LjTeacher()
回车
我们发现断点断住了,这说明调试成功了( LjTeacher() 内部调用了swift_allocObject 方法)
至此 Swift 源码调试完成,为后面探索 Swift 底层实现提供很直观帮助。