不同语言的不同 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.
从 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 inlanguages
, otherwise0
. This expression may be used to specify compile options, compile definitions, and include directories for source files of a particular language in a target.