博客
关于我
NuttX 构建系统
阅读量:794 次
发布时间:2023-02-17

本文共 2263 字,大约阅读时间需要 7 分钟。

NuttX嵌入式实时操作系统的Makefile构建详解

NuttX是一个基于Makefile文件的嵌入式实时操作系统构建工具。与Autoconf、Automake等自动生成化编译工具不同,NuttX的Makefile文件手工编写,易于阅读和理解,能够清晰地反映软件编译过程。

Makefile文件组织结构

NuttX的Makefile组织结构分为多个层次:

  • 顶层Makefile:位于nuttx/目录下,定义了针对不同操作系统(如Linux和Windows)的编译规则。
  • 平台特定Makefile:分别为Linux(Makefile.unix)和Windows(Makefile.win)编写,包含了各自平台的编译器和工具链配置。
  • 配置文件Make.defs:从nuttx/config/<板卡>/<目标配置>/Make.defs复制而来,提供了架构和工具的特定编译选项。
  • 子文件夹下的Makefile:每个子文件夹都包含Makefile、Make.defs和Make.dep文件,用于定义特定子模块的编译规则。
  • Makefile文件的包含关系

    NuttX的Makefile文件包含关系较为复杂,顶层文件通过include命令加载相关配置文件和子文件夹的Makefile。需要注意的是,子文件夹下的Makefile并不通过include命令包含,而是在运行make命令时被调用。

    构建目标与选项

    NuttX的Makefile提供多种构建目标和选项,主要包括以下几种:

    1. 常用目标

    • all:默认目标,按已选择的输出格式构建NuttX可运行文件。
    • clean:移除派生对象文件、静态库文件、可运行文件和临时文件,但保留配置文件和上下文文件。
    • distclean:执行clean后,进一步移除所有配置和上下文文件,恢复原始文件夹结构。

    2. 应用程序处理目标

    • apps_clean:清理用户应用程序文件夹中的派生对象文件和临时文件。
    • apps_distclean:清理用户应用程序文件夹中的派生对象文件和临时文件,但保留配置文件。
    • export:打包NuttX库和头文件到可输出包。

    3. 内部目标

    • depend:生成Make.dep文件,建立构建依赖关系。
    • context:确保NuttX正确配置,创建config.h和version.h头文件,并建立符号链接。
    • clean_context:移除context目标生成的头文件和符号链接。

    4. 构建选项

    • V=1:启用详细日志输出,显示具体编译命令,适合调试和追踪错误。

    all目标的依赖树

    all目标依赖树展示了NuttX构建的完整流程,主要包括以下步骤:

  • context目标:创建config.h和version.h头文件,并建立符号链接。
  • pass1dep目标:处理依赖关系,生成Make.dep文件。
  • $(USERLIBS)目标:编译用户定义的库文件。
  • pass2dep目标:处理深度依赖关系,生成更多Make.dep文件。
  • $(NUTTXLIBS)目标:编译NuttX的核心库文件。
  • pass1目标:平面构建,生成可执行文件。
  • pass2目标:最终构建和优化,生成多种输出格式(如hex、bin等)。
  • all目标的编译过程

    1. context目标

    运行make命令时,首先尝试编译context目标。这个目标会根据配置文件生成config.h,并在多个文件夹中创建符号链接,确保NuttX正确配置。

    2. pass1dep目标

    pass1dep目标处理依赖关系,生成Make.dep文件。平面构建时,$(USERDEPDIRS)为空,因此这个目标不会执行任何操作。

    3. $(USERLIBS)目标

    $(USERLIBS)目标负责编译用户定义的库文件。在平面构建时,$(USERLIBS)为空,因此这个目标也不会执行任何操作。

    4. pass2dep目标

    pass2dep目标处理深度依赖关系,生成Make.dep文件。这个目标会递归编译各个子文件夹下的Makefile,生成依赖关系文件。

    5. $(NUTTXLIBS)目标

    这个目标负责编译NuttX的核心库文件。例如,libarch.a目标会编译arch模块下的相关源文件,生成静态库文件。

    6. pass1目标

    pass1目标负责平面构建,将所有组件编译成一个单独的可执行文件。

    7. pass2目标

    pass2目标负责最终构建和优化,将静态库链接成可运行文件,并根据需要生成多种输出格式(如hex、bin、srec等)。

    nuttx/Make.defs文件

    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/

    你可能感兴趣的文章
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm上传自己的项目
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>