LV01-01-AliOSThings-09-源码与编译-04-AliosThings编译构建系统
本文主要是源码与编译——AliosThings编译构建系统的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu22.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | 阿里云 | 阿里云官网主页 |
阿里生活物联平台 | 生活物联网平台(飞燕平台)主页 | |
AliGenie | 天猫精灵开放平台AliGenie主页 | |
阿里物联网平台 | 阿里物联网平台主页 | |
Bluetooth 技术网站 | 蓝牙协议规范什么的可以来这里找 | |
Telink | Telink | Chips for a Smarter IoT (telink-semi.com) Telink中文官网 | |
开发手册 | AliOS Things开发指南 | AliOS Things开发指南,这里是最新版本,可以直接从官网找到 |
AliOS Things开发指南 | AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档 | |
AliOS Things开发指南(3.0) | AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档 | |
生活物联网平台开发文档 | 生活物联网平台(飞燕平台)开发文档 《设备端开发指南》 | |
Wi-Fi IoT品类定义与功能开发 | 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发 | |
硬件平台 | mk3080 WiFi开发板 | WiFi开发板使用指南-阿里云开发者社区 |
esp8266开发板 | 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com) | |
TLSR8258 Datasheet | Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258 | |
参考资料 | AliOS Things 3.0 应用开发指南 | 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考 |
IP知识百科 - 华为 (huawei.com) | IP的一些相关知识点 |
点击查看相关文件下载
分类 | 网址 | 说明 |
蓝牙规范相关文档 | Core Specification 5.2 | 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。 《Core_v5.2.pdf》 |
Mesh Model(v1.1) | 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。 本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。 《MshMDL_v1.1.pdf》 | |
Mesh Profile(v1.0.1) | 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。 《MshPRFv1.0.1.pdf》 | |
Mesh Device Properties | 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。 但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》 | |
GATT Specification Supplement | GATT Specification Supplement | Bluetooth® Technology Website。 好像可以在线看:《GATT Specification Supplement》 | |
Assigned Numbers | GATT的一些类型定义可以在这里找。 | |
AliOS Things | alios-things/AliOS-Things | Gitee上的AliOSThings SDK源码仓库 |
alibaba/AliOS-Things | GitHub上的AliOSThings SDK源码仓库 | |
天猫精灵蓝牙Mesh协议栈 | alibaba-archive/genie-bt-mesh-stack | GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。 之前是在alibaba/genie-bt-mesh-stack这个仓库。 写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a |
蓝牙Mesh设备开发指南 | 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容 |
AliosThings官方有一个编译构建系统的文档,在github上:AliOS Things build system · alibaba/AliOS-Things Wiki (github.com),它也有中文的:AliOS Things build system.zh · alibaba/AliOS-Things Wiki (github.com)
一、构建要素
一般来说,项目的建设包含以下要素:
组件化思想:组件化思想是指是功能模块可以随意地剪裁,拼接。实际上此思想的实现就主要依附于构建体系,一个组件存在的标志就是它有一个对应的 .mk 文件。
由于采用组件化管理思想,为了让每个组件相互隔离,独立配置,每一个组件的目录下放置一个.mk来存放每个组件各异的操作配置。并且组件间通过依赖来指定关联。而构建系统所有组件统一的操作机制放在build目录下的.mk中。这样可以达到组件间变化隔离,修改灵活的效果
二、总体流程
总体上构建的过程分为如下三个步骤:
aos_target_config.mk文件在哪?这个文件在AliOS-Things的SDK源码目录的 build/build_rules 目录下。
我们通过aos_target_config.mk文件来逐层搜索所需要的组件,然后将所有的所需的源文件、编译链接选项信息存储在这些opts文件中(conf文件是干嘛的?暂时不清楚,后面再补充吧,但是根据下面的内容,似乎指的是 config.mk 文件,这个文件位于 工程源码目录中的out/helloworld_mk3080@mk3080 目录中),这些opts文件在哪?我们这个时候打开工程源码目录 ~/6AliOS/helloworld_mk3080,进入 out/helloworld_mk3080@mk3080/libraries 目录中,会有以下文件:
上面图中为什么有的没有编译S文件的选项信息文件?这个主要是编译内核相关的代码才有,它需要启动芯片,会有一段汇编,直到为我们准备好C语言环境,其他的就不需要汇编了,全部都是C文件。我们打开这个arch_armv7m.c_opts文件看一下,里面确实都是一些编译选项:
当这些编译选项信息文件生成之后,我们就可以通过make命令读取这些,然后使用这些编译选项对源码进行编译。
简言之,第二步中如 config.mk,xx.c_opts,link.opts 就包含了上面所说的要素中除工具链链外所有所需的信息。所以构建的核心其实就是这些文件的生成和使用。
更多详细信息如下所示:
三、mk文件内容说明
一个模块的mk文件中基本上描述了这个组件要如何构建,所以非常关键,下面部分举例来说明其主要内容,下图文件参考为:
1 | AliOS-Things/core/rhino/aos.mk |
其中全局是指编译所有组件时都要用到的设置,局部是指仅在编译本组件时用到。一个mk文件就是描述了一个组件的配置信息。其实配置的设定都可以在 _CFLAGS 和 _LDFLAGS中指定,包括链接使用的链接脚本。
四、具体实现说明
下面按照上面所说的要素来展开说明构建体系的具体实现,相关关键代码等:
1. 工具链选择
宿主平台在aos.py中设置。辅助命令工具在 aos_host_cmd.mk 中设置,目前主要支持 windows 和 linux64 上两种编译宿主机平台。
编译工具链的设置,在 aos_target_xx.mk 和 aos_library_xx.mk中会设置。
2. 找到源文件
编译命令通常是 app名@board名,app和board即为查找所有依赖的两个入口组件。依赖查找过程递归实现:
事实上上面的查找除了找到源文件之外还会解析出mk中定义编译选项等信息,实际上是在递归解析组件的mk文件。为后面的编译链接步骤做好准备。
3. config.mk生成
将上面递归解析出的mk中的信息存储在config.mk中:
config.mk 其实就是把所有组件 mk 中的信息汇总到一起。而后面产生的opts文件则是针对每个组件把config.mk中信息重新组合到一起产生的一个独立的文件。
4. 编译
编译命令, aos_target_build.mk中
每个组件的编译选项产生, aos_target_config.mk中
5. 链接
链接命令, aos_target_build.mk中
链接选项的产生, aos_target_config.mk中
6. 二进制及其他处理
统一进行的二进制处理如strip等
组件单独定义的处理
五、关键宏调用关系梳理
FIND_COMPONENT –找到所有需要的组件 参数:所有基本组件,递归调用
1 | PREPROCESS_TEST_COMPONENT // 将所有测试所需的组件也加入到组件中,无参数 |
PROCESS_COMPONENT——解析每个组件的 mk,参数:所有组件。
1 | PROCESS_ONE_COMPONENT // 解析一个组件,参数:某一个组件 |
WRITE_FILE_CREATE——在config.mk中写入所有相关信息,包括写入所有编译,链接选项到opts文件中