在Makefile配方中设置变量,然后对其进行测试

在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)

在这个配方中,我希望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)
    @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))
将没有前导空格。