微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Autoconf:如何在字符串中获取程序输出并检查其中是否存在另一个字符串

如何解决Autoconf:如何在字符串中获取程序输出并检查其中是否存在另一个字符串

我正在用 Python 开发 Qt 应用程序。它使用一个需要编译的资源文件。我正在使用 autotools 来管理我的项目的编译和安装。

现在,为了让应用程序可以使用资源文件,需要使用特定版本的编译程序(pyrcc)对其进行编译。我可以通过将 pyrcc -version输出放入 configure.ac 中的变量来获取版本。但是,我不知道如何检查输出中是否存在字符串 pyrcc5。如果不存在,我想告诉用户他的 pyrcc 程序版本错误,并中止 configure

另外,我想避免程序输出需要额外的变量,而是这样做(伪代码):

if "pyrcc5" not in output of "pyrcc -version":
    say "pyrcc has wrong version"
    exit 1

我该怎么做?

解决方法

在为 Autoconf 编写 configure.ac 时,请始终记住您基本上是在编写 shell 脚本。 Autoconf 提供了许多宏,可以为您提供很多影响,但您通常至少可以了解基本的“我如何在 Autoconf 中执行 X?”通过询问“我将如何在可移植的 shell 脚本中执行 X?”而提出问题?

特别是对于...

我想避免程序需要额外的变量 输出,而是这样做(伪代码):

if "pyrcc5" not in output of "pyrcc -version":
    say "pyrcc has wrong version"
    exit 1

... 用于此类任务的可移植 shell 脚本的常用工具是 grep,而且令人高兴的是,将其应用于任务的最简单方法不需要中间变量。例如,这完全实现了您的伪代码(不会向控制台发出任何无关的消息):

if ! pyrcc -version | grep pyrcc5 >/dev/null 2>/dev/null; then
  echo "pyrcc has wrong version"
  exit 1
fi

这将 pyrcc -version 的输出传送到 grep,并依赖于 grep 以成功状态退出当且仅当它找到任何匹配项的事实。

实际上,您可以将其准确地放在您的 configure.ac 中,但使用它会更惯用

  • 使用通常的 Autoconf 机制来定位 pyrccgrep,并使用通过这种方式发现的版本;
  • 使用 Autoconf AS_IF 宏编写 if 结构,而不是按字面意思编写;
  • 使用标准的 Autoconf 机制来发出“正在检查...”消息并报告其结果;和
  • 使用标准的 Autoconf 机制输出失败消息和终止。

当然,所有这些都使上述内容变得更加复杂,但也更加灵活和便携。它可能看起来像这样:

AC_ARG_VAR([PYRCC],[The name or full path of pyrcc. Version 5 is required.])

# ...

AC_PROG_GREP
AC_CHECK_PROGS([PYRCC],[pyrcc5 pyrcc],[])
AS_IF([test "x${PYRCC}" = x],[AC_MSG_ERROR([Required program pyrcc was not found])])

# ...

AC_MSG_CHECKING([whether ${PYRCC} has an appropriate version])
AS_IF([! pyrcc -version | grep pyrcc5 >/dev/null 2>/dev/null],[
  AC_MSG_RESULT([no])
  AC_MSG_ERROR([pyrcc version 5 is required,but ${PYRCC} is a different version])
],[
  AC_MSG_RESULT([yes])
])

除了可移植性和传统的 Autoconf 进度消息外,这还使构建器能够将特定的 pyrcc 可执行文件指定为 configure(通过在其环境中设置变量 PYRCC), configure 的帮助文本中的文档,并将 PYRCC 作为 make 变量导出。

哦,我也以 pyrcc 的名义偷偷检查了 pyrcc5,虽然我不知道这在实践中是否有用。

最终结果看起来不再像我首先提供的 shell 脚本片段,我承认。但同样,纯 shell 脚本片段可以原样使用,而且完全自动没收的版本是直接从纯脚本派生而来的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。