如何在CMake生成表达式中使用条件

3
我希望可以根据其他变量来编译一个库,使其成为共享库或静态库,例如:
add_library(MyLibrary $<$<IF:${BUILD_SHARED_LIBS},SHARED,STATIC> ${SOURCES})

为了清晰起见,我期望这与以下内容等效:
if(BUILD_SHARED_LIBS)
  add_library(MyLibrary SHARED ${SOURCES})
elseif()
  add_library(MyLibrary STATIC ${SOURCES})
endif()

1
https://dev59.com/NGkMtIcB2Jgan1znXH5i#69346359,$<$<STREQUAL:$<TARGET_PROPERTY:Foo,TYPE>,SHARED_LIBRARY>:;$<TARGET_SONAME_FILE:Foo>> - caoanan
1个回答

2
据我所知,您无法使用生成器表达式来查询该方面(根据文档),因为BUILD_SHARED_LIBS正是出于这个原因而存在的;它允许您在配置期间选择其值(使用-D命令行选项)。这仅在您没有明确设置库类型的情况下才有效,而是像这样进行设置。
add_library(MyLibrary ${SOURCES})

实际上,这是推荐的做法。如果您需要在与其他条件相关联时影响其值,则可以使用通常的if()/else()逻辑覆盖它,确保至少为用户打印一个信息性的message()
然而,更好的方法是将这些决策推给用户(通过选项),并检查非法组合,发出message(FATAL_ERROR)。即使该条件是自动确定的,这仍然是一种有价值的策略。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接