参数列表中的CMake中的内联条件?

时间:2014-05-05 10:01:18

标签: cmake conditional inline

在CMake中是否有可能以某种方式在参数列表中使用内联条件?

我想要的示例(整个IF行没有被解析但是像字符串一样处理,但我希望它被解析):

LIST(APPEND myList
  foo
  bar
  IF(MINGW) hello ENDIF()
  cool
)

而不是我现在拥有的

LIST(APPEND myList
  foo
  bar
)

IF(MINGW)
  LIST(APPEND myList hello)
ENDIF(MINGW)

LIST(APPEND myList cool)

类似于示例的内容会使我的CMakeLists.txt文件在许多地方更容易阅读!特别是如果需要保留特定的顺序,CMake代码有时会变得很大而没有内联条件,因为每次都需要重复相同的调用。

注意:我在这里以LIST为例,这个问题也应视为其他功能的一般问题!

3 个答案:

答案 0 :(得分:2)

目前在CMake中没有这样的功能,但我同意它在某些情况下会非常有用。

我通常依赖于CMake在大多数情况下忽略空值没有问题:

if(MINGW)
    set(ADDITIONAL_ITEMS hello)
endif()

list(APPEND mylist
  foo
  bar
  ${ADDITIONAL_ITEMS}
  cool
)

它并不完美,但恕我直言,至少比两次附加到同一个清单更干净。相同的技术也适用于有条件地传递函数参数。

请注意,根据需要的上下文,CMake generator expressions可能是一个选项:

target_link_libraries(t foo bar $<$<BOOL:${SOME_CONDITION}>:hello> cool)

答案 1 :(得分:1)

您可以使用PLATFORM_ID生成器表达式,具体取决于您对要创建的列表执行的操作:

http://www.cmake.org/cmake/help/v3.0/manual/cmake-generator-expressions.7.html

target_link_libraries(t foo bar $<$<PLATFORM_ID:MINGW>:hello> cool)

除了target_link_libraries之外,这样的表达式还可以使用target_include_directories,target_compile_definitions,target_compile_options,target_compile_features(CMake 3.1),target_sources(CMake 3.1),file(GENERATE),install(FILES),add_custom_target等。你明白了:)。

答案 2 :(得分:-1)

不幸的是,没有。

有条件地构建列表而不重复的唯一方法是使用列表APPEND(BTW除非排序很重要,您可以通过在列表定义中添加cool来简化它)。

CMake语法非常冗长且有限,而且通常很难不重复自己。这就是我有时最终用另一种语言生成部分CMake代码的原因。