Swift源码编译

准备工作

  • 磁盘空间60G

编译环境

  • Xcode 12.2(12B45b)
  • Visual studio Code( 1.51.1)
  • Python 3.9.0
  • macOS Big Sur 11.0.1
  • brew install cmake //3.19.1
  • brew install ninja //1.10.2
# build tools
brew install cmake ninja

安装完成后 brew list 查看


image.png

Xcode,swift,macOS最好用对应的版本。

编译步骤

一:clone swift 源码

我这里是clone的最新的5.3.1版本源码地址

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

如果clone缓慢的话换成:参考来源

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

5.3.1版本克隆下来大概700M的样子。

二:update-checkout

在swift-source目录下操作:

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

这一步的目的是拉取我们在编译源码过程中所需要的其它分支文件,如果不拉取后续第三步编译swift源码的时候一定会失败。

错误处理

fatal: unable to access 'https://github.com/apple/swift-syntax.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/swift-package-manager.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/jpsim/Yams.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-integration-tests.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/swift-driver.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/sourcekit-lsp.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/indexstore-db.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/llvm-project.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/apple/swift-xcode-playground-support.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com/ninja-build/ninja.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-corelibs-xctest.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

fatal: unable to access 'https://github.com.cnpmjs.org/apple/swift.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-corelibs-foundation.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
fatal: unable to access 'https://github.com/apple/swift-llbuild.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

ERROR: command terminated with a non-zero exit status 128, aborting

解决

➜  ~ git config --global http.postBuffer 524288000
➜  ~ git config --global http.sslVerify "false"

安装完了大概这样


image.png

文件大小大概3.4G左右。

三:编译

编译的过程中可以使用ninja,也可以使用Xcode。由于Xcode需要和特定版本绑定,并且Xcode编译之后的支持性不是特别好。推荐使用njnja来作为编译工具。
命令如下:

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

我编译的时候主要是遇到如下错误:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:325:9: error: no member named 'isless' in the global namespace
using ::isless;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:326:9: error: no member named 'islessequal' in the global namespace
using ::islessequal;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:327:9: error: no member named 'islessgreater' in the global namespace
using ::islessgreater;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:328:9: error: no member named 'isunordered' in the global namespace
using ::isunordered;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:329:9: error: no member named 'isunordered' in the global namespace
using ::isunordered;
/Users/zaizai/improve/swift-source/llvm-project/llvm/include/llvm/Analysis/ScalarEvolution.h:1696:22: warning: '\c' command does not have a valid word argument [-Wdocumentation]
  /// by a call to \c @llvm.experimental.guard in \p BB.
                   ~~^
1 warning and 13 errors generated.
[42/1341][  3%][56.500s] Building CXX ...MakeFiles/swiftIRGen.dir/GenCast.cpp.o
ninja: build stopped: subcommand failed.
ERROR: command terminated with a non-zero exit status 1, aborting

解决方案:
看报错信息应该是和CommandLine有关,直接删除Developer下的CommandLineTools,使用Xcode中的。

  1. sudo rm -rf /Library/Developer/CommandLineTools
  2. sudo xcode-select -s /Applications/Xcode.app
    执行完上述命令后重新编译
    编译完成后


    image.png

    debug模式和release模式下大小差很多,debug模式下编译完文件大小大概50G左右。

四:配置VSCode调试Swift

安装CodeLLDB插件

image.png

配置json文件

选择的时候选择创建lldb json文件,目的是去到我们编译好的文件目录加载swift可执行文件。


image.png

文件路径为编译文件swift路径

/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift

launch json文件如下:

{
  "version": "0.2.0",
  "configurations": [

    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug",
      //此处路径为swift编译文件的路径
      "program": "${workspaceFolder}//build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift",
      "args": [],
      "cwd": "${workspaceFolder}"
    }
  ]
}

接下来我们直接run起来后断点内容如下:

Launching: /Users/***/swift-source/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/swift-macosx-x86_64/bin/swift
Launched process 89514
Stop reason: exec
image.png

过掉断点查看终端
这个时候就证明已经正常跑起来了。

***  You are running Swift's integrated REPL,  ***
***  intended for compiler and stdlib          ***
***  development and testing purposes only.    ***
***  The full REPL is built as part of LLDB.   ***
***  Type ':help' for assistance.              ***
(swift) 

image.png

这个时候我们可以写swift代码,在forEach中打个断点
image.png

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

本地变量显示支持swift

lldbcode本质上也是使用bin目录下的lldb来调试我们的源码。
1.复制编译的lldb目录下的bin文件到vscode目录
这一步的操作是要让codelldb使用我们编译好的swift中的lldb来调试代码。先找到VSCode插件的安装目录,一般情况下在用户目录下:

/Users/***/.vscode/extensions/vadimcn.vscode-lldb-1.6.0/lldb/lib
image.png

我们找到lldb目录下的bin文件夹,把编译过后的swift代码中lldb下的bin文件夹内容全部复制到vscode lldb/bin目录下。(这里最好先将vscode lldb/bin目录下的内容备份,防止出现错误)

/Users/***/***/swift-source/build/Ninja-RelWithDebInfoAssert+stdlib-DebugAssert/lldb-macosx-x86_64/bin
image.png

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

image.png

重启vscode再次尝试应该就能在debug下面看到变量了。

image.png

终端输入swift代码调试

当然我们也可以直接在终端中输入swift代码

class HotpotCat {
    var name : String = "hotpot"
}

image.png

定义一个实例变量,var hotpot = HotpotCat()这里我们先不要回车,先找到私有方法_swift_allocObject_打个断点
image.png

接着回车,可以在debug下面看到变量的情况,这里我们可以看到p这个变量占了32个字节。
image.png

至此,我们就已经编译和配置好swift源码环境了。

编译总结:

一般到第二步都没问题,第三步遇见错误大概率是环境的问题,不行就

  • 1.删除/usr/local/include 文件夹
  • 2.重装Homebrew(慎重,之前通过brew装的都会没)
  • 3.重装cmake
  • 4.重装ninja
  • 5.配置CommandLine
    sudo rm -rf /Library/Developer/CommandLineTools
    sudo xcode-select -s /Applications/Xcode.app

然后重新编译。我大概是这么折腾好第三步的,最好别用公司电脑折腾,别导致工作环境出现问题。仅供参考。
当然我们也可以直接下载使用别人编译好的文件,只不过需要解压目录和别人编译的路径完全一样(编译源码的过程中文件路径已经写死)。

参考

Xcode releases:这个网站汇总了Xcode版本信息,比官网清晰。下载资源使用官方渠道。
Swift version:这个网站汇总了Swift版本和Xcode版本相关的信息。
https://stackoverflow.com/questions/59071881/problems-with-c-and-gems-on-osx-catalina

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容