在Makefile配方中设置变量然后测试它

时间:2016-07-15 21:09:40

标签: makefile

在这个配方中,我希望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脚本来执行此操作。

1 个答案:

答案 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