曾经试图让这个简短的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的优点,并且不建议将两者结合使用。先谢谢您的帮助。
答案 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