-
Notifications
You must be signed in to change notification settings - Fork 14
工具链 CMake 构建系统简介
本文介绍了用于本工程的 CMake 构建系统和使用方法。
前置阅读资料:工具链 概念介绍
CMake 配置主要存在于 CMakeLists.txt,以及其他被 CMakeLists.txt 引用的 CMake 文件,和由 CLion 传入的参数等。
CMakeLists.txt 由命令组成,基本格式为:<command>(...)
,括号内可包含换行,换行符可用于分割文件、关键字等。
本工程的 CMakeLists.txt 包含以下几个部分:
- General Part。包含工具链配置(config/toolchain.cmake)、开发板配置、工程配置、编译 Flags 配置(config/compile_options.cmake)等
- Options。选项。
- Common Files and Targets Configurations。用于所有 Targets 的文件和 Include Directories 配置。
- Files and Targets Configurations。各 Targets 配置。
- Post Configurations for all targets。应用于各个 Targets 的自动化脚本。
实际应用中,非加粗的三个部分一般不需要修改,在此也不做介绍,请参考文件注释。
Target,编译目标,是 CMake 配置中的一个概念。一个工程文件可以有多个 Target。工程包含了所有 Targets 所需的源代码,而单个 Target 可能只用到了部分的源码,并且每个 Target 可以有自己独特的编译选项。
stackoverflow 上有一段关于两者关系的描述:
- A project is a set of files and general preferences.
- A target is a subset of the files, and specific preferences (which override the project preferences).
- Each target builds a product, which may be a library, executable, or framework.
- Because a target builds something, it also has Build Phases and Build Rules, where you can add dependencies, and refine what gets copied where and how.
本工程用到了 OBJECT library (用于复用 ChibiOS 文件)和 Executable(用于 elf 文件)两种类型的 Target。
add_library(ChibiOS_OBJ OBJECT ${CHIBIOS_XASM_SRC} ${CHIBIOS_C_SRC} ${CHIBIOS_CPP_SRC} dev/board/${BOARD_NAME}/board.c)
该语句即创建了一个名为 ChibiOS_OBJ 的 Library 目标,OBJECT
说明其为 Object Library
](编译后无链接过程)。后面的几项指定该 Target 包含的源文件,CMake 会自动判断源文件类型,并用相应的编译器编译。
在 Post Configurations 部分,CMake 将 ChibiOS 部分和 Commom 源码加入每个 Target 中:
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ChibiOS_OBJ> ${COMMON_CPP_SRC})
因此,在 Files and Targets Configurations 部分,每个 Target 后仅需包含自己独特的源码。
编译器会自动在 Include Directories 下搜索头文件,但不会自动递归搜索下层在文件夹中的文件。
add_executable(名称 源文件)
例如:
add_executable(ut_blink
dev/module/button_monitor.cpp
dev/debug/main_blink.cpp)
以上语句创建了一个名为 ut_blink
的可执行文件(elf)Target,包含 dev/module/button_monitor.cpp
, dev/debug/main_blink.cpp
,以及 ChibiOS 文件和 COMMON_CPP_SRC 文件(默认添加)
不需要将 .h/.hpp 文件加入 Target 的源文件列表(当然加入了也没有关系),但需要确保其能够通过 Include Directories 找到。
在 set(COMMON_CPP_SRC ...)
后附加应用于所有 Targets 的源文件。
当一个目录被设为 Include Directory 后,该目录下的头文件可以被编译器自动找到。
在 include_directories(...)
后附加应用于所有 Targets 的 Include Directory。
如果是 .c/.cpp 文件,确保至少有一个 Target 包含了这个文件,或者其在 Common 文件中。
如果是 .h/.hpp 文件,确保该文件被使用(include),且能够通过 Include Directories 直接找到它。
- 2019.02.14 初次发布。liuzikai
- 2021.07.07 更新工具链系列文档顺序。liuzikai
- 基础知识
- 基础配置
- 进阶与参考