阅读 1571

Swift底层探索之Swift源码编译

系列文章:OC底层原理系列OC基础知识系列Swift底层探索系列iOS高级进阶系列

前言

OC的底层研究告于段落,下面我们研究Swift底层,研究Swift底层首先要对Swift源码进行编译,下面我们就来编译一下Swift源码

编译环境

  • MacOS Catalina 10.15.5
  • Xcode 12.2
  • Python 2.x
  • brew install cmake ninja

编译步骤

准备工作

  • 新建一个文件夹,命名为swift-compile
  • 由于拉取资源过程需要访问外网,所以需要科学上网

第一步: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大小

第二步:update-checkout

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

./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone
复制代码

第三步:编译

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

./swift/utils/build-script -r --debug-swift-stdlib --lldb
复制代码

此时包的大小如下图所示:

使用VSCode调试Swift

  • 首先,在VSCode中安装CodeLLDB插件

  • 添加配置JSON文件

program上的路径需要淤泥编译的文件路径一致

不一致编译会报错

  • 点击Debug运行,此时会断住,如下图所示:

到此说明编译已经成功了,下面我们进行调试

调试

  • 切换至终端

  • 在终端中写入一下代码

  • 源码中搜索swift_allocObject(这个在后面会研究,再次仅做调试的例子),加上断点

  • 继续在终端输入var t = LjTeacher(),回车

我们发现断点断住了,这说明调试成功了(LjTeacher()内部调用了swift_allocObject方法)

至此Swift源码调试完成,为后面探索Swift底层实现提供很直观帮助。

文章分类
iOS
文章标签