编译环境
  • 版本准备: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
  • 这里我编译的是 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 1170694Receiving objects: 100% (1170695/1170695), 614.74 MiB | 9.37 MiB/s, done.Resolving deltas: 100% (953771/953771), done.Note: switching to '0bab712aea8f0eb74f3acc303d96857f697a98d8'.
② update-checkout
  • 确保当前的目录在 swift-source 下,然后执行以下命令:
 ./swift/utils/update-checkout --tag swift-5.2.4-RELEASE --clone
  • 结果如下:
 Skipping cmake on DarwinSkipping icu on DarwinSkipping clone of 'sourcekit-lsp', directory already existsSkipping clone of 'swift-syntax', directory already existsSkipping clone of 'cmake', requested by userSkipping clone of 'swift-xcode-playground-support', directory already existsSkipping clone of 'swift-format', directory already existsSkipping clone of 'indexstore-db', directory already existsSkipping clone of 'swift-stress-tester', directory already existsSkipping clone of 'llvm-project', directory already existsSkipping clone of 'llbuild', directory already existsSkipping clone of 'cmark', directory already existsSkipping clone of 'swift-corelibs-foundation', directory already existsSkipping clone of 'swift-tools-support-core', directory already existsSkipping clone of 'swift-corelibs-xctest', directory already existsSkipping clone of 'ninja', directory already existsSkipping clone of 'swift-integration-tests', directory already existsSkipping clone of 'swiftpm', directory already existsSkipping clone of 'swift', directory already existsSkipping clone of 'swift-corelibs-libdispatch', directory already existsSkipping clone of 'icu', requested by user
  • 这一步特别重要,因为 update-checkout 会 clone 编译 swift 相关的库,不然之后编译 swift 的过程中一定会失败。
③ 编译
  • 编译过程中,既可以使用 njnia ,也可以使用 Xcode 来进行编译。在实际的编译测试过程中,Xcode 编译之后的支持性不是特别好,推荐使用 njnia 来编译。
  • 利用 swift 源码中的脚本编译:
 ./swift/utils/build-script -x -R --debug-swift
  • 或者执行以下脚本查阅命令:
 ./swift/utils/build-script -r --debug-swift-stdlib --lldb
  • 编译完成如下:

④ 调试 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}"}]
  • 注意:上面的 program 文件路径需要和你编译的文件路径相同。
  • Run 之后:

  • 过掉断点:

  • 示例如下:

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

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

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

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

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

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

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

Swift之源码编译的环境搭建和编译流程相关推荐

  1. 4.2.10 Kafka源码剖析, 阅读环境搭建, broker启动流程, topic创建流程, Producer生产者流程, Consumer消费者流程,

    目录 4.1 Kafka源码剖析之源码阅读环境搭建 4.1.1 安装配置Gradle 4.1.2 Scala的安装和配置 4.1.3 Idea配置 4.1.4 源码操作 4.2 Kafka源码剖析之B ...

  2. ffmpeg编译gb28181_RTSP/GB28181协议/海康SDK/Ehome协议视频上云网关EasyCVR视频平台在linux环境下ffmpeg源码单步调试环境搭建...

    目前TSINGSEE青犀视频研发的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍.Eho ...

  3. Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建

    在研究mycat源码之前必须先把环境搭建好.这篇文章的目标就是搭建mycat源码调试环境.环境主要包括: git jdk maven eclipse mysql 这里假设你知道上面的知识点.我们搭建的 ...

  4. EDK2源码下载及环境搭建

    一.EDK2源码下载 上一片笔记中已经下载了git工具这里用git工具来下载edk2源码及编译工具 首先从github中将edk文件导入到我们的gittee仓库中再从我们的gitee仓库中下拉到我们的 ...

  5. Elasticsearch源码解析:环境搭建

    在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码.我发现两种方法可以相辅相成,互相补充.阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想 ...

  6. Spring5源代码研究01:源码导入与环境搭建(完美无错误)

    为了阅读分析Spring 5源代码,需要搭建环境将源代码导入到本地.我们使用IntelliJ IDEA作为IDE工具来分析源码.网上有很多教程要么太老,要么没有经过实践验证,要么不完美报一堆错误. 本 ...

  7. build怎么调试 react_React源码下载-本地环境搭建

    前几天有小伙伴和我聊天,谈到现在前端面试越来越难,动不动就是xxx原理,有没有看过xx源码之类的问题, 之后就问我应该怎么来学习现在主流框架的源码,于是有了这一篇文章. 说到使用react那很简单 r ...

  8. AOSP 安卓源码-ubuntu开发环境搭建

    VM及Utuntu安装 Vmware安装/Ubuntu安装 系统安装 Vmware环境配置 安装Vmware-tools:     tar -xf xxx.tar.gz     sudo ./vmwa ...

  9. 消息中间件RocketMQ源码解析-- --调试环境搭建

    1. 依赖工具 JDK :1.8+ Maven IntelliJ IDEA 2. 源码拉取 从官方仓库 [https://github.com/apache/rocketmq) Fork 出属于自己的 ...

最新文章

  1. POJ - 1330 Nearest Common Ancestors tanjan_LCA
  2. TCGAbiolinks包分析TCGA数据
  3. Java学习之while语句
  4. spss预测变量重要性不可用_C4.5/5.0的SPSS操作
  5. android-侧滑菜单
  6. Eureka Server
  7. 下拉刷新:继承listView控件
  8. python如何仿写文章_python,python3.x_求助,用python仿写以下代码,python,python3.x,java - phpStudy...
  9. mysql load settings_在PHP中,有没有办法检查MySQL是否启用了'LOAD DATA INFILE'
  10. Spring 中注入什么意思?
  11. 矩池云升级JupyterLab版本教程
  12. switch语句的基本使用
  13. 出自蚂蚁课堂的简单springboot-demo
  14. 剖析STM32F103读写W25Q64
  15. jQuery实现下拉菜单[代码+详细讲解+效果图]
  16. 股指期货基差和升贴水介绍
  17. chrome 谷歌浏览器无法上网,IE浏览器可以上网
  18. 关于Error:Execution failed for task ':app:transformClassesWithDexForDebug'的解决方法
  19. Docker Windows Containers
  20. 安卓u盘格式化工具apk_你听说过badusb么,我扔个U盘你敢捡么?(文末附阿里云盘最新邀请码)...

热门文章

  1. Delphi 10.X 不用联接真机或模拟器编译出APK
  2. IoT与区块链的机遇与挑战
  3. 多线程中join()的用法
  4. JavaScript | 数据属性与访问器属性
  5. HDU1848 Fibonacci again and again SG函数
  6. C#sql语句如何使用占位符
  7. 自己编写jQuery插件之表单验证
  8. 计划策略70 之 MIXED MRP(mixed MRP)
  9. linux eclipse下qt开发环境搭建,Qt Eclipse开发环境的部署 上篇
  10. 在 Vue 中正确使用 防抖 和 节流