如何将编译选项传播到 CMake 中的子目录?

Jef*_*f L 7 c c++ cmake

在我的项目中,我有一个CMakeLists.txt定义了一些可执行文件的根目录。我用来target_compile_options配置一些设置,例如这些可执行文件的警告。我有一些子目录编译一些库以与可执行文件链接。如何将编译选项从根目录传播CMakeLists.txt到子目录中的依赖项,而无需重新定义每个子目录中的编译选项CMakeLists.txt

作为示例,这是我的 root 的简化版本CMakeLists.txt

cmake_minimum_required(VERSION 3.8)

project(proj)

enable_language(C ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

add_subdirectory(src/lib/somelib)

add_executable(my_executable src/app/main.c)
target_compile_options(my_executable PUBLIC -Wpedantic) # as an example
target_link_libraries(my_executable PRIVATE somelib)
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txtsrc/lib/somelib

add_library(somelib somelib.c)
target_include_directories(somelib PUBLIC .)
Run Code Online (Sandbox Code Playgroud)

在此示例中,我希望somelib.c使用 root 中的任何编译选项进行编译CMakeLists.txt

kay*_*lum 2

来自cmake 手册

添加编译选项

将选项添加到 COMPILE_OPTIONS 目录属性。从当前目录及以下目录编译目标时使用这些选项。

因此,对于给定的示例,应该能够将其添加到顶层 CMakeLists.txt:

add_compile_options(-Wpedantic)
Run Code Online (Sandbox Code Playgroud)