AliOS Things 编译体系

AliOS Things 编译体系

在分析AliOS Things的编译体系之前,我们首先要先了解该工程师如何构建起来的。

构建要素

一个工程的构建包含如下几个要素:

  1. 工具链选择

  2. 找到源文件

  3. 编译

  4. 链接

  5. 二进制处理及其他

其中工具链选择一般是指ARM的三大工具链的选择,主要有:ARM RealView(armcc),keil中用到的是armcc、IAR EWARM(iccarm)、 GNU Compiler Collection。(可以参考文档linux学习之ARM的三大工具链链接)。在指定了工具链之后,还需要确定工程所依赖的所有源文件,在AliOS Things源码当中,这一般是由各个makefile指定的。最后按照指定的方式进行编译、链接,生成可执行文件。

组件化思想

组件化思想存在的意义是我们可以按照需要进行拼接、裁剪。而这个思想的实现就是依赖于构建体系,在AliOS Things当中一个组件存在的标志就是它具有一个.mk文件。

由于采用组件化管理思想,为了让每个组件相互隔离,独立配置,每一个组件的目录下放置一个.mk来存放每个组件各异的操作配置。并且组件间通过依赖来指定关联。而构建系统所有组件统一的操作机制放在build目录下的.mk中。这样可以达到组件间变化隔离,修改灵活的效果

总体流程

系统工程的整个构建流程如下所示,主要分为三个步骤:

AliOS Things 编译体系

类似于在linux环境下配置内核代码一样,这里先使用aos_target_config.mk文件生成第二步中的config.mk、xx_opts、link.ops文件。这些文件包含了上面所说的要素中除了工具链外所有需要的信息。简而言之,构建的核心就是这些文件的生成和使用。

详细示意图如下:

AliOS Things 编译体系

mk文件内容说明

因为AliOS Things是基于makefile进行编译链接的。所以mk文件就显得很重要。一个模块的mk文件中基本上描述了这个组件要如何构建,所以非常关键,下面部分举例来说明其主要内容:

AliOS Things 编译体系

总结

下面按照上面所说的一些要素来展开说明构建体系的具体实现,相关关键代码等。

工具链的选择

AliOS Things 编译体系

系统会首先根据用户的输入命令、aos.py来判断宿主平台。宿主平台的设置主要在文件aos_host_cmd.mk文件当中,目前主要支持windows和linux64上两种编译宿主机平台。之后还要确定所使用的编译工具链,工具链的选择设置是在aos_target_xx.mk文件和aos_library_xx.mk中设置的,如下所示。

include $(MAKEFILES_PATH)/aos_host_cmd.mk

CONFIG_FILE := $(OUTPUT_DIR)/config.mk

include $(CONFIG_FILE)

# Include all toolchain makefiles - one of them will handle the architecture
# default gcc
ifeq ($(COMPILER),)
include $(MAKEFILES_PATH)/aos_toolchain_gcc.mk
else ifeq ($(COMPILER),gcc)
include $(MAKEFILES_PATH)/aos_toolchain_gcc.mk
else ifeq ($(COMPILER),armcc)
include $(MAKEFILES_PATH)/aos_toolchain_armcc.mk
else ifeq ($(COMPILER),rvct)
include $(MAKEFILES_PATH)/aos_toolchain_rvct.mk
else ifeq ($(COMPILER),iar)
include $(MAKEFILES_PATH)/aos_toolchain_iar.mk
endif

源文件的查找

在宿主平台和编译链都已经确定以后,需要确定工程所依赖的源文件。而源文件的查找是在aos_target_config.mk文件中进行的。一般我们通过aos make [email protected]来进行例程的编译,而我们输入的app board就是查找所有依赖的两个入口组件。

AliOS Things 编译体系

上图为源文件查找的一个简易示例图。

依赖源文件的查找过程递归实现:

AliOS Things 编译体系

事实上上面的查找除了找到源文件之外还会解析出mk中定义编译选项等信息,实际上是在递归解析组件的mk文件。为后面的编译链接步骤做好准备。具体的markfile文件可以参考aos_target_config.mk文件。

config.mk文件的生成

在递归查找完成后,将上面递归出来的mk信息存储在config.mk文件当中。

AliOS Things 编译体系

config.mk 其实就是把所有组件 mk 中的信息汇总到一起。而后面产生的opts文件则是针对每个组件把config.mk中信息重新组合到一起产生的一个独立的文件。

编译

编译命令

AliOS Things 编译体系

AliOS Things 编译体系

AliOS Things 编译体系

每个组件的编译选项产生

AliOS Things 编译体系

链接

链接命令

AliOS Things 编译体系

链接选项的产生

AliOS Things 编译体系

AliOS Things 编译体系

二进制及其他处理

统一进行的二进制处理如strip等

AliOS Things 编译体系

组件单独定义的处理

AliOS Things 编译体系

AliOS Things 编译体系

关键宏调用关系梳理

FIND_COMPONENT --找到所有需要的组件 参数:所有基本组件,递归调用

​PREPROCESS_TEST_COMPONENT  --将所有测试所需的组件也加入到组件中,无参数

PROCESS_COMPONENT --解析每个组件的 mk,参数:所有组件

​PROCESS_ONE_COMPONENT  --解析一个组件,参数:某一个组件

WRITE_FILE_CREATE --在config.mk中写入所有相关信息,包括写入所有编译,链接选项到opts文件中

文章参考:https://github.com/alibaba/AliOS-Things/wiki/AliOS-Things-build-system.zh