深入理解Swift编译原理 – Swift源码编译
2023年第一个OKR的flag就是看完swift-frontend部分的代码。
工欲善其事必先利其器,学Swift不可缺少的就是编译swift代码,最近折腾了几天,终于能够编译通过了。
环境
- 操作系统:MacOS Monterey 12.5, 至少100G的空间
- cmake: 3.24.2
- python: 3.7.7
- Swift:branch release/5.7
之前试过通过Ninja编译的代码,在VSCode下的调试还是不如XCode下丝滑,这里还是建议使用XCode。
编译步骤
基本步骤可以按照官方的文档操作。
create directory
1
2mkdir swift-project
cd swift-projectclone code
1
2
3git clone https://github.com/apple/swift.git swift
cd swift
utils/update-checkout --cloneclone dependencies
1
2
3utils/update-checkout --scheme ${mybranchname}
# OR
utils/update-checkout --tag ${mytagname}如果是全新clone编译,这步会在swift源码文件夹的平级目录下,clone下来当前swift源码分支所依赖的其他模块代码。
actual build
这一步和官方文档的描述有点出入,搞了很久才找到的解决方案(因为编译一次实在要很久很久)
最终成功的脚本 ./utils/build-script --debug --xcode --bootstrapping=off,这个过程会很久。
--release-debuginfo和--debug不能同时存在。而且需要加上--bootstrapping=off参数,否则都会编译不通过。前者可以参考这个
调试编译器
在编译完成后,在./build/Xcode-DebugAssert/swift-macosx-x86_64/文件夹(m1的为arm)下会生成xcodeproject文件.
打开工程文件后,点击自动生成,会生成很多个scheme。找到ALL_BUILD,点击编译。
编译通过后查看工程的产物:
发现swift、swiftc可执行文件都是一个软链接,链接均指向了swift-frontend这个可执行文件。
在driver.cpp内的 run_driver 函数中可以看到swift,swiftc,swift-frontend 其实就是是同一个文件。
通过ExecName来指定一个”–driver-mode”, 关于这个后面文章会再细讲。
现在已经确定了,要调试的就是swift-frontend。接下来,找到swift-frontend这个可执行文件的编译scheme。将编译命令填充到启动参数内,这里简单将第一个参数填-emit-sil, 即编译swift代码生成优化后的sil。第二个参数就是源码文件路径。

之后随便找个函数打个断点,Run code,可以「愉快地」调试了。