【问题标题】:Makefiles: syntax for regex matching as a conditional in an if statementMakefiles:正则表达式匹配的语法作为 if 语句中的条件
【发布时间】:2018-06-15 17:56:17
【问题描述】:

我想在 Makefile 中添加一行以检查安装的 python 版本是否为 2.7.X,最好是 2.7.9 或更高版本。特别是不是 3.X。

我对 bash 脚本和 Makefile 有点陌生,但 Makefile 似乎使用与普通 bash 或 shell 脚本不同的语法,所以我不能做我通常会做的事情。比如:

if [[ $(python --version) =~ "Python 2.7.*" ]]; then echo "Version matched!"; fi

将字符串与 Makefile 中的正则表达式匹配的语法是什么?

我找到了用于替换的 Makefile 模式以及 ifeqifneq,但它们似乎无法执行我希望它们执行的操作。

感谢任何帮助。谢谢!

【问题讨论】:

标签: bash makefile


【解决方案1】:

如果您想在任何特定规则之外编写此测试,则必须使用 make 语法。假设你使用的是 GNU make,你可以这样写:

$(or $(findstring Python 2.7.,$(shell python --version 2>&1)),$(error Python 2.7.x is required))

(奇怪的是,python --version 将其版本打印到标准错误而不是标准输出)。

有关这些功能的更多详细信息,请参阅Syntax of Functions

【讨论】:

  • 我在将字符串解释为文件路径时遇到问题:Python:无法打开文件 '2.7.':[Errno 2] 没有这样的文件或目录
  • 那你可能抄错了,这是正确的语法。
  • 我的示例旨在出现在任何配方之外,因为 makefile 语法而不是 shell 语法。例如,在定义任何目标之前,makefile 中的第一件事,而不是变量的一部分。只是它自己的线,完全如图所示。 wp78de 显示的解决方案是 shell 语法,旨在出现在某处的配方中。
  • 它还需要至少 GNU make 版本 3.81(用于or 函数。
【解决方案2】:

试试这样:

ret=`python -c 'import sys; print("%i" % (sys.hexversion<0x03000000))'`
if [ $ret -eq 0 ]; then
    echo "Python 2.7.x required"
else 
    echo "Python version is < 3.x"
fi

【讨论】:

  • 这可以简化为if python -c 'import sys; exit(sys.hexversion &lt; 0x03000000)'; then ...
  • 我的 makefile 抱怨我缺少分隔符:*** 缺少分隔符。停止。
  • chepner,感谢您的贡献!搞定了!
  • wp78de 感谢您的帮助!
  • python --version 2&gt;&amp;1 | grep 'Python 2' 比这个烂摊子要紧凑很多。
猜你喜欢
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2011-04-26
  • 2012-04-30
  • 2013-12-10
  • 2012-04-15
  • 2011-08-21
相关资源
最近更新 更多