使文件成为目标以检查已安装的依赖项

时间:2019-05-24 18:51:23

标签: python makefile

我有一个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测试。...因此,如果您对上述方法有任何想法,请随时分享。

谢谢, 菲尔

1 个答案:

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