我正在努力使这条规则生效。它完全炸毁了我的整个Makefile。
它应该验证用户传递的version
的值是否存在于PYVERSION
变量中。
actual行为很复杂,因为我尝试了很多不同的事情。我不是GNU专家,所以我尝试了${version}
和$(version)
和$version
以及与PYVERSION
相同的操作。我在此处发布的当前版本always转到else块,与version
输入无关。
PYVERSIONS := "3.5 3.6 3.7 3.8"
.PHONY: venv
venv:
if test $(findstring ${version}, $(PYVERSIONS)); then
/Library/Frameworks/Python.framework/Versions/${version}/bin/python3 -m venv venv
else
$(error Bad python version given (${version}) project only supports ${PYVERSIONS})
fi;
像make venv version=3.5
这样调用应成功执行if
块并创建venv
。
[make venv version=2.7
的调用应在else块中引发错误消息。
我正在尝试遵循此post
您正在将Shell语法与Make语法混合。
如果要使用shell条件处理,则必须将整个内容放在配方中的一行上(因为每一行都在其自己的子shell中执行):
venv:
if test $(findstring ${version}, $(PYVERSIONS)) ; then echo $(version)/bin/python3 venv; else echo bad version $(version); fi
或者您可以通过反斜杠将行换行:
venv:
if test $(findstring ${version}, $(PYVERSIONS)) ; \
then \
echo $(version)/bin/python3 venv; \
else \
echo bad version $(version); \
fi
((请注意,if
前面只有一个TAB。)
如果要在规则内使用Make条件:
venv:
ifeq ($(findstring ${version}, $(PYVERSIONS)),)
echo bad version $(version);
else
echo echo $(version)/bin/python3 venv;
endif