设置项目范围的编译器选项

时间:2021-07-18 08:10:54

标签: cmake

我想使用 CMake 创建模块化嵌入式 C++ 软件。我分离了 hal-drivers 静态库,一些 common-utils 库和顶级目标 device 取决于这两个使用 target_link_libraries 标记的内容,如下所示:

target_link_libraries(device
     PRIVATE
         hal-drivers
         common-utils
)

使用如下命令可以很容易地在“依赖阶梯”中向上传播编译定义和选项:

target_compile_definitions(hal-drivers
    INTERFACE
        STM32F415xx
        USE_HAL_DRIVER
)

这样任何使用 hal-drivers 头文件的目标都会正确地预处理这些头文件,我发现这个 CMake 脚本功能(“设置”的传播)很棒,但这不是这个问题的重点。

问题是我应该如何为项目中的每个目标传播常见的编译器选项,例如 -fdata-sections-Wall?我知道我可以

  • 创建虚拟(没有源文件和头文件,只有编译选项)接口目标,项目中的每个其他目标都将使用该目标,但这看起来像是一种解决方法...
  • 为每个目标分别指定提到的编译器选项,因为我只有大约 5 个目标,但维护起来会很成问题。
  • 在我的商业工作项目(50 个目标)中,我的老板最终做出了一个丑陋的妥协:将顶部 CMakeLists.txt 中的通用编译选项设置为缓存变量,然后手动将此变量应用于所有目标,但我们不喜欢它

请记住:我确实有可行的解决方案,我对推荐的解决方案感兴趣。此外,我每天都在使用 Professional CMake: A Practical Guide 9th Edition(这是一本好书),但我未能在这本书中找到我的问题的答案。

1 个答案:

答案 0 :(得分:0)

我找到了答案。

我想我对缺乏优雅解决方案的抱怨是由于我对 target_compile_options 等语法糖的依恋,但问题是 CMake 在艰难中进化,并不是每个 CMake 功能都很漂亮,但它有效。

有一个答案:https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html The flags in this variable will be passed to the compiler before those in the per-configuration CMAKE_<LANG>_FLAGS_<CONFIG> variant, and before flags added by the add_compile_options() or target_compile_options() commands.

所以我必须像这样将我的自定义选项附加到这个特殊的 CMake 变量中:

project(Device C CXX ASM) 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections")

这样它就会用 fdata-sections 淹没所有目标。

留下这个帖子作为有趣的笔记。