上两篇文章分析了根目录下的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文件,后面的是版本参数。
-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-rc1
或v2.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 的覆盖率测试工具工作流程:
执行 Python 脚本时自动记录覆盖率
生成
.coverage
数据文件使用
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()
条件判断:
if(NOT CMAKE_BUILD_TYPE)
:检查是否已经定义了CMAKE_BUILD_TYPE
。如果没有定义,则进入条件块。平台判断:
if(${PX4_PLATFORM} STREQUAL "nuttx")
:检查当前平台是否为nuttx
。
- 如果是
nuttx
平台,设置PX4_BUILD_TYPE
为MinSizeRel
(最小化体积的发布构建)。- 否则,设置
PX4_BUILD_TYPE
为RelWithDebInfo
(带调试信息的发布构建)。强制设置构建类型:
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()
- 条件判断:
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
,则尝试执行以下操作:
- 检查
gold
链接器是否可用:
- 使用
execute_process
运行命令${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version
,检查gold
链接器的版本。- 如果输出中包含
GNU gold
,则表示gold
链接器可用。- 启用
gold
链接器:
- 如果
gold
可用,将-fuse-ld=gold
添加到以下链接器标志中:
CMAKE_EXE_LINKER_FLAGS
:可执行文件的链接器标志。CMAKE_SHARED_LINKER_FLAGS
:共享库的链接器标志。- 禁用
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
。
PX4_CHIP_MANUFACTURER
:
- 表示芯片的制造商(如
NXP
、STMicroelectronics
等)。- 用于区分不同厂商的芯片,可能在后续的构建逻辑中用于配置编译器选项或链接库。
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
文件。
太多了,有时间接着读。