为什么变量没有在Makefile中设置?



这是我的Makefile。

ifeq ($(BRANCH), )
BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
endif
ifeq ($(COMMIT), )
COMMIT := $(shell git rev-parse --abbrev-ref HEAD)
endif
all:
ifeq ($(BRANCH), )
$(error Please pass a valid branch)
endif
ifeq ($(COMMIT), )
$(error Please pass a valid commit)
endif
echo $(BRANCH) $(COMMIT)
rm -f server-test

我希望用户能够使用make命令传递参数BRANCH和COMMIT,并在用户不传递这些参数时将其设置为默认值。如果我使用makemake BRANCH=master。但如果用户使用make BRANCH=make BRANCH="",则给出错误。我不明白的部分是我使用相同的检查设置变量和抛出错误。为什么它在if块的一个地方而不是另一个地方?

如果用户没有将变量传递给Makefile

,我试图有条件地将变量设置为默认值

问题是:

BRANCH := $(shell ...)

不像你期望的那样工作。从手册页:

If a variable has been set with a command argument,
then ordinary assignments in the makefile are ignored.

因此,如果您运行make BRANCH=make BRANCH="",那么您已经将该变量的值设置为空字符串。当您尝试为其分配新值时,它仍然为空,并触发错误。解决方案在同一页:

override BRANCH := $(shell ...)

最新更新