如何验证字符串中是否存在GNU Makefile参数

问题描述 投票:0回答:1

我正在努力使这条规则生效。它完全炸毁了我的整个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

bash makefile gnu-make
1个回答
0
投票

您正在将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
© www.soinside.com 2019 - 2024. All rights reserved.