编译调试swift5.7源码

环境:

  • 电脑:apple m1 pro
  • 系统:macOS13
  • Xcode: 14.2
  • Cmake: 3.25.1
  • Ninja: 1.11.1
  • sccache: 0.3.3
  • python: 3.10 (如果你的mac不是这个版本,可以通过 brew install python@3.10下载,然后看这篇文章切换到该python版本)
  • swift代码地址
  • Xcode 14(不能是15及以上,否则编译会报错。因为xcode和swift版本有对应关系:https://swiftversion.net。各个xcode版本的下载地址)
  1. 新建一个文件夹(用于存放clone下来的swift源码),然后进入该文件夹。本例中是在终端执行了mkdir swift-project,然后执行cd swift-project/实现;
  2. 在终端中执行:git clone --branch swift-5.7.1-RELEASE https://github.com/apple/swift.git,目的是把swift的swift-5.7.1-RELEASE版本的代码clone下来;
  3. 在终端中执行:./swift/utils/update-checkout --tag swift-5.7.1-RELEASE --clone,目的是下载编译swift所需要的代码库,当看到如下图所示的信息时,说明下载成功了;
    在这里插入图片描述
  4. 安装编译工具(cmake、ninja、sccache):在终端上执行brew install cmake ninja sccache。(但是,这种方式安装的是这3个工具的最新版本,为了和本文环境对齐,所以可以参考这篇文章来通过brew安装指定版本)
  5. 在终端执行cd swift,目的是切到swift文件夹下;
  6. 在终端执行utils/build-script --xcode --release-debuginfo --debug-swift-stdlib --skip-build-benchmarks --swift-darwin-supported-archs "$(uname -m)" --sccache --skip-ios --skip-tvos --skip-watchos --bootstrapping=off,目的是生成包含来swift源码的xcode工程。但不幸的是,你会遇到这个错误(error: using unsupported Xcode version,如下图所示),解决方法很简单:在终端执行export SKIP_XCODE_VERSION_CHECK=1,即设置该环境变量。设置之后再次执行utils/build-script --xcode --release-debuginfo --debug-swift-stdlib --skip-build-benchmarks --swift-darwin-supported-archs "$(uname -m)" --sccache --skip-ios --skip-tvos --skip-watchos --bootstrapping=off
    在这里插入图片描述
    编译成功后,结果如下图。
    在这里插入图片描述
  7. 此时我们可以打开如下图所示的build文件夹,然后可以看到Swift.xcodeproj文件。
    在这里插入图片描述
  8. 我们用xcode打开Swift.xcodeproj文件,此时会弹出如下图所示的框,我们选择“automatically create schemes”,目的是让xcode给swift工程自动创建好可以编译的scheme。
    在这里插入图片描述
  9. 我们在该工程内直接创建一个我们自己的target,操作如下3张图所示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  10. 给我们创建的target(本例指的是MySwiftaa)添加对ALL_BUILD库的依赖,操作如下第1张图所示,添加后的结果如下面第2张图所示。
    在这里插入图片描述
    在这里插入图片描述
  11. 把我们创建的target(本例指的是MySwiftaa)中的Enable Handened Runtime改为NO
    在这里插入图片描述
  12. 在MySwiftaa中的main文件中写入如下图的代码
    在这里插入图片描述
class Person {var name = "csx"
}let p = Person()
  1. 在HeapObject文件中的swift_allocObject函数中断个点,然后编译运行该target,即可发现断点生效了,如下图所示。说明能用xcode调试swift了。
    在这里插入图片描述

如果你还想调试更多的swift的源码,请看下面

上面的步骤6所执行的编译只能调试swift的stdlib库里面的swift源码,比如上图所示的Person类的alloc方法的源码。此时如果你想调试Array的forEach方法,那么你需要重新编译swift源码(上面的步骤6所干的事情),只不过其中的编译参数–debug-swift-stdlib要变成–debug-swift,此时的编译命令如下:utils/build-script --xcode --release-debuginfo --debug-swift --skip-build-benchmarks --swift-darwin-supported-archs "$(uname -m)" --sccache --skip-ios --skip-tvos --skip-watchos --bootstrapping=off。可能你会遇到如下图的错误,但没有关系,因为swift-project/build/Xcode-RelWithDebInfoAssert+swift-DebugAssert/swift-macosx-arm64文件夹下面已经生成了Swift.xcodeproj文件了,此时你可以用xcode打开该文件。
在这里插入图片描述
然后编译你的自定义target。如果遇到如下图所示的错误,比如no such file or directory: ‘swift-project/build/Xcode-RelWithDebInfoAssert+swift-DebugAssert/llvm-macosx-arm64/Debug/lib/libLLVMSupport.a’
在这里插入图片描述
那么我们可以打开LLVM.xcodeproj,如下两张图所示。
在这里插入图片描述
在这里插入图片描述
选择名为ALL_BUILD的target,然后点击运行按钮。当编译成功后,再回到Swift.xcodeproj工程,然后就可以编译运行了。此时也能断点调试swift的代码了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568驱动指南|第十五篇 I2C-第176章 通过逻辑分析仪认识I2C波形

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

甄选版“论软件系统架构评估”,软考高级论文,系统架构设计师论文

论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…

mac软件卸载后的残留文件删除 mac如何卸载应用程序

很多人都不知道,mac使用系统方式卸载后会有残留文件未被删除,久而久之就会占用大量的磁盘空间。今天小编就来教大家如何删除mac软件卸载后的残留文件,如果你想不留痕迹的删除,mac又该如何正确卸载应用程序,本文将一一为…

Python 获取字典中的值(八种方法)

Python 字典(dictionary)是一种可变容器模型,可以存储任意数量的任意类型的数据。字典通常用于存储键值对,每个元素由一个键(key)和一个值(value)组成,键和值之间用冒号分隔。 以下是 Python 字典取值的几…

嵌入式软件工程应该学些什么?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!毕业后相当嵌入式软件工程…

从理论到实践的指南:企业如何建立有效的EHS管理体系?

企业如何建立有效的EHS管理体系?对于任何企业,没有安全就谈不上稳定生产和经济效益,因此建立EHS管理体系是解决企业长期追求的建立安全管理长效机制的最有效手段。良好的体系运转,可以最大限度地减少事故发生。 这篇借着开头这个…

C++ (第二天下午---面向对象之类与对象)

一、面向过程与面向对象 1、面向过程 面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。 举个例子,下五子棋,面向过程…

LLM大模型工程师面试经验宝典--进阶版2(2024.7月最新)

目录 1 大模型怎么评测? 2 大模型的honest原则是如何实现的?模型如何判断回答 的知识是训练过的已知的知识,怎么训练这种能力? 3 如何衡量大模型水平? 4 大模型评估方法 有哪些? 5 大模型评估工具 有哪…

解锁数据资产的无限潜能:深入探索创新的数据分析技术,挖掘其在实际应用场景中的广阔价值,助力企业发掘数据背后的深层信息,实现业务的持续增长与创新

目录 一、引言 二、创新数据分析技术的发展 1、大数据分析技术 2、人工智能与机器学习 3、可视化分析技术 三、创新数据分析技术在实际应用场景中的价值 1、市场洞察与竞争分析 2、客户细分与个性化营销 3、业务流程优化与风险管理 4、产品创新与研发 四、案例分析 …

Python处理Excel文件的实用技巧使用详解

概要 在数据分析和处理的过程中,Excel 是一种广泛使用的数据存储和交换格式。Python 提供了多个强大的库来处理 Excel 文件,如 pandas、openpyxl 和 xlrd 等。本文将详细介绍如何使用这些库进行 Excel 文件的常用操作,包括读取、写入、修改和格式化等。 使用 pandas 处理 E…

仪器校准的概念与定义,计量校准是什么?

仪器校准的定义,在之前所颁布的《国际计量学词汇 基础和通用概念及相关术语》文件中,已经有了明确说明,而该文件做了修改以后,在后续新的定义中,仪器校准具体被分为两部分,第一步是将被计量仪器和计量校准的…

数据库测试数据准备厂商 Snaplet 宣布停止运营

上周刚获知「数据库调优厂商 OtterTune 宣布停止运营」。而今天下班前,同事又突然刷到另一家海外数据库工具商 Snaplet 也停止运营了。Snaplet 主要帮助开发团队在数据库中生成仿真度高且合规的测试数据。我们在年初还撰文介绍过它「告别手搓!Postgres 一…

vue3中若v-model绑定的响应字段出现三级,该如何实现rules验证规则

比如以下内容: 配置的rules内容 const rulesref({title:[{required:true,message:"请输入标题",trigger:"blur"},{max:50,message:"最大不能超过256个字",trigger:"blur"}],Category:[{required:true,message:"请选择…

竹云位居首位 |沙利文《2024年全球及中国IAM中间件市场报告》正式发布

7月2日,弗若斯特沙利文(Frost & Sullivan,以下简称“沙利文”)正式发布《2024年全球及中国IAM中间件市场报告》(以下简称“报告”),从行业背景、市场规模、驱动因素、发展趋势等维度阐述当前…

让采购和工程师们既爱又恨的任务——BOM

在项目研发与生产过程中,有一个常常让采购经理和工程师们既爱又恨的任务,那就是整理BBOMB。BOM作为连接设计与制造的桥梁,其重要性不言而喻,它详细列出了产品构成所需的所有零部件、材料及其规格、数量,是成本估算、采…

自然语言处理:第四十一章 解读大模型的参数

文章链接:7B?13B?175B?解读大模型的参数 (qq.com) 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新…

C++ | Leetcode C++题解之第191题位1的个数

题目: 题解: class Solution { public:int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret;} };

清新简约卡片风格蓝紫渐变色短视频苹果CMS模板

首途第三十三套清新简约卡片风格蓝紫渐变色短视频模板,一套苹果CMSV10主题。 这套主题是简约风格,以纯洁的白色和深邃的紫色为主色调,为您提供了一种清新、时尚的浏览体验。 在这个简洁而美丽的界面中,您可以轻松畅享各种精彩短…

KUKA机器人不同运行方式

KUKA机器人有以下四种运行方式: 1、手动慢速运行(T1) 2、手动快速运行(T2) 3、自动运行(AUT) 4、外部自动运行(AUT EXT) 将示教器上的钥匙向右旋转,就会…

对原生textarea加上:当前输入字数/最大输入字数

源码: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Textarea Character Counter with Dragga…