swift-5.5.1-RELEASE源码编译(Xcode)

306 阅读3分钟

编译前提与注意事项

对于源码的版本要与Xcode的swift版本一致,对于macOS的版本参照一下CI说明文档
提供两个宝藏网站以帮你查询你的Xcode与swift的version信息:
Xcode Releases
Swift Version

当前环境

MacOS Version: Monterey 12.4(Apple M1)
Xcode Version: 13.1
python3 Version: 3.9.6
cmark Version: 3.19.6
ninja Version: 1.10.2
sccache Version: 0.2.15(非必需)

编译过程

为项目创建文件夹

mkdir swift-project
cd swift-project

clone swift-5.5.1-RELEASE源码(推荐SSH方式,设置SSH请参考此链接)

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

通过update-checkout脚本对编译swift依赖库进行clone

utils/update-checkout --tag swift-5.5.1-RELEASE --clone-with-ssh

此步骤失败几率很大,原因大都是由于网络导致的,如果在公司编译,建议早晨或者晚上稍晚一些,尽量规避一些网络问题。此前在测试编译过swift-5.3.1出现过python2.7问题,但是如果编译swift-5.5.1则可以完全使用python3,目前还没有遇到关于python的错误。

update-checkout执行成功的结果如图:

update-checkout.png

如果安装了sccache,将其运行。

sccache --start-server

Sccache默认为10GB的缓存大小,与构建工件相比相对较小。您可以提高它,例如通过在dotfile中设置export SCCACHE_CACHE_SIZE="50G"。有关更多详细信息,请参阅Sccache README

通过Xcode方式build

utils/build-script --skip-build-benchmarks \

  --skip-ios --skip-watchos --skip-tvos --swift-darwin-supported-archs "$(uname -m)" \

  --sccache --release-debuginfo \                                      

  --xcode

参数说明:
--skip-build-benchmarks:跳过构建swift基准测试套件
--skip-ios --skip-watchos --skip-tvos:跳过iOS、watchos、tvos相关内容
--swift-darwin-supported-archs:设置构建平台,如果不设置,默认全平台构建
$(uname -m):获取当前mac的架构
--sccache:使用缓存工具,当删除构建目录重新构建的时候提高构建速度
--release-debuginfo:构建所有的内容RelWithDebInfo(包含debug和release)带有调试信息
--xcode:使用Xcode方式构建
build-script --help: 更多参数请参考help

build-script过程编译成功大约需要50G的空间。如果编译失败,原因基本是参数传入的问题(推测是某些参数构建需要特定环境支持),根据所需选择适当的参数。如果只是想在本地运行一些,调试代码,对测试没有过多要求,上述参数是我验证最优解了。

build-script编译成功如下图:

build-scuueeded.png

使用Xcode编译成功会在swift-macosx-x86_64文件夹下生成项目Swift.xcodeproj:

filePath.png

打开Swift.xcodeproj编译ALL_BUILD

提示错误libcmark.a没有这样的文件或目录

ALL_BUILD_ERROR.png 解决方案:
打开编译结果,找到cmake.xcodeproj,选择schemecmakebuild一下就可以。当前我的电脑的cmake.xcodeproj路径:/Users/bblv/swift-project/build/Xcode-RelWithDebInfoAssert/cmark-macosx-x86_64/cmark.xcodeproj提供参考。

创建debug工程

1、创建新的Target-->BBLvBuild

2、为BBLvBuild添加依赖ALL_BUILD(Build Phases -> Dependencies -> +)

3、打开BBLvBuild的Build Settings,设置ENABLE_HARDENED_RUNTIME的值为NO

BBLvBuild-1.png

BBLvBuild-2.png

至此,所有关于环境设定相关都已经完成。

BBLvBuild-debug调试

在BBLvBuild的main函数里面创建一个类,简单编写一些测试代码

//
//  main.swift
//  BBLvBuild
//
//  Created by BBLv on 2022/7/13.
//

import Foundation

print("Hello, World!")

class BBLvPerson {
    var hobby = "girl"
    var name = "BBLv"
}

var p = BBLvPerson()

print(p)

BBLvBuild-debug-1.png

总结

之前通过ninja构建过swift-5.2.4-RELEASE版本,通过vscode和lldb插件来调试过swift源码。相比之下对于iOS开发者来讲可能使用Xcode调试会更加的舒服。对于Xcode的使用也更加的娴熟。自定义一些类也更加的方便。虽然xcode有许多许多的问题,但是听说Xcode 14会有所改善。

参考

github.com/apple/swift…