请解释此CMake语法,以便将编译器选项添加到目标

时间:2017-01-04 15:35:42

标签: cmake

我有一个CMakeLists.txt,它构建了许多目标。拨打一个foo和一个bar

目前foobar都分享了ccmake配置的一些设置

 CMAKE_CXX_FLAGS =  -W -Wall
 CMAKE_CXX_FLAGS_DEBUG = -g -pg

我需要将-fPIC添加到foo,但不是bar。根据{{​​3}},我想使用this answer

target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
  

请注意,target_compile_options 添加 [sic] 选项

这听起来像我需要的但是这种语法是什么意思?

"$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>"

为了澄清,我想在编译-fPIC时添加foo作为附加标记,而不是在编译bar

时添加

请解释$<$<商家,并具体说明如何将-fPIC添加为foo的标记。

1 个答案:

答案 0 :(得分:1)

看起来$<$<属于生成器表达式类别:https://cmake.org/cmake/help/v3.0/manual/cmake-generator-expressions.7.html#manual:cmake-generator-expressions(7), 正好进入

  

逻辑表达式

所以在你的情况下,

"$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>"

在使用DEBUG配置时扩展为MY_DEBUG_OPTIONS,否则扩展为空。 因此,在您的情况下,您应该将-fPIC添加到MY_DEBUG_OPTIONS。 为了更精确一点:

$<CONFIG:DEBUG>
根据天气CONFIG是否为DEBUG,

分别评估为1或0。 然后你会有:

$<0:${MY_DEBUG_OPTIONS}>

$<1:${MY_DEBUG_OPTIONS}>

上述两个表达式将按以下方式评估:

$<0:${MY_DEBUG_OPTIONS}>将评估为

  

空字符串(忽略$ {MY_DEBUG_OPTIONS})

$<1:${MY_DEBUG_OPTIONS}>将评估为

  

内容$ {MY_DEBUG_OPTIONS}

正如文件所述。
在最后一种情况下,-fPIC将被添加到CMAKE_CXX_FLAGS或CMAKE_CXX_FLAGS_DEBUG之一。