本文共 2263 字,大约阅读时间需要 7 分钟。
NuttX是一个基于Makefile文件的嵌入式实时操作系统构建工具。与Autoconf、Automake等自动生成化编译工具不同,NuttX的Makefile文件手工编写,易于阅读和理解,能够清晰地反映软件编译过程。
NuttX的Makefile组织结构分为多个层次:
NuttX的Makefile文件包含关系较为复杂,顶层文件通过include命令加载相关配置文件和子文件夹的Makefile。需要注意的是,子文件夹下的Makefile并不通过include命令包含,而是在运行make命令时被调用。
NuttX的Makefile提供多种构建目标和选项,主要包括以下几种:
all目标依赖树展示了NuttX构建的完整流程,主要包括以下步骤:
运行make命令时,首先尝试编译context目标。这个目标会根据配置文件生成config.h,并在多个文件夹中创建符号链接,确保NuttX正确配置。
pass1dep目标处理依赖关系,生成Make.dep文件。平面构建时,$(USERDEPDIRS)为空,因此这个目标不会执行任何操作。
$(USERLIBS)目标负责编译用户定义的库文件。在平面构建时,$(USERLIBS)为空,因此这个目标也不会执行任何操作。
pass2dep目标处理深度依赖关系,生成Make.dep文件。这个目标会递归编译各个子文件夹下的Makefile,生成依赖关系文件。
这个目标负责编译NuttX的核心库文件。例如,libarch.a目标会编译arch模块下的相关源文件,生成静态库文件。
pass1目标负责平面构建,将所有组件编译成一个单独的可执行文件。
pass2目标负责最终构建和优化,将静态库链接成可运行文件,并根据需要生成多种输出格式(如hex、bin、srec等)。
NuttX的Make.defs文件是Makefile片断,用于定义平台和架构特定的编译规则。它从nuttx/config/<板卡>/<目标配置>/Make.defs复制而来,提供了工具链和编译选项。Make.defs文件会加载工具链(如CC、LD、AR等)和编译器标志(如CFLAGS、LDFLAGS),并根据配置文件中的设置进行调整。
Make.defs文件还会包括一些通用Macro(如COMPILE、ASSEMBLE等),这些Macro会被子Makefile文件使用。需要注意的是,Make.defs文件会根据不同的架构和配置进行扩展和覆盖。
通过以上详细介绍,可以看出NuttX的Makefile构建系统虽然简单,但功能强大。其基于手工编写的Makefile文件,不仅易于阅读和理解,还能通过灵活的配置和目标选择,满足不同开发需求。
转载地址:http://ownfk.baihongyu.com/