Swift 进阶001 -- Swift源码编译

编译环境

  • 电脑系统:macOS Catalina 10.15.7
  • Xcode:Xcode 12.2
  • Python :Python 2.x
  • cmake: brew install cmake
  • ninja:brew install ninja

cmakeninja可通过 brew list查看是否安装

brew list.png

编译步骤

开始前先准备一下:

  • 新建一个名为swift-source的文件夹
  • 因为要clone源码,建议搭建小梯子。

第一步:clone swift源码

git clone --branch swift-5.3.1-RELEASE https://github.com/apple/swift.git

这里编译的是swift-5.3.1-Release。可以自行在官网找到对应的分支,需要注意的是:swift源码版本需要与Xcode版本匹配(官方编译文档有说明)。目前最新版本是5.3.1。
clone完成文件大概700M。

第二步:update-checkou

./swift/utils/update-checkout --tag swift-5.3.1-RELEASE --clone

确保是在当前的swift-source目录下,然后执行上面命令。
这一步很重要,update-checkoutclone编译 swift 相关的库,不然编译一定会失败。(时间有点长,可以喝杯☕️)
这里编译需要注意一点:文件的路径尽量避免出现中文,中文有很大的概率会报错。

安装完如下:


update-checkout succeeded.png

完成后文件大概有3G。

第三步:编译

编译过程可以使用ninja,也可以使用Xcode,但是Xcode编译之后的支持性不是太好,所以这里采用ninja编译。

  • 利用 swift 源码中的脚本编译:
./swift/utils/build-script -x -R --debug-swift
  • 或者执行以下脚本查阅命令:
./swift/utils/build-script -r --debug-swift-stdlib --lldb

编译过程可能会报错:

swift-source.png

看报错信息应该是和CommandLine有关,直接删除Developer下的CommandLineTools,使用Xcode中的就好。

sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select -s /Applications/Xcode.app
BUILD SUCCEEDED.png

如果的你的目录有可执行文件swift就编译完成了。


image.jpg
编译完成.png

编译完文件大概有50G。

第四步:使用VSCode调试Swift

  • 首先下载VSCode并安装。
  • 使用VSCode来安装一个CodeLLDB插件。
image.png
  • 将swift-source导入VSCode,创建JSON文件,选择LLDB模式

    image.png

  • 添加配置文件launch.json,并修改

    image.png

{
    "version": "0.2.0",
    "configurations": [
    
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceFolder}/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift",
            "args": [],
            "cwd": "${workspaceFolder}"
        }
   ]
}

注意的是program的路径需要与你编译的文件路径一致

  • run起来之后

    image.png

  • 过滤掉断点, 查看终端
    这个时候就证明正常跑起来了


    image.png

这个时候我们可以写swift代码,进行调试


image.png

可以看到本地变量没有任何显示(原因是CodeLLDB这个插件的作者没有支持swift语言),当然并不妨碍调试源代码。

设置本地变量显示支持swift

  • 准备工作:做下面步骤的时候最好先备份,防止误操作。

  • 找到CodeLLDB的安装目录

    image.png

  • 然后找到编译过后的lldb文件目录,把目录里面的文件全部拷贝到上面的目录中(lldbcode本质上也是使用bin目录下的lldb来调试我们的源码)
    这一步的操作是要让codelldb使用我们编译好的swift中的lldb来调试代码。先找到VSCode插件的安装目录,一般情况下在用户目录下:

    image.png

  • swift编译后lldb文件复制到vscode lldb/lib目录下,删除本来就存在的liblldb.dylib文件,并将lldb文件重命名为liblldb.dylib
    lldb会直接用到自身lib目录下liblldb.dylib动态库来调试,liblldb.dylib本身包含了LLDB.framework文件。这里替换改名的目的是为了让vscode去找bin中我们编译之后的LLDB.framework。(当然如果替换后也不显示,可以拷贝别人相同版本的LLDB.framework到对应目录使用)

    image.png

你可能感兴趣的:(Swift 进阶001 -- Swift源码编译)