You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归评估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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:50:33