Makefile(如果存在远程Git存储库)设置变量

时间:2018-12-25 21:39:23

标签: git makefile

曾经试图让这个简短的Makefile无法成功工作:

REPO_NAME = myrepo
PROJECT = project

build: check-if-repo-exists

check-if-repo-exists:
    $(eval RESULT := $(shell git ls-remote ssh://git-user@git-server-demo.org/$(PROJECT)/$(REPO_NAME).git 2>/dev/null|grep HEAD|cut -f2 -d' ' 2>/dev/null))
    @printf "REPO-->$(RESULT)\n"
ifneq (,$(findstring HEAD,$(RESULT)))
    @printf "git repository - NOT found\n"
else
    @printf "git repository - found \n"
endif

结果始终是

  

git存储库-找到

不管存储库是否存在都不在乎。有没有可能的解决方案?我也尝试过使用类似bash的if语句之类的另一种方法

@if [ "$(REPO)" == "HEAD" ] ; then \
    @printf "git repository - found \n";\   
    @$(eval MY_ERROR := $(shell printf "TRUE"))
fi 

结果更好,但是我仍然无法设置变量以在其他规则中使用它。变量MY_ERROR在新规则中将不可用。我知道在Makefiles中规则不会像在Bash中那样顺序执行,但是在构建应用程序之前检查存储库是否可用是很有意义的。使用make有什么建议吗?使用Bash可以很容易地做到这一点,但是我放弃了Makefile的优点,并且不建议将两者结合使用。先谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

ifneq的评估先于规则,因此您很可能想要:

RESULT := $(shell git ls-remote ssh://git-user@git-server-demo.org/$(PROJECT)/$(REPO_NAME).git 2>/dev/null|grep HEAD|cut -f2 -d' ' 2>/dev/null)
ifneq (,$(findstring HEAD,$(RESULT)))
$(error "git repository - NOT found\n")
endif

即定义一个变量(在任何make规则之外),其值就是结果$(shell ...)。如果其值意外,则发出make错误。

答案 1 :(得分:0)

最后,这就是我解决问题的方法:

REPO_NAME=my-repo
PROJECT=my-project

update-my-repo: display-search-my-repo check-if-my-repo-exists display-my- 
repo-exists-result update-my-repo

update-my-repo:
@printf "Updating git repository - $(REPO_NAME) ..."

check-if-my-repo-exists:
    $(eval MY_REPO := $(shell git ls-remote ssh:///git-user@git-server-demo.org/$(PROJECT)/$(REPO_NAME).git 2>/dev/null|grep HEAD|cut -f2 -d'    ' 2>/dev/null))

display-search-my-repo:
    @printf "Searching for repository - $(REPO_NAME) ..."

display-my-repo-exists-result:
    @if [ "$(MY_REPO)" = "HEAD" ] ; then \
        printf "$(shell tput cub 3)[FOUND]\n";\
    fi
    @if [ "$(MY_REPO)" = "" ] ; then \
        printf "\n\n git repository - $(REPO_NAME) NOT found [ERROR]\n\n";\
        exit 2; \
    fi