如何递归评估CMake嵌套生成器表达式以获取目标属性?
递归展开CMake生成器表达式获取目标属性
你在链式使用$<TARGET_PROPERTY>生成器表达式时遇到了展开不彻底的问题:设置fruit目标的COLOR属性为指向banana目标COLOR的生成器表达式,但通过file(GENERATE)获取时仅展开第一层,得到未解析的$<TARGET_PROPERTY:banana,COLOR>而非预期的yellow,同时因目标生成顺序不确定无法使用get_target_property。
你的示例代码:
cmake_minimum_required(VERSION 3.20) project(fruit_proj) add_custom_target(banana) set_target_properties(banana PROPERTIES COLOR "yellow") add_custom_target(fruit) set_target_properties(fruit PROPERTIES COLOR $<TARGET_PROPERTY:banana,COLOR>) file(GENERATE OUTPUT color.txt CONTENT $<TARGET_PROPERTY:fruit,COLOR>)
解决方案
CMake 3.20及以上版本提供了$<GENEX_EVAL:>生成器表达式,专门用于递归评估嵌套的生成器表达式,完全适配你的场景。只需修改file(GENERATE)行,用$<GENEX_EVAL>包裹目标属性表达式:
file(GENERATE OUTPUT color.txt CONTENT $<GENEX_EVAL:$<TARGET_PROPERTY:fruit,COLOR>>)
原理说明
$<GENEX_EVAL:expr>会对传入的生成器表达式expr进行完全递归展开,直到所有嵌套的生成器表达式都被解析为最终值。- 该操作在CMake的生成阶段执行,无需依赖目标的定义顺序,完美解决你提到的目标生成顺序不确定的问题。
修改后重新构建项目,生成的color.txt内容将是预期的yellow。
内容的提问来源于stack exchange,提问作者Burney
相关产品推荐
相关产品推荐

