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在这里作为一个例子,这个问题也应该被视为其他函数的一般性问题!
目前 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)
您可以使用 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 等一起使用。您明白了:)。
| 归档时间: |
|
| 查看次数: |
9453 次 |
| 最近记录: |