Swift底层源码编译步骤

Swift底层源码编译步骤

准备工作

  • HomeBrew(软件包管理器)
    如果被墙,请查看:
    国内安装HomeBrew教程

  • 预留60G空间(编译后灰常占用空间)

  • Python2.X (使用HomeBrew安装最新即可)

  • Xcode 12.2

  • 安装cmake(推荐使用brew cask install安装)

    • 推荐使用“brew cask install homebrew/cask/cmake”安装
    • 直接使用brew install camke会报警告
      [图片上传失败...(image-8ddd3f-1607407538583)]
    • 为了保险起见,我用brew install cmake也执行了一遍
  • 安装ninja(它用来编译Swift,Xcode会出奇怪的问题)

    • 使用“brew ninja”安装

创建母文件夹

mkdir swift-source
cd swift-source

第一步 clone swift 源码

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

这里推荐使用最新的分支以对应新版的Xcode。别的分支我也下载过,update-checkout会出各种问题

第二步 update-checkout

执行此指令确保在swift-source目录下(重点)

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

这一步会clone 编译Swift相关的库

第三步 编译(推荐使用ninja直接在终端编译)(编译了1小时)

在swift-source目录下执行以下指令:

./swift/utils/build-script -r --debug-swift-stdlib --lldb

编译完成后:如果的你的目录有可执行文件swift就大功告成了


image

第四步 使用VSCode 调试 Swift

  • 在VSCode我们需要安装CodeLLDB


    安装CodeLLDB
  • 将swift-source导入vscode,创建JSON文件,选择LLDB模式


    创建JSON

    选择LLDB
  • 编辑JSON文件


    编辑JSON

    *run起来,跳过断点,选择TERMINAL即可编写Swift代码


    跳过断点

    编写swift

最后说说我再编译过程中遇到的坑以及解决方案吧

  • 在编译过程中报了一堆error:


    报错截图

    从网查了好多从一篇和swift无关的文章中找到了解决方案,大致意思
    就是和#include的检索顺序有关系。首先可以通过命令找到自己系统的#include的顺序
    而能找到math.h的第一个路径,则是/usr/local/include/math.h这个文件,这和预期是不一致的,预期要使用的math.h是其同目录的math.h。因此,我们可以对原来的cmath代码进行调整,将改成"math.h"即可。
    具体步骤:

修改“/Library/Developer/CommandLineTools/usr/include/c++/v1/cmath”中的#include 为#include "math.h"。
截图所示:


image

用IDE打开:


image

另一种解决方案

该信息的报错应该是和CommandLineTools有关,那就直接删除
1.在终端中执行以下代码:

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

2.从新执行编译即可

./swift/utils/build-script -r --debug-swift-stdlib --lldb

使用VSCode无法展示本地变量的问题

-w1173

1.将swift-source下编译好的build目录中对应路径bin文件全部拷贝


-w827

2.将swift源码中的文件lldb 赋值到 vscode下的lib文件 覆盖掉原来的liblldb.dylib,完成替换
3.退出vscode,从新打开并debug,即可看到本地变量。

我们看看效果:


-w845

这就是Swift源码完整的编译流程,有问题可以给我留言,探索过程是蛮有意思的。

最后强烈建议使用科学上网,科学上网,科学上网。

你可能感兴趣的:(Swift底层源码编译步骤)