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

时间:2018-09-03 15:23:04

标签: cmake

我想基于其他变量将库编译为共享库或静态库,例如:

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 个答案:

答案 0 :(得分:1)

AFAIK,您无法使用generator expressions来做到这一点(无法根据文档查询该方面),因为正是出于这个原因,BUILD_SHARED_LIBS才在那里。以允许您在配置期间选择其值(使用-D命令行选项)。仅当您没有像代码中那样显式设置库类型时,此方法才起作用

add_library(MyLibrary ${SOURCES})

实际上,这是推荐的做法。如果您需要结合其他条件来影响其值,则可以使用常用的if()/else()逻辑来覆盖它,并确保至少为用户打印出信息量大的message()

但是,更好的方法是(通过option将这些决定推送给用户,并检查非法组合,并发出message(FATAL_ERROR)。即使该条件是自动确定的,这仍然是一项值得采用的策略。