如何将目标特定的编译器和链接器标志应用于 CMake 中的子目录?

How can I apply target-specific compiler and linker flags to subdirectories in CMake?

我正在为一个 STM32 项目使用 CMake,因为该项目不再需要普通的 Makefile。我的目录结构如下所示。我在根 CMakeLists.txt 中定义了一个可执行文件,somelib 编译为一个 OBJECT 库,使用 add_subdirectory.

添加到主 CMakeLists.txt
CMakeLists.txt
src/
├─ app/
│  ├─ main.c
├─ lib/
│  ├─ somelib/
│  │  ├─ CMakeLists.txt
│  │  ├─ somelib.h
│  │  ├─ somelib.c

我需要编译和 link 源文件,其中包含一些特定于我的微控制器的标志(即 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard)。我为 arm-none-eabi-gcc 编译器设置了一个工具链文件,并在那里处理了特定于编译器的标志,但我犹豫是否将特定于微控制器的标志也放在该工具链文件中,因为这个项目可以扩展到我想要 运行 我的项目在不同的微控制器上的地方。

我的问题是,如果我要在根 CMakeLists.txt 中定义微控制器特定标志,当需要编译 somelib 时,我不知道如何获得 somelib 使用这些标志进行编译。我知道我可以使用全局 add_compile_optionsadd_libraries,但这似乎是个坏主意,特别是如果我想在同一个项目中支持不同的微控制器,那将有不同的设置旗帜。如何将编译器和 linker 设置传播到特定可执行文件的子目录?

I'm hesitant to put the microcontroller-specific flags in that toolchain file as well since this project could expand to where I'd want to run my project on a different microcontroller.

所以不要犹豫,去做吧。当您将转移到不同的微控制器时,您将拥有一个不同的工具链文件。为每一组唯一的编译器标志准备一个工具链。 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard 标志绝对属于工具链文件。


当您想要支持许多工具链文件组合并想要更高级时,您可能想要使用从 CMake 模块搜索路径获取 Platform/${CMAKE_SYSTEM_NAME}-GNU-C-${CMAKE_SYSTEM_PROCESSOR}.cmake 文件的默认行为。这与一些自定义变量 -DUSE_FLOAT=hard/soft-DMFPU=fpv4-sp-d16 相结合,构成了一个不错的结构视图。