【发布时间】:2018-05-08 10:58:25
【问题描述】:
我必须定义一个包含版本号的目标,该版本号又是从 git 检索的某个文件(此目标的先决条件)中提取的。
我首先尝试的是使用eval 设置一个变量并在名称中使用它,就像这样。
version_file:
@checkout
version: version_file
@eval version := get version from version_file
file_$(version):
@echo file_$(version)
final_target: file_$(version)
@echo $@
这行不通:make 在第一遍读取 makefile 并没有找到变量 dynamic_prerequisite,因此创建的目标简单地命名为 file_。
但是当我尝试动态创建规则时,在设置变量之后,像这样
...
define rule_file_version
file_$(version):
@echo version: $@
endef
version: version_file
@eval version := get version from version_file
$(eval $(rule_file_version))
...这给了我错误信息:
makefile:12: *** 无法在配方中定义先决条件。
当然,我不能将目标的eval 移到配方之外,因为我会遇到和以前一样的问题。
有没有办法通过gnu make 实现我想要的?
【问题讨论】:
-
您似乎想在黑匣子中计算
dynamic_prerequisite的值。您对黑盒是脚本还是规则有偏好? -
这是我用例中的一个脚本。
-
现在,看到您的回答,我意识到我的示例实际上过于简化了。我的回答也应该是“规则”,因为脚本本身取决于另一个目标。我将编辑问题以反映这一点。