[Swift拓展]3、Swift5.10源码编译

1、准备工作

XCode 15.3
Apple M1 Pro
macOS Sonoma 14.4
python3 3.9.6
ninja 1.11.1
cmake 3.29.0(较高版本保证编译成功)
sccache 0.7.7
磁盘空间60G

// 通过homebrew安装统一安装环境
brew install cmake ninja sccache

2、项目拉取

需要新建一个文件夹

mkdir ~/Documents/swift-project
cd ~/Documents/swift-project

然后找到你的 Xcode 所支持的 Swift 版别,由于自己的 Xcode 为 15.3 版别,所以直接下载 Swift 5.10 Release。查找 Xcode 对应的 Swift 的版别有两种方式:
1、去官网,检查 Xcode 的 Release Notes,在 Overview 中会有介绍。例如:Xcode 15.3 Release Notes
2、终端运行指令检查 xcrun swift -version。

swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0

在新建的目录中履行如下指令拉取对应的 Swift 源码,并 cd 到源码目录:

git clone --branch swift-5.10-RELEASE git@github.com:apple/swift.git
cd swift

拉取源码后还须拉取其他依赖,在防止拉取依赖的过程中产生其他错误,还需要预先执行以下命令

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

然后在swift目录下执行如下命令

cd swift
./utils/update-checkout --tag swift-5.10-RELEASE --clone  --clone-with-ssh

后面的参数可以查看 update-checkout目录下的 update_checkout.py脚本文件,--clone-with-ssh表示使用git@github.com:流的形式拉取,而非https的形式,以上操作需要开启代理
注意:在更新的过程中可能因为某个依赖过于大而更新失败。可以单独更新该依赖项。
例如:icu依赖项比较大,反复更新都不成功。

[icu]                                   + git fetch --recurse-submodules=yes --tags
[icu]                                   + git rebase FETCH_HEAD
[icu]                                   b'git-lfs filter-process: git-lfs: command not found'
[icu]                                   b'fatal: The remote end hung up unexpectedly'
[icu]                                   b'Cannot rebase: You have unstaged changes.'
[icu]                                   b'Please commit or stash them.'
Error on repo "/Users/shiji/work/github/swift-project/icu": Traceback (most recent call last):
  File "/Users/shiji/work/github/swift-project/swift/utils/update_checkout/update_checkout/update_checkout.py", line 257, in update_single_repository
    shell.run(["git", "rebase", "FETCH_HEAD"],
  File "/Users/shiji/work/github/swift-project/swift/utils/swift_build_support/swift_build_support/shell.py", line 257, in run
    raise eout
Exception: ['git', 'rebase', 'FETCH_HEAD']

通过查找update_checkout文件夹下的update-checkout-config.json文件,找到icu的更新地址单独更新,分支 release-65-1

cd swift-project
git clone git@github.com:unicode-org/icu.git
Cloning into 'icu'...
remote: Enumerating objects: 1301093, done.
remote: Counting objects: 100% (9326/9326), done.
remote: Compressing objects: 100% (3004/3004), done.
remote: Total 1301093 (delta 4674), reused 8591 (delta 3964), pack-reused 1291767
Receiving objects: 100% (1301093/1301093), 1.34 GiB | 3.52 MiB/s, done.
Resolving deltas: 100% (813983/813983), done.
git checkout -b origin/release-65-1

最终通过该方式,依次更新失败的依赖项。

如果上述依然更新不成功,文件删除,按照上述步骤重新执行一次

3、编译

1、前面准备工作做完了之后需求用到官方的脚本,在 utils 目录下的 build-script 脚本来编译我们的Swift项目,在编译前可以通过命令来查看编译选项的含义

cd swift
./utils/build-script -h

或者打开脚本文件 .swift/utils/build_swift/build_swift/driver_arguments.py,我们使用第1519行给出的命令。

脚本命令

也可以查看命令参数
2、我这里使用如下命令编译

cd swift
./utils/build-script --swift-darwin-supported-archs="$(uname -m)" \
--release-debuginfo --debug-swift-stdlib \
--skip-ios --skip-watchos --skip-tvos \
--skip-early-swiftsyntax --skip-build-benchmarks \
--sccache --xcode 

--swift-darwin-supported-archs:设置构建平台,如果不设置,默认全平台构建
$(uname -m):获取当前mac的架构,我的mac为M2的arm64的架构
--release-debuginfo:构建所有的内容RelWithDebInfo(包含debug和release)带有调试信息
--debug-swift-stdlib: 编译带有调试信息的 Swift标准库stdlib --skip-ios --skip-watchos --skip-tvos:跳过iOS、watchos、tvos相关内容
--skip-early-swiftsyntax : 表示跳过earlyswiftsyntax, 这个不加会编译出错
--skip-build-benchmarks:跳过构建swift基准测试套件
--sccache:使用缓存工具,当删除构建目录重新构建的时候提高构建速度
--xcode:使用Xcode方式构建
3、最终编译完成

编译产物

4、Build

依次编译三个产物,顺序分别为
1、cmark-gfm.xcodeproj
2、LLVM.xcodeproj
3、Swift.xcodeproj
1、cmark-gfm.xcodeproj Edit Scheme选择如下 RelWithDebInfo编译通过

cmark-gfm

2、LLVM.xcodeproj,创建new Schema为ALL_BUILD, Edit Scheme选择如下 RelWithDebInfo。在编译 过程中会有i386架构的问题,不用理会,虽然工程最终build以fail结束,但是Swift编译所需的arm64已经准备好了。
3、Swift.xcodeproj创建new Schema为ALL_BUILD, Edit Scheme选择如下 RelWithDebInfo编译通过。

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