不同语言的不同 INTERFACE 编译器选项

different INTERFACE compiler options for different languages

从 v3.20 开始,CMake 具有 target_compile_options() command,我们可以调用它,例如,像这样:

target_compile_options(foo INTERFACE "--some-option")

这很好......只要我们只在单一语言甚至单一编译器的编译中使用 foo。但是,如果我想在不同语言的编译中依赖 foo 怎么办?例如C、C++ 和 CUDA?

我如何指示不同的编译选项以供此类家属使用不同的语言?

我目前的想法是使用虚拟目标,每个目标都有自己的 INTERFACE 编译选项:

add_custom_target( foo_c    )
add_custom_target( foo_cpp  )
add_custom_target( foo_cuda )
add_dependencies( foo_c    foo )
add_dependencies( foo_cpp  foo )
add_dependencies( foo_cuda foo )
target_compile_options( foo_c    INTERFACE "--option-for-C"    )
target_compile_options( foo_cpp  INTERFACE "--option-for-C++"  )
target_compile_options( foo_cuda INTERFACE "--option-for-CUDA" )

但这似乎是一种拼凑。

可能有适合您的生成器表达式:$<COMPILE_LANGUAGE:languages> (https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#id2)

虽然我没有在你的场景中尝试过这个。

target_compile_options(foo INTERFACE
    "$<$<COMPILE_LANGUAGE:C>:--option-for-C>"
    "$<$<COMPILE_LANGUAGE:CXX>:--option-for-C++>"
    ...
)

来自文档:

$<COMPILE_LANGUAGE:languages>

1 when the language used for compilation unit matches any of the entries in languages, otherwise 0. This expression may be used to specify compile options, compile definitions, and include directories for source files of a particular language in a target.