探索 Swift 底层源码编译

2021-11-26 12:59:25 浏览数 (1)

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版本匹配(官方编译文档有说明)

代码语言:javascript复制
git clone --branch swift-5.3.1-RELEASE https://github.com/apple/swift.git

此时完成文件的大小应该有 3 个多 G 大小

▐ 3.3 update-checkout

这步非常重要,因为 update-checkoutclone 编译 swift 相关的库,不然在后面编译时一定会失败,这步很关键!(编译过程会很长,我编译1个多小时,建议休息时间编译)

代码语言:javascript复制
./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone
▐ 3.4 编译

编译过程中既可以使用 ninja,也可以使用 Xcode 进行编译。但是 Xcode 编译后的支持性不是特别好,所以这里就使用了 ninja 来作为编译工具了

代码语言:javascript复制
./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 底层实现提供很直观帮助。

0 人点赞