在这个配方中,我希望git仅在git存在且我在git存储库中时才获取当前的sha1哈希。我的问题是$(GIT)总是为空。我不明白为什么会这样设置$(HASH)并回应它有效。这里发生了什么?如果只安装了git,我怎样才能获得Make来执行一大堆代码?
hash:
ifneq ("$(wildcard .git)", "")
$(eval GIT=`which git`)
ifdef $(GIT)
$(eval HASH=`git rev-parse HEAD`)
@echo $(HASH)
@echo "#define GIT_SHA1 \"$(HASH)\"" > git_sha1.h
endif
else
@echo "Not in a git repository"
endif
我想避免使用shell脚本来执行此操作。
答案 0 :(得分:3)
我希望git仅在git存在且我在git存储库中时才获取当前的sha1哈希
你可以这样做:
Makefile 1
HASH := $(if $(and $(wildcard .git),$(shell which git)), \
$(shell git rev-parse HEAD))
hash:
ifdef HASH
@echo $(HASH)
@echo "#define GIT_SHA1 \"$(HASH)\"" > git_sha1.h
else
@echo "Git not installed or not in a git repository"
endif
的运行方式如下:
$ make
7cf328b322f7764144821fdaee170d9842218e36
在git存储库中(至少有一次提交)并且不在git存储库中时 像:
$ make
Git not installed or not in a git repository
请参阅8.4 Functions for Conditionals
注意:
之间的对比ifdef HASH
并在你自己的尝试中:
ifdef $(GIT)
首先测试HASH
是否是定义的(即非空的)变量,这就是我
想。第二个测试是$(GIT)
,即GIT
的值,你希望它是`哪个git`,
是一个定义的make变量。那不是你想要的。即使GIT
,`git`也不是定义的生成变量
是,和:
ifdef `which git`
将是sytax错误 [1] 。
据推测,您并不需要:
@echo $(HASH)
在这种情况下,您可以简化为:
Makefile 2
hash:
ifneq ($(and $(wildcard .git),$(shell which git)),)
@echo "#define GIT_SHA1 \"$$(git rev-parse HEAD)\"" > git_sha1.h
else
@echo "Git not installed or not in a git repository"
endif
<小时/> [1]那么为什么你没有看到
ifdef $(GIT)
的语法错误?因为GIT
在这种情况下,不是=`哪个git`。这是未定义的。下列
makefile说明:
Makefile 3
GLOBAL_VAR_A := global_var_a
all:
$(eval RECIPE_VAR_A=recipe_var_a)
ifdef RECIPE_VAR_A
@echo $(RECIPE_VAR_A) for RECIPE_VAR_A
else
@echo RECIPE_VAR_A is defined only within the recipe
endif
ifdef GLOBAL_VAR_A
@echo GLOBAL_VAR_A is defined globally
@echo $(RECIPE_VAR_A) for GLOBAL_VAR_A
endif
执行命令
$ make
RECIPE_VAR_A is defined only within the recipe
GLOBAL_VAR_A is defined globally
recipe_var_a for GLOBAL_VAR_A