环境:
- 电脑:apple m1 pro
- 系统:macOS13
- Xcode: 14.2
- Cmake: 3.25.1
- Ninja: 1.11.1
- sccache: 0.3.3
- python: 3.10 (如果你的mac不是这个版本,可以通过
brew install python@3.10
下载,然后看这篇文章切换到该python版本) - swift代码地址
- Xcode 14(不能是15及以上,否则编译会报错。因为xcode和swift版本有对应关系:https://swiftversion.net。各个xcode版本的下载地址)
- 新建一个文件夹(用于存放clone下来的swift源码),然后进入该文件夹。本例中是在终端执行了mkdir swift-project,然后执行cd swift-project/实现;
- 在终端中执行:
git clone --branch swift-5.7.1-RELEASE https://github.com/apple/swift.git
,目的是把swift的swift-5.7.1-RELEASE版本的代码clone下来; - 在终端中执行:
./swift/utils/update-checkout --tag swift-5.7.1-RELEASE --clone
,目的是下载编译swift所需要的代码库,当看到如下图所示的信息时,说明下载成功了;
- 安装编译工具(cmake、ninja、sccache):在终端上执行brew install cmake ninja sccache。(但是,这种方式安装的是这3个工具的最新版本,为了和本文环境对齐,所以可以参考这篇文章来通过brew安装指定版本)
- 在终端执行
cd swift
,目的是切到swift文件夹下; - 在终端执行
utils/build-script --xcode --release-debuginfo --debug-swift-stdlib --skip-build-benchmarks --swift-darwin-supported-archs "$(uname -m)" --sccache --skip-ios --skip-tvos --skip-watchos --bootstrapping=off
,目的是生成包含来swift源码的xcode工程。但不幸的是,你会遇到这个错误(error: using unsupported Xcode version,如下图所示),解决方法很简单:在终端执行export SKIP_XCODE_VERSION_CHECK=1
,即设置该环境变量。设置之后再次执行utils/build-script --xcode --release-debuginfo --debug-swift-stdlib --skip-build-benchmarks --swift-darwin-supported-archs "$(uname -m)" --sccache --skip-ios --skip-tvos --skip-watchos --bootstrapping=off
。
编译成功后,结果如下图。
- 此时我们可以打开如下图所示的build文件夹,然后可以看到Swift.xcodeproj文件。
- 我们用xcode打开Swift.xcodeproj文件,此时会弹出如下图所示的框,我们选择“automatically create schemes”,目的是让xcode给swift工程自动创建好可以编译的scheme。
- 我们在该工程内直接创建一个我们自己的target,操作如下3张图所示
- 给我们创建的target(本例指的是MySwiftaa)添加对ALL_BUILD库的依赖,操作如下第1张图所示,添加后的结果如下面第2张图所示。
- 把我们创建的target(本例指的是MySwiftaa)中的Enable Handened Runtime改为NO
- 在MySwiftaa中的main文件中写入如下图的代码
class Person {
var name = "csx"
}
let p = Person()
- 在HeapObject文件中的swift_allocObject函数中断个点,然后编译运行该target,即可发现断点生效了,如下图所示。说明能用xcode调试swift了。
如果你还想调试更多的swift的源码,请看下面
上面的步骤6所执行的编译只能调试swift的stdlib库里面的swift源码,比如上图所示的Person类的alloc方法的源码。此时如果你想调试Array的forEach方法,那么你需要重新编译swift源码(上面的步骤6所干的事情),只不过其中的编译参数–debug-swift-stdlib要变成–debug-swift,此时的编译命令如下:utils/build-script --xcode --release-debuginfo --debug-swift --skip-build-benchmarks --swift-darwin-supported-archs "$(uname -m)" --sccache --skip-ios --skip-tvos --skip-watchos --bootstrapping=off
。可能你会遇到如下图的错误,但没有关系,因为swift-project/build/Xcode-RelWithDebInfoAssert+swift-DebugAssert/swift-macosx-arm64文件夹下面已经生成了Swift.xcodeproj文件了,此时你可以用xcode打开该文件。
然后编译你的自定义target。如果遇到如下图所示的错误,比如no such file or directory: ‘swift-project/build/Xcode-RelWithDebInfoAssert+swift-DebugAssert/llvm-macosx-arm64/Debug/lib/libLLVMSupport.a’
那么我们可以打开LLVM.xcodeproj,如下两张图所示。
选择名为ALL_BUILD的target,然后点击运行按钮。当编译成功后,再回到Swift.xcodeproj工程,然后就可以编译运行了。此时也能断点调试swift的代码了。