我有一个带有目标的GNU makefile,其中(简化)如下所示:
determineversion:
$(eval GITDESCRIBE := $(shell git describe --dirty))
anothertarget: determineversion
do-something $(GITDESCRIBE)
当我运行make anothertarget
时,这会按预期工作(我将git describe
的值传递到我预期的do-something
。但是,我看不到git describe
命令的输出。我假设这是因为我使用:=
运算符捕获输出?如何将此输出作为此表达式的一部分进行回显?
更新2015-07-13 :修正了我的代码。很抱歉,但我错过了来自其他目标的依赖,这对于理解这个问题至关重要。
答案 0 :(得分:1)
如果您重新配置您的makefile:
GITDESCRIBE := $(shell git --describe)
determineversion:
[TAB]@echo "GITDESCRIBE: '${GITDESCRIBE}'"
anothertarget:
[TAB]do-something ${GITDESCRIBE}
你会成功。可替代地,
determineversion:
[TAB]$(eval GITDESCRIBE := $(shell git --describe))
anothertarget: determineversion
[TAB]do-something ${GITDESCRIBE}
可能是你正在寻找的魔力。
答案 1 :(得分:0)
如果我写一个像你的简单的makefile:
foo:
[TAB]$(eval FOO := abc)
bar:
[TAB]@echo "FOO: '${FOO}'"
当我运行“make -f foo.mk bar”时,我得到“FOO:''”
但是,如果我用八个空格替换[TAB],我会得到:“FOO:'abc'”,正如你所描述的那样。
如果“$(eval ...)”没有[TAB](或你的$ {。RECIPEPREFIX})的前缀,它被认为是内联GNU Make语法,并且不被视为配方的一部分。