我有一个makefile,其中的目标依赖于安装一些外部客户端(python3,libxml2等)。
这是我的makefile文件
.PHONY: test install-packages mac-setup checkenv target help
EXTERNALS = python3 pip3 xmllint pytest pipenv
P := $(foreach exec,$(EXTERNALS),$(if $(shell which $(exec)),missing,$(warning "===>>>WARNING: No required `$(exec)` in PATH, run `make mac-setup` + `make install-packages` <<<===")))
test: ## run all tests in test directory
pipenv run pytest -v --ignore=path payload_files .
install-packages: ##install python packages listed in Pipfile
pipenv install
mac-setup: ## setup mac for testing
brew install libxml2
brew install python3
brew install pipenv
# see https://github.mycompany.com/ea/ea_test_player_unified/blob/master/run-feature.sh
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.DEFAULT_GOAL := help
通知该行
P := $(foreach exec,$(EXTERNALS),$(if $(shell which $(exec)),missing,$(warning "===>>>WARNING: No required `$(exec)` in PATH, run `make mac-setup` + `make install-packages` <<<===")))
这将检查所需的二进制文件。这行得通...。但是我宁愿有一个checkenv
目标来执行此操作并出错,因此我可以将其附加到test
之类的特定目标上,而不是打印出可能被忽略的警告。>
想要:
checkenv: # error if which ${binary} fails or *even better* if if binary --version doesn't return the right version: python3 pip3 xmllint pytest pipenv
我尝试了在网络上发现的各种技术,包括stackoverflow ....,但是大多数使用上面使用的技术,它们不使用make目标或仅检查一个二进制文件。我尝试通过二进制数组构建循环,但是由于成为了PITA而无法正确获取语法:)
有什么建议吗?
请注意,我是python新手,任务是用python重写一些jmeter测试。...因此,如果您对上述方法有任何想法,请随时分享。
谢谢, 菲尔
答案 0 :(得分:0)
看不出问题所在。在我看来,这很简单,因为make允许在同一行上使用多个目标:
EXTERNALS := python3 pip3 xmllint pytest pipenv
python3_version := Python 3.7.3
pip3_version := ...
...
.PHONY: checkenv $(EXTERNALS)
checkenv: $(EXTERNALS)
$(EXTERNALS):
if [ "`$@ --version`" != "$($@_version)" ]; then echo "$@ check failed"; false; fi