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

参数列表中CMake中的内联条件?,cmake,conditional,inline,Cmake,Conditional,Inline,在CMake中,是否可能以某种方式在参数列表中包含内联条件 我想要的示例(如果整个行没有被解析,而是像字符串一样处理,但是我想要解析它): 而不是我现在拥有的 LIST(APPEND myList foo bar ) IF(MINGW) LIST(APPEND myList hello) ENDIF(MINGW) LIST(APPEND myList cool) 类似的例子会使我的CMakeLists.txt文件在很多地方更容易阅读!特别是如果需要保持特定的顺序,那么CMake

在CMake中,是否可能以某种方式在参数列表中包含内联条件

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

而不是我现在拥有的

LIST(APPEND myList
  foo
  bar
)

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

LIST(APPEND myList cool)
类似的例子会使我的CMakeLists.txt文件在很多地方更容易阅读!特别是如果需要保持特定的顺序,那么CMake代码有时在没有内联条件的情况下会变得非常大,因为每次都需要重复相同的调用


注意:我在这里以
LIST
为例,对于其他函数,这个问题也应该被视为通用问题

目前,CMake中没有此类功能,尽管我同意它在某些情况下非常有用

我通常依赖这样一个事实,即在大多数情况下,CMake忽略空值没有问题:

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

list(APPEND mylist
  foo
  bar
  ${ADDITIONAL_ITEMS}
  cool
)
这并不完美,但至少比两次添加到同一个列表更干净。同样的技术也适用于有条件地传递函数参数

请注意,根据需要的上下文,可能有以下选项:

target_link_libraries(t foo bar $<$<BOOL:${SOME_CONDITION}>:hello> cool)
target\u link\u库(t foo bar$cool)
不幸的是,没有

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


CMake语法非常冗长和有限,通常很难不重复。这就是为什么我有时会用另一种语言生成CMake代码的一部分。

您可以使用平台ID生成器表达式,具体取决于您对所创建列表的操作:

target\u link\u库(t foo bar$cool)
除了target_link_库之外,这些表达式还与target_一起工作,包括目录、target_compile_定义、target_compile_选项、target_compile_功能(CMake 3.1)、target_源(CMake 3.1)、文件(GENERATE)、安装(FILES)、添加自定义_目标等。您的想法是:)

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