编译&调试swift5.7源码

25秒前 97阅读

环境:

  • 电脑: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版本的下载地址)
    1. 新建一个文件夹(用于存放clone下来的swift源码),然后进入该文件夹。本例中是在终端执行了mkdir swift-project,然后执行cd swift-project/实现;
    2. 在终端中执行:git clone --branch swift-5.7.1-RELEASE https://github.com/apple/swift.git,目的是把swift的swift-5.7.1-RELEASE版本的代码clone下来;
    3. 在终端中执行:./swift/utils/update-checkout --tag swift-5.7.1-RELEASE --clone,目的是下载编译swift所需要的代码库,当看到如下图所示的信息时,说明下载成功了;

      编译&调试swift5.7源码

    4. 安装编译工具(cmake、ninja、sccache):在终端上执行brew install cmake ninja sccache。(但是,这种方式安装的是这3个工具的最新版本,为了和本文环境对齐,所以可以参考这篇文章来通过brew安装指定版本)
    5. 在终端执行cd swift,目的是切到swift文件夹下;
    6. 在终端执行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。

      编译&调试swift5.7源码

      编译成功后,结果如下图。

      编译&调试swift5.7源码

    7. 此时我们可以打开如下图所示的build文件夹,然后可以看到Swift.xcodeproj文件。

      编译&调试swift5.7源码

    8. 我们用xcode打开Swift.xcodeproj文件,此时会弹出如下图所示的框,我们选择“automatically create schemes”,目的是让xcode给swift工程自动创建好可以编译的scheme。

      编译&调试swift5.7源码

    9. 我们在该工程内直接创建一个我们自己的target,操作如下3张图所示

      编译&调试swift5.7源码

      编译&调试swift5.7源码

      编译&调试swift5.7源码

    10. 给我们创建的target(本例指的是MySwiftaa)添加对ALL_BUILD库的依赖,操作如下第1张图所示,添加后的结果如下面第2张图所示。

      编译&调试swift5.7源码

      编译&调试swift5.7源码

    11. 把我们创建的target(本例指的是MySwiftaa)中的Enable Handened Runtime改为NO

      编译&调试swift5.7源码

    12. 在MySwiftaa中的main文件中写入如下图的代码

      编译&调试swift5.7源码

    class Person {
        var name = "csx"
    }
    let p = Person()
    
    1. 在HeapObject文件中的swift_allocObject函数中断个点,然后编译运行该target,即可发现断点生效了,如下图所示。说明能用xcode调试swift了。

      编译&调试swift5.7源码

    如果你还想调试更多的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打开该文件。

    编译&调试swift5.7源码

    然后编译你的自定义target。如果遇到如下图所示的错误,比如no such file or directory: ‘swift-project/build/Xcode-RelWithDebInfoAssert+swift-DebugAssert/llvm-macosx-arm64/Debug/lib/libLLVMSupport.a’

    编译&调试swift5.7源码

    那么我们可以打开LLVM.xcodeproj,如下两张图所示。

    编译&调试swift5.7源码

    编译&调试swift5.7源码

    选择名为ALL_BUILD的target,然后点击运行按钮。当编译成功后,再回到Swift.xcodeproj工程,然后就可以编译运行了。此时也能断点调试swift的代码了。

    编译&调试swift5.7源码

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]