px4中,根目录下的Cmakelists都干了些什么?

上两篇文章分析了根目录下的Makefilemakefile(1)makefile(2),本篇介绍根目录下的camkelists文件。整个px4中编译全流程,如下所示。

    A[make命令] --> B[读取顶级Makefile]
    B --> C[调用boards_dir扫描]
    C --> D[定位板级目录]
    D --> E[加载default.px4board]
    E --> F[初始化CMake系统]
    F --> G[加载平台级CMake]
    G --> H[架构级配置]
    H --> I[驱动层编译]
    I --> J[应用层编译]
    J --> K[生成固件]

在上篇文章中,其实已经分析了从A-D的过程,相关makefile代码已经做了解读。在本篇中,Cmakelists文件是cmake的入口。用于管理整个PX4飞控系统的编译过程。它定义了构建规则、依赖关系、模块管理、编译器选项、测试框架集成、文档生成等,并支持跨平台构建(如NuttX、POSIX等)。此外,它还负责处理版本信息、外部模块集成、安装和打包配置,确保整个项目能正确编译和运行。

先有cmakelists ,CMakeLists.txt通常会生成Makefile,供make命令使用。两者共同完成代码的编译、链接和安装过程。CMake提供高级配置,而Makefile执行具体的构建任务。但是在px4源码中,我们直接在根目录下输入了make xxx,没有用到cmakelists,直接读取了make文件进行编译。那cmakelists怎么用呢?还是以我的kakuteh7的板子为例。

在px4的根目录下创建build<target>文件

mkdir -p build/holybro_kakuteh7_default
cd build/holybro_kakuteh7_default

然后在该目录下输入命令

cmake ../.. \
  -DBOARD=holybro_kakuteh7_default \

其中../..就是退回根目录,寻找cmakelists文件,后面的是版本参数。

  1. -DBOARD=holybro_kakuteh7_default:

    • 指定目标飞控板型号

    • 对应配置文件: PX4-Autopilot/boards/holybro/kakuteh7/default.px4board

运行完成后会在这个目录下生成makefile文件,对比了一下,与根目录的不一样,然后在这个目录下执行make命令,会读取makefile进行编译。但是没有我们想要的.px4或者.elf文件。原因还不清楚,目前推测根目录下的makefile 文件中的cmake_build起到关键作用。与在根目录下直接运行make xxx_default差别还挺大

接下来分析一下cmakelists文件的具体作用

cmake_minimum_required(VERSION 3.9 FATAL_ERROR)

set(PX4_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE FILEPATH "PX4 source directory" FORCE)
set(PX4_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE FILEPATH "PX4 binary directory" FORCE)

list(APPEND CMAKE_MODULE_PATH ${PX4_SOURCE_DIR}/cmake)
include(px4_parse_function_args)

1. cmake_minimum_required(VERSION 3.9 FATAL_ERROR)

  • 作用:设置项目所需的最低 CMake 版本。

  • 参数

    • VERSION 3.9:要求 CMake 版本至少为 3.9。

    • FATAL_ERROR:如果当前 CMake 版本低于 3.9,直接报错并终止配置过程。

  • 用途:确保构建环境满足最低版本要求,避免兼容性问题。


2. set(PX4_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE FILEPATH "PX4 source directory" FORCE)

  • 作用:定义一个 CMake 变量 PX4_SOURCE_DIR,用于存储 PX4 源代码的根目录路径。

  • 参数

    • "${CMAKE_CURRENT_SOURCE_DIR}":CMake 内置变量,表示当前处理的 CMakeLists.txt 所在目录(通常是项目根目录)。

    • CACHE FILEPATH:将变量存入 CMake 缓存(允许用户修改),并声明类型为文件路径(FILEPATH)。

    • "PX4 source directory":变量的描述信息。

    • FORCE:强制覆盖缓存中已存在的同名变量(如果已定义)。

  • 用途:明确指定 PX4 源代码的位置,供后续脚本或模块引用。


3. set(PX4_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE FILEPATH "PX4 binary directory" FORCE)

  • 作用:定义变量 PX4_BINARY_DIR,存储构建输出的二进制文件目录路径。

  • 参数

    • "${CMAKE_CURRENT_BINARY_DIR}":CMake 内置变量,表示当前构建目录(通常是 build/ 目录)。

    • 其他参数与上一行类似(CACHE FILEPATH + 描述 + FORCE)。

  • 用途:统一管理构建输出路径,避免硬编码。


4. list(APPEND CMAKE_MODULE_PATH ${PX4_SOURCE_DIR}/cmake)

  • 作用:将自定义 CMake 模块目录添加到 CMake 的模块搜索路径中。

  • 参数

    • CMAKE_MODULE_PATH:CMake 用于查找 .cmake 模块文件的路径列表。

    • ${PX4_SOURCE_DIR}/cmake:要添加的路径,即 PX4 源代码下的 cmake/ 子目录。

  • 用途:使得后续可以通过 include() 直接引用该目录下的模块(如 px4_parse_function_args.cmake)。


5. include(px4_parse_function_args)

  • 作用:加载并执行指定的 CMake 模块文件。

  • 参数

    • px4_parse_function_args:模块文件名(实际会查找 px4_parse_function_args.cmake)。

  • 用途:该模块可能包含 PX4 专用的 CMake 函数或宏(例如解析函数参数的辅助工具),用于简化后续的构建脚本编写。

加载并执行名为 px4_git.cmake 的 CMake 模块文件
include(px4_git)

execute_process(
	COMMAND git describe --exclude ext/* --always --tags
	OUTPUT_VARIABLE PX4_GIT_TAG
	OUTPUT_STRIP_TRAILING_WHITESPACE
	WORKING_DIRECTORY ${PX4_SOURCE_DIR}
	)

 execute_process(...)

  • 作用通过 Git 获取 PX4 项目的版本信息,并将结果存储在 PX4_GIT_TAG 变量中

  • 参数详解

    • COMMAND git describe --exclude ext/* --always --tags

      • git describe:Git 命令,用于生成可读的版本描述。

      • --exclude ext/*:忽略 ext/ 目录下的标签。

      • --always:即使没有标签,也返回一个有效的 Git commit ID。

      • --tags:允许匹配轻量级标签。

    • OUTPUT_VARIABLE PX4_GIT_TAG
      将命令的标准输出存储到 CMake 变量 PX4_GIT_TAG 中。

    • OUTPUT_STRIP_TRAILING_WHITESPACE
      自动删除输出末尾的换行符或空格。

    • WORKING_DIRECTORY ${PX4_SOURCE_DIR}
      指定命令的工作目录为 PX4 源代码根目录。

string(REPLACE "." ";" VERSION_LIST ${PX4_GIT_TAG})

# major version
list(GET VERSION_LIST 0 PX4_VERSION_MAJOR)
string(REPLACE "v" "" PX4_VERSION_MAJOR ${PX4_VERSION_MAJOR})
# minor version
list(GET VERSION_LIST 1 PX4_VERSION_MINOR)
# patch version
list(GET VERSION_LIST 2 PX4_VERSION_PATCH)
string(REPLACE "-" ";" PX4_VERSION_PATCH ${PX4_VERSION_PATCH})
list(GET PX4_VERSION_PATCH 0 PX4_VERSION_PATCH)

解析 PX4 的 Git 版本标签(如 v1.12.0-rc1v2.3.4),将其拆分为 主版本号(Major)、次版本号(Minor)、修订号(Patch) 三个部分,并分别存储到对应的变量中。

string(REPLACE "." ";" VERSION_LIST ${PX4_GIT_TAG})${PX4_GIT_TAG}(如 v1.12.0)按 . 拆分成 CMake 列表(List)。

list(GET VERSION_LIST 0 PX4_VERSION_MAJOR)          # 获取列表第0项(v1)
string(REPLACE "v" "" PX4_VERSION_MAJOR ${PX4_VERSION_MAJOR})  # 移除 "v" 前缀。PX4_VERSION_MAJOR = 1。

list(GET VERSION_LIST 1 PX4_VERSION_MINOR) # 获取列表第1项,PX4_VERSION_MINOR = 12。

list(GET VERSION_LIST 2 PX4_VERSION_PATCH) # 获取列表第2项(如 0-rc1)

string(REPLACE "-" ";" PX4_VERSION_PATCH ${PX4_VERSION_PATCH}) # 按 "-" 拆分

list(GET PX4_VERSION_PATCH 0 PX4_VERSION_PATCH) # 取拆分后的第0项(如 0)。PX4_VERSION_PATCH = 0

string(REGEX MATCH "g([a-f0-9]+)$" GIT_HASH "${PX4_GIT_TAG}")
set(PX4_GIT_HASH ${CMAKE_MATCH_1})

${PX4_GIT_TAG}(如 v1.12.0-5-g9a3e2d7)中提取 Git 提交哈希(如 9a3e2d7

  • 正则表达式解析

    • g([a-f0-9]+)$:匹配以 g 开头,后接 7 位十六进制字符(哈希值)的字符串。

    • CMAKE_MATCH_1 存储捕获组(括号内的内容)。

  • 结果存储:哈希值保存到变量 PX4_GIT_HASH

下面定义了 4 个全局属性,用于管理 PX4 的模块和源代码。

存储所有 PX4 模块生成的库文件(如 modules/attitude_estimator)
链接时收集所有模块库

define_property(GLOBAL PROPERTY PX4_MODULE_LIBRARIES
                 BRIEF_DOCS "PX4 module libs"
                 FULL_DOCS "List of all PX4 module libraries"
                 )

定义了一个 全局属性(Global Property),名为 PX4_MODULE_LIBRARIES,用于在整个 CMake 工程中集中管理 PX4 模块库的列表。

  • define_property:CMake 命令,用于自定义一个属性。

  • GLOBAL:表示该属性是全局的,跨所有目录(作用域)有效。

  • PROPERTY PX4_MODULE_LIBRARIES:定义属性名称为 PX4_MODULE_LIBRARIES

  • BRIEF_DOCS:属性的简短描述(用于工具提示)。

  • FULL_DOCS:属性的详细说明。

下同

define_property(GLOBAL PROPERTY PX4_KERNEL_MODULE_LIBRARIES
                 BRIEF_DOCS "PX4 kernel side module libs"
                 FULL_DOCS "List of all PX4 kernel module libraries"
                 )

定义了一个名为 PX4_KERNEL_MODULE_LIBRARIES 的全局属性,专门用于管理 PX4 系统中运行在内核空间(Kernel Space)的模块库。

define_property(GLOBAL PROPERTY PX4_MODULE_PATHS
                 BRIEF_DOCS "PX4 module paths"
                 FULL_DOCS "List of paths to all PX4 modules"
                 )

定义了一个名为 PX4_MODULE_PATHS 的全局属性,用于集中管理 PX4 系统中所有模块的源代码路径。

define_property(GLOBAL PROPERTY PX4_SRC_FILES
                 BRIEF_DOCS "src files from all PX4 modules & libs"
                 FULL_DOCS "SRC files from px4_add_{module,library}"
                 )

定义了一个名为 PX4_SRC_FILES 的全局属性,用于集中管理 PX4 项目中所有模块和库的源代码文件(如 .c.cpp.h 等)。

include(px4_add_module)
set(config_module_list)
set(config_kernel_list)

初始化模块构建环境并准备模块列表。

1. include(px4_add_module)

  • 作用:加载 PX4 的模块定义函数库

  • 功能详解

    • 引入 px4_add_module.cmake 文件中定义的模块构建函数

    • 关键函数:px4_add_module(),用于标准化模块的构建流程

    • 该函数会自动处理:

      • 源代码编译

      • 依赖关系

      • 模块注册到全局属性(如之前定义的 PX4_MODULE_LIBRARIES

  • 文件位置:位于 cmake/px4_add_module.cmake

2. set(config_module_list)

  • 作用:初始化用户空间模块列表变量,创建空变量 config_module_list

3. set(config_kernel_list)

  • 作用:初始化内核空间模块列表变量

find_package(PythonInterp 3)
# We have a custom error message to tell users how to install python3.
if(NOT PYTHONINTERP_FOUND)
	message(FATAL_ERROR "Python 3 not found. Please install Python 3:\n"
		"    Ubuntu: sudo apt install python3 python3-dev python3-pip\n"
		"    macOS: brew install python")
endif()

查找系统中安装的 Python 3 解释器。

  • PYTHONINTERP_FOUND:是否找到 Python

  • PYTHON_EXECUTABLE:Python 解释器路径

option(PYTHON_COVERAGE "Python code coverage" OFF)
if(PYTHON_COVERAGE)
	message(STATUS "python coverage enabled")
	set(PYTHON_EXECUTABLE coverage run -p)
endif()
  • 功能开关

    • PYTHON_COVERAGE 是 CMake 选项,默认关闭

    • 可通过命令行激活:cmake -DPYTHON_COVERAGE=ON ..

  • 实现原理

    • 当启用时,将 Python 解释器替换为 coverage run -p

    • coverage 是 Python 的覆盖率测试工具

  • 工作流程

    1. 执行 Python 脚本时自动记录覆盖率

    2. 生成 .coverage 数据文件

    3. 使用 coverage report 查看结果

include(px4_config)
include(kconfig)
message(STATUS "PX4 config: ${PX4_CONFIG}")
message(STATUS "PX4 platform: ${PX4_PLATFORM}")

加载平台配置和内核配置系统

if($ENV{CLION_IDE})
	# CLion automatically executes some compiler commands after configuring the
	# project. This would fail on NuttX, as visibility.h tries to (indirectly)
	# include nuttx/config.h, which at that point does not exist yet
	add_definitions(-DPX4_DISABLE_GCC_POISON)
endif()

# 仅当目标平台为 posix(如 SITL 仿真)时生效
if(${PX4_PLATFORM} STREQUAL "posix")
	if(ENABLE_LOCKSTEP_SCHEDULER)
		add_definitions(-DENABLE_LOCKSTEP_SCHEDULER)
		message(STATUS "PX4 lockstep: enabled")
	else()
		message(STATUS "PX4 lockstep: disabled")
	endif()
endif()

用于处理特定开发环境(CLion IDE)和平台(POSIX)的特殊构建配置

set(EXTERNAL_MODULES_LOCATION "" CACHE STRING "External modules source location")

if(NOT EXTERNAL_MODULES_LOCATION STREQUAL "")
	get_filename_component(EXTERNAL_MODULES_LOCATION "${EXTERNAL_MODULES_LOCATION}" ABSOLUTE)
endif()

set_property(GLOBAL PROPERTY PX4_MODULE_CONFIG_FILES)

加载目标平台的 OS 实现文件
include(platforms/${PX4_PLATFORM}/cmake/px4_impl_os.cmake)
将平台特定的 CMake 脚本目录加入模块搜索路径
list(APPEND CMAKE_MODULE_PATH ${PX4_SOURCE_DIR}/platforms/${PX4_PLATFORM}/cmake)

如果平台存在初始化脚本(init.cmake),则执行
if(EXISTS "${PX4_SOURCE_DIR}/platforms/${PX4_PLATFORM}/cmake/init.cmake")
	include(init)
endif()

PX4 飞控系统构建过程中用于管理外部模块和平台初始化set(EXTERNAL_MODULES_LOCATION "" CACHE STRING "External modules source location")

  • 功能:定义一个可缓存变量 EXTERNAL_MODULES_LOCATION,用于指定外部模块的源码位置

  • 特性

    • 默认值为空字符串

    • CACHE STRING 使该变量可在 CMake GUI 或命令行中修改(如 -DEXTERNAL_MODULES_LOCATION=/path/to/modules

    • 描述信息说明变量用途

if(NOT EXTERNAL_MODULES_LOCATION STREQUAL "")
    get_filename_component(EXTERNAL_MODULES_LOCATION "${EXTERNAL_MODULES_LOCATION}" ABSOLUTE)
endif()

  • 如果用户指定了外部模块路径(非空字符串)

  • 调用 get_filename_component 将路径转换为绝对路径(避免相对路径导致的构建问题)

set_property(GLOBAL PROPERTY PX4_MODULE_CONFIG_FILES)

定义一个全局属性 PX4_MODULE_CONFIG_FILES,用于存储所有模块的配置文件路径

if(NOT CMAKE_BUILD_TYPE)
	if(${PX4_PLATFORM} STREQUAL "nuttx")
		set(PX4_BUILD_TYPE "MinSizeRel")
	else()
		set(PX4_BUILD_TYPE "RelWithDebInfo")
	endif()

	set(CMAKE_BUILD_TYPE ${PX4_BUILD_TYPE} CACHE STRING "Build type" FORCE)
endif()
  1. 条件判断

    • if(NOT CMAKE_BUILD_TYPE) :检查是否已经定义了 CMAKE_BUILD_TYPE 。如果没有定义,则进入条件块。
  2. 平台判断

    • if(${PX4_PLATFORM} STREQUAL "nuttx") :检查当前平台是否为 nuttx 。
      • 如果是 nuttx 平台,设置 PX4_BUILD_TYPE 为 MinSizeRel (最小化体积的发布构建)。
      • 否则,设置 PX4_BUILD_TYPE 为 RelWithDebInfo (带调试信息的发布构建)。
  3. 强制设置构建类型

    • set(CMAKE_BUILD_TYPE ${PX4_BUILD_TYPE} CACHE STRING "Build type" FORCE) :
      • 将 CMAKE_BUILD_TYPE 设置为 PX4_BUILD_TYPE 的值。
      • CACHE STRING 表示将变量存入 CMake 缓存,后续构建会直接使用该值。
      • FORCE 表示强制覆盖已有的值(如果有)。
if((CMAKE_BUILD_TYPE STREQUAL "Debug") OR (CMAKE_BUILD_TYPE STREQUAL "Coverage"))
	set(MAX_CUSTOM_OPT_LEVEL -O0)
elseif(CMAKE_BUILD_TYPE MATCHES "Sanitizer")
	set(MAX_CUSTOM_OPT_LEVEL -O1)
elseif(CMAKE_BUILD_TYPE MATCHES "Release")
	set(MAX_CUSTOM_OPT_LEVEL -O3)
else()
	if(px4_constrained_flash_build)
		set(MAX_CUSTOM_OPT_LEVEL -Os)
	else()
		set(MAX_CUSTOM_OPT_LEVEL -O2)
	endif()
endif()
  1. 条件判断
    • if((CMAKE_BUILD_TYPE STREQUAL "Debug") OR (CMAKE_BUILD_TYPE STREQUAL "Coverage")) :
      • 如果构建类型是 Debug 或 Coverage ,设置 MAX_CUSTOM_OPT_LEVEL 为 -O0 (无优化,便于调试和覆盖率分析)。
    • elseif(CMAKE_BUILD_TYPE MATCHES "Sanitizer") :
      • 如果构建类型包含 Sanitizer (如地址消毒器、内存消毒器等),设置 MAX_CUSTOM_OPT_LEVEL 为 -O1 (轻度优化,平衡性能和调试能力)。
    • elseif(CMAKE_BUILD_TYPE MATCHES "Release") :
      • 如果构建类型是 Release 或类似(如 RelWithDebInfo ),设置 MAX_CUSTOM_OPT_LEVEL 为 -O3 (最大优化,提升性能)。
    • else() :
      • 对于其他构建类型,进一步检查 px4_constrained_flash_build 标志:
        • 如果 px4_constrained_flash_build 为真,设置 MAX_CUSTOM_OPT_LEVEL 为 -Os (优化代码体积,适用于闪存受限的嵌入式设备)。
        • 否则,设置为 -O2 (默认优化级别,平衡性能和代码体积)。
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel;Coverage;AddressSanitizer;UndefinedBehaviorSanitizer")
message(STATUS "cmake build type: ${CMAKE_BUILD_TYPE}")

# Check if LTO option and check if toolchain supports it
if(LTO)
    include(CheckIPOSupported)
    check_ipo_supported()
    message(AUTHOR_WARNING "LTO enabled: LTO is highly experimental and should not be used in production")
    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()

set(package-contact "px4users@googlegroups.com")

设置 C++ 语言标准为 C++14,并强制要求编译器支持该标准。
设置 C 语言标准为 C11,并强制要求编译器支持该标准。

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

生成 compile_commands.json 文件,供工具(如 Clangd、C++ 静态分析工具)使用。
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

将所有构建类型(Debug、Release 等)的可执行文件输出到 PX4_BINARY_DIR 目录中。
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PX4_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PX4_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PX4_BINARY_DIR})

set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel;Coverage;AddressSanitizer;UndefinedBehaviorSanitizer")
message(STATUS "cmake build type: ${CMAKE_BUILD_TYPE}")

  • 定义 CMAKE_BUILD_TYPE 的可选值,包括:
    • Debug :调试模式,无优化,保留调试信息。
    • Release :发布模式,启用优化。
    • RelWithDebInfo :带调试信息的发布模式。
    • MinSizeRel :最小化代码体积的发布模式。
    • Coverage :用于代码覆盖率分析。
    • AddressSanitizer :启用地址消毒器(检测内存错误)。
    • UndefinedBehaviorSanitizer :启用未定义行为消毒器(检测未定义行为)。
  • 打印当前构建类型( CMAKE_BUILD_TYPE )的值。

if(LTO)
    include(CheckIPOSupported)
    check_ipo_supported()
    message(AUTHOR_WARNING "LTO enabled: LTO is highly experimental and should not be used in production")
    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()

  • 如果 LTO 选项被启用:
    • 检查编译器是否支持链接时优化(LTO)。
    • 如果支持,设置 CMAKE_INTERPROCEDURAL_OPTIMIZATION 为 TRUE ,启用 LTO。
    • 打印警告信息,提示 LTO 是实验性功能,不建议在生产环境中使用。

set(package-contact "px4users@googlegroups.com")设置项目的联系信息( px4users@googlegroups.com ),通常用于打包或文档生成。

检查当前平台是否为 posix (类 Unix 系统)。如果是,则执行后续逻辑。
if(${PX4_PLATFORM} STREQUAL "posix")
    引入 CMakeDependentOption 模块,用于定义条件选项。
	include(CMakeDependentOption)
定义一个名为 USE_LD_GOLD 的选项,用于控制是否使用 GNU gold 链接器。
默认值为 ON (启用),但仅在非 Windows( NOT WIN32 )和非 macOS( NOT APPLE )平台上生效。
如果平台是 Windows 或 macOS,则默认值为 OFF (禁用)。

	CMAKE_DEPENDENT_OPTION(USE_LD_GOLD
			"Use GNU gold linker" ON
			"NOT WIN32;NOT APPLE" OFF
	)

	if(USE_LD_GOLD)
		execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION)
		if("${LD_VERSION}" MATCHES "GNU gold")
			set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
			set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold")
		else()
			set(USE_LD_GOLD OFF)
		endif()
	endif()
endif()
if(USE_LD_GOLD)
    execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION)
    if("${LD_VERSION}" MATCHES "GNU gold")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold")
    else()
        set(USE_LD_GOLD OFF)
    endif()
endif()
  • 作用
    • 如果 USE_LD_GOLD 为 ON ,则尝试执行以下操作:
      1. 检查 gold 链接器是否可用
        • 使用 execute_process 运行命令 ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ,检查 gold 链接器的版本。
        • 如果输出中包含 GNU gold ,则表示 gold 链接器可用。
      2. 启用 gold 链接器
        • 如果 gold 可用,将 -fuse-ld=gold 添加到以下链接器标志中:
          • CMAKE_EXE_LINKER_FLAGS :可执行文件的链接器标志。
          • CMAKE_SHARED_LINKER_FLAGS :共享库的链接器标志。
      3. 禁用 gold 链接器
        • 如果 gold 不可用,将 USE_LD_GOLD 设置为 OFF 。
  • gold 是 GNU 链接器的替代品,专为快速链接设计,尤其适合大型项目。
检查当前平台是否为 posix (类 Unix 系统)。如果是,则执行后续逻辑。
if(${PX4_PLATFORM} STREQUAL "posix")
	# This makes it possible to dynamically load code which depends on symbols
	# inside the px4 executable.
    启用位置无关代码(PIC),允许动态加载依赖于 px4 可执行文件中符号的代码。
    通常用于生成共享库( .so 文件)。
    CMAKE_ENABLE_EXPORTS ON :
    允许从可执行文件中导出符号,供动态加载的代码使用。

	set(CMAKE_POSITION_INDEPENDENT_CODE ON)
	set(CMAKE_ENABLE_EXPORTS ON)

    如果构建类型为 Coverage ,则包含 coverage 模块。

	if(CMAKE_BUILD_TYPE MATCHES "Coverage")
		include(coverage)
	endif()
    
    包含 sanitizers 模块,用于启用内存消毒器
	include(sanitizers)

	# Define GNU standard installation directories
    包含 GNUInstallDirs 模块,定义符合 GNU 标准的安装目录
	include(GNUInstallDirs)
    
    如果未设置 CMAKE_INSTALL_PREFIX ,则将其默认值设为 /usr 。
    CACHE PATH "Install path prefix" FORCE :
    将变量存入 CMake 缓存,并强制覆盖已有值。

	if (NOT CMAKE_INSTALL_PREFIX)
		set(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Install path prefix" FORCE)
	endif()
endif()

include(ccache)
px4_os_determine_build_chip()
if(NOT PX4_CHIP_MANUFACTURER)
	message(FATAL_ERROR "px4_os_determine_build_chip() needs to set PX4_CHIP_MANUFACTURER")
endif()
if(NOT PX4_CHIP)
	message(FATAL_ERROR "px4_os_determine_build_chip() needs to set PX4_CHIP")
endif()

确定当前构建目标芯片( PX4_CHIP )及其制造商( PX4_CHIP_MANUFACTURER )

px4_os_determine_build_chip()
  • 作用
    • 调用自定义函数 px4_os_determine_build_chip() ,该函数通常用于检测当前构建目标的芯片型号( PX4_CHIP )和制造商( PX4_CHIP_MANUFACTURER )。
if(NOT PX4_CHIP_MANUFACTURER)
    message(FATAL_ERROR "px4_os_determine_build_chip() needs to set PX4_CHIP_MANUFACTURER")
endif()
  • 作用
    • 检查变量 PX4_CHIP_MANUFACTURER 是否被设置。
    • 如果未设置,则抛出错误( FATAL_ERROR ),提示 px4_os_determine_build_chip() 函数需要设置 PX4_CHIP_MANUFACTURER 。
if(NOT PX4_CHIP)
    message(FATAL_ERROR "px4_os_determine_build_chip() needs to set PX4_CHIP")
endif()
  • 作用
    • 检查变量 PX4_CHIP 是否被设置。
    • 如果未设置,则抛出错误( FATAL_ERROR ),提示 px4_os_determine_build_chip() 函数需要设置 PX4_CHIP 。
  1. PX4_CHIP_MANUFACTURER 

    • 表示芯片的制造商(如 NXP 、 STMicroelectronics 等)。
    • 用于区分不同厂商的芯片,可能在后续的构建逻辑中用于配置编译器选项或链接库。
  2. PX4_CHIP 

    • 表示具体的芯片型号(如 STM32F7 、 IMXRT1062 等)。
    • 用于适配不同芯片的硬件特性和外设配置。
nclude(px4_add_common_flags)
px4_add_common_flags()
px4_os_add_flags()

#=============================================================================
# board cmake init (optional)
#
if(EXISTS ${PX4_BOARD_DIR}/cmake/init.cmake)
	include(${PX4_BOARD_DIR}/cmake/init.cmake)
endif()

#=============================================================================
# message, and airframe generation
#
include(px4_metadata)

add_subdirectory(msg EXCLUDE_FROM_ALL)

px4_generate_airframes_xml(BOARD ${PX4_BOARD})
include(px4_add_common_flags)
px4_add_common_flags()
  • 作用
    • 包含 px4_add_common_flags 模块,该模块通常用于为项目添加通用的编译器和链接器标志。
    • 调用 px4_add_common_flags() 函数,应用这些通用标志

px4_os_add_flags()

  • 调用 px4_os_add_flags() 函数,为当前操作系统( posix 或其他)添加特定的编译器和链接器标志。

if(EXISTS ${PX4_BOARD_DIR}/cmake/init.cmake) include(${PX4_BOARD_DIR}/cmake/init.cmake) endif()

  • 检查 ${PX4_BOARD_DIR}/cmake/init.cmake 文件是否存在。
  • 如果存在,则包含该文件,用于执行板级( BOARD )特定的初始化逻辑(如硬件配置、外设设置等)。

include(px4_metadata)

  • 包含 px4_metadata 模块,该模块通常用于处理 PX4 项目的元数据(如消息定义、参数配置等)。

add_subdirectory(msg EXCLUDE_FROM_ALL)

  • 将 msg 目录作为子目录添加到构建系统中。

px4_generate_airframes_xml(BOARD ${PX4_BOARD})

  • 调用 px4_generate_airframes_xml 函数,根据当前板级配置( ${PX4_BOARD} )生成 airframes.xml 文件。

太多了,有时间接着读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值