在Makefile配方中设置变量,然后对其进行测试
在这个配方中,我希望git仅在git存在并且我在git存储库中时才能获取当前的sha1哈希。我的问题是$(GIT)总是空的。我不明白为什么设置$(散列)并回显它是有效的。这是怎么回事?如果安装了git,如何让Make执行一段代码在Makefile配方中设置变量,然后对其进行测试,makefile,Makefile,在这个配方中,我希望git仅在git存在并且我在git存储库中时才能获取当前的sha1哈希。我的问题是$(GIT)总是空的。我不明白为什么设置$(散列)并回显它是有效的。这是怎么回事?如果安装了git,如何让Make执行一段代码 hash: ifneq ("$(wildcard .git)", "") $(eval GIT=`which git`) ifdef $(GIT) $(eval HASH=`git rev-parse HEAD`) @echo $(HASH)
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脚本来执行此操作
我希望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
$ make
Git not installed or not in a git repository
在git存储库中(至少有一次提交)和不在git存储库中时
运行方式如下:
$ make
7cf328b322f7764144821fdaee170d9842218e36
$ make
Git not installed or not in a git repository
看
请注意以下内容之间的对比:
ifdef HASH
在你自己的尝试中:
ifdef $(GIT)
第一个测试HASH
是否是一个已定义(即非空)的make变量,这就是我
希望第二个测试是否$(GIT)
,即GIT
的值,您希望该值为“which GIT”,
是一个已定义的make变量。那不是你想要的`哪一个git`不是定义的make变量,即使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
在此上下文中,is not=`which 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
运行:
为什么第一个建议会导致哈希字符串中出现一个前导空格,正如它出现在
git_sha1.h
中一样?@Frotz-Ah,这是因为我将哈希定义拆分为SO格式的方式。使其HASH:=$(if$(and$(wildcard.git),$(shell which git)),$(shell git rev parse HEAD))
将没有前导空格。