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

Foo*_*Bar 6 inline cmake conditional-statements

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

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

LIST(APPEND myList
  foo
  bar
  IF(MINGW) hello ENDIF()
  cool
)
Run Code Online (Sandbox Code Playgroud)

而不是我现在拥有的

LIST(APPEND myList
  foo
  bar
)

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

LIST(APPEND myList cool)
Run Code Online (Sandbox Code Playgroud)

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

注意:我LIST在这里作为一个例子,这个问题也应该被视为其他函数的一般性问题!

Com*_*sMS 9

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

我通常依赖这样一个事实:CMake 在大多数情况下都可以忽略空值:

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

list(APPEND mylist
  foo
  bar
  ${ADDITIONAL_ITEMS}
  cool
)
Run Code Online (Sandbox Code Playgroud)

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

请注意,根据需要的上下文,CMake 生成器表达式可能是一个选项:

target_link_libraries(t foo bar $<$<BOOL:${SOME_CONDITION}>:hello> cool)
Run Code Online (Sandbox Code Playgroud)


ste*_*ire 6

您可以使用 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)
Run Code Online (Sandbox Code Playgroud)

除了 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 等一起使用。您明白了:)。