为什么GNU不输出执行我的命令?

时间:2015-07-08 22:30:45

标签: makefile gnu-make

我有一个带有目标的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 :修正了我的代码。很抱歉,但我错过了来自其他目标的依赖,这对于理解这个问题至关重要。

2 个答案:

答案 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语法,并且不被视为配方的一部分。