CMake 生成器表达式中如何检查目标是否存在指定属性
CMake生成器表达式判断目标是否具备指定属性的方案
原生支持方案(CMake 3.19+)
CMake 3.19及更高版本已经原生提供了你需要的生成器表达式,用法完全符合你预期的形式:
$<TARGET_HAS_PROPERTY:tgt,property>
该表达式的返回规则非常明确:
- 目标
tgt存在指定property时返回1 - 否则返回
0
你可以直接和其他生成器表达式组合实现条件逻辑,示例用法如下:
# 仅当目标存在CUSTOM_COMPILE_FLAG属性时,才添加对应的编译定义 target_compile_definitions(app PRIVATE $<$<TARGET_HAS_PROPERTY:app,CUSTOM_COMPILE_FLAG>:-DUSE_CUSTOM_FLAG> )
低版本兼容方案(CMake < 3.19)
如果你的项目需要兼容更低版本的CMake,且要判断的属性在配置阶段前期就已经完成设置、不会在配置后期动态修改,可以用配置期逻辑配合生成器表达式实现近似效果:
# 配置阶段先查询目标是否定义了对应属性 get_property(target_has_prop TARGET tgt PROPERTY property DEFINED) # 转换为生成器可识别的布尔值 set(TGT_HAS_SPECIFIED_PROP $<BOOL:${target_has_prop}>)
后续可以直接用${TGT_HAS_SPECIFIED_PROP}替代原生表达式使用,注意该方案有局限性:如果属性是在get_property执行之后才设置到目标上的,判断结果会不准确,这种场景建议优先升级CMake版本使用原生实现。
注意事项
- 所有方案中传入的
tgt必须是已经通过add_executable、add_library等命令创建的合法目标,否则CMake会抛出配置错误。
内容的提问来源于stack exchange,提问作者Sogartar
相关产品推荐
相关产品推荐

