在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
为例,这个问题也应视为其他功能的一般问题!
答案 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代码的原因。