我想基于其他变量将库编译为共享库或静态库,例如:
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()
答案 0 :(得分:1)
AFAIK,您无法使用generator expressions来做到这一点(无法根据文档查询该方面),因为正是出于这个原因,BUILD_SHARED_LIBS才在那里。以允许您在配置期间选择其值(使用-D
命令行选项)。仅当您没有像代码中那样显式设置库类型时,此方法才起作用
add_library(MyLibrary ${SOURCES})
实际上,这是推荐的做法。如果您需要结合其他条件来影响其值,则可以使用常用的if()/else()
逻辑来覆盖它,并确保至少为用户打印出信息量大的message()
。
但是,更好的方法是(通过option将这些决定推送给用户,并检查非法组合,并发出message(FATAL_ERROR)
。即使该条件是自动确定的,这仍然是一项值得采用的策略。