AliOS Things 编译体系

版权声明:版权声明:本文为博主原创文章,转载请注明文章地址 https://blog.csdn.net/VICTORY2017/article/details/83037677

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中。这样可以达到组件间变化隔离,修改灵活的效果

总体流程

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

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

详细示意图如下:

mk文件内容说明

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

总结

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

工具链的选择

系统会首先根据用户的输入命令、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 app@board来进行例程的编译,而我们输入的app board就是查找所有依赖的两个入口组件。

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

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

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

config.mk文件的生成

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

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

编译

编译命令

每个组件的编译选项产生

链接

链接命令

链接选项的产生

二进制及其他处理

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

组件单独定义的处理

关键宏调用关系梳理

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

猜你喜欢

转载自blog.csdn.net/VICTORY2017/article/details/83037677