博客
关于我
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/

    你可能感兴趣的文章
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>