Swift之源码编译的环境搭建和编译流程

举报
Serendipity·y 发表于 2022/02/17 00:06:17 2022/02/17
【摘要】 编译环境 版本准备:macOS 10.15.3 Xcode 11.5brew install cmake njniaPython 2.XSwift 源码地址:Apple/Swift 编译流程 ① c...
编译环境
  • 版本准备:macOS 10.15.3 Xcode 11.5
  • brew install cmake njnia
  • Python 2.X
  • Swift 源码地址:Apple/Swift
编译流程
① clone 源码
  • clone 命令:
	git clone --branch swift-5.2.4-RELEASE https://github.com/apple/swift.git

  
 
  • 1
  • 这里我编译的是 swift-5.2.4-RELEASE,因为在编译源码的时候,这是我使用的版本。
  • 如果需要编译更新的源码,可自行在官网上寻找对应的版本:Apple/Swift。同时要注意对应的Xcode的版本要匹配(在官方文档编译的时候会有具体的说明)。
  • clone 完成如下:
	Cloning into 'swift'...
	
	remote: Enumerating objects: 1, done.
	remote: Counting objects: 100% (1/1), done.
	remote: Total 1170695 (delta 0), reused 0 (delta 0), pack-reused 1170694
	Receiving objects: 100% (1170695/1170695), 614.74 MiB | 9.37 MiB/s, done.
	Resolving deltas: 100% (953771/953771), done.
	Note: switching to '0bab712aea8f0eb74f3acc303d96857f697a98d8'.

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
② update-checkout
  • 确保当前的目录在 swift-source 下,然后执行以下命令:
	./swift/utils/update-checkout --tag swift-5.2.4-RELEASE --clone

  
 
  • 1
  • 结果如下:
	Skipping cmake on Darwin
	Skipping icu on Darwin
	Skipping clone of 'sourcekit-lsp', directory already exists
	Skipping clone of 'swift-syntax', directory already exists
	Skipping clone of 'cmake', requested by user
	Skipping clone of 'swift-xcode-playground-support', directory already exists
	Skipping clone of 'swift-format', directory already exists
	Skipping clone of 'indexstore-db', directory already exists
	Skipping clone of 'swift-stress-tester', directory already exists
	Skipping clone of 'llvm-project', directory already exists
	Skipping clone of 'llbuild', directory already exists
	Skipping clone of 'cmark', directory already exists
	Skipping clone of 'swift-corelibs-foundation', directory already exists
	Skipping clone of 'swift-tools-support-core', directory already exists
	Skipping clone of 'swift-corelibs-xctest', directory already exists
	Skipping clone of 'ninja', directory already exists
	Skipping clone of 'swift-integration-tests', directory already exists
	Skipping clone of 'swiftpm', directory already exists
	Skipping clone of 'swift', directory already exists
	Skipping clone of 'swift-corelibs-libdispatch', directory already exists
	Skipping clone of 'icu', requested by user

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 这一步特别重要,因为 update-checkout 会 clone 编译 swift 相关的库,不然之后编译 swift 的过程中一定会失败。
③ 编译
  • 编译过程中,既可以使用 njnia ,也可以使用 Xcode 来进行编译。在实际的编译测试过程中,Xcode 编译之后的支持性不是特别好,推荐使用 njnia 来编译。
  • 利用 swift 源码中的脚本编译:
	./swift/utils/build-script -x -R --debug-swift

  
 
  • 1
  • 或者执行以下脚本查阅命令:
	./swift/utils/build-script -r --debug-swift-stdlib --lldb

  
 
  • 1
  • 编译完成如下:

在这里插入图片描述

④ 调试 Swift
  • 要在 Xcode 中打开 Swift 项目,请打开/swift-source/build/Xcode-ReleaseAssert+swift-DebugAssert/swift-macosx-x86_64/Swift.xcodeproj。
  • 它将为所有可用目标自动创建很多方案。常见的调试流程将涉及:
    • 选择 swift scheme。
    • 调出 scheme 编辑器(⌘⇧<)。
    • 选择 Arguments 选项卡,然后单击 +。
    • 添加命令行选项,这个根据自行需求设置,如果没有特殊需求,正常编译。
    • 关闭scheme 编辑器。
    • 编译并运行。
⑤ 使用 VSCode 调试 Swift
  • 打开 VSCode 安装 CodeLLDB 插件,如下所示:

在这里插入图片描述

  • 配置JSON 文件,如下所示:

在这里插入图片描述

  • 配置内容如下:
	"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}"
        }
    ]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 注意:上面的 program 文件路径需要和你编译的文件路径相同。
  • Run 之后:

在这里插入图片描述

  • 过掉断点:

在这里插入图片描述

  • 示例如下:

在这里插入图片描述

  • 在调试 .swift 文件的时候,可能不会出现上面 3 的情况,解决办法如下:
    • 先找 LLDB 的安装路径,如下:

在这里插入图片描述

    • 然后找到编译之后的 LLDB 的文件路径,把这里面的文件全部拷贝到上面的目录之下:

在这里插入图片描述

    • 同时修改 CodeLLDB 的 lib 文件下的 dylib 文件:

在这里插入图片描述

    • 切换到终端,然后就可调试 Swift 源码。
  • 在终端中输入以下代码(也可以从 swift 文件拷贝):

在这里插入图片描述

  • 在源码中搜索 *_swift_allocObject,加上断点:

在这里插入图片描述

  • 继续在终端输入 var t = YDWTeacher(),然后回车:

在这里插入图片描述

  • 这样我们就可以愉快的玩耍调试 Swift 源码啦!

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/110559621

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。