我正在用Python开发一个Qt应用程序。它使用一个需要编译的资源文件。我正在使用自动工具来管理我的项目的编译和安装。
现在,为了使资源文件能够被应用程序使用,它需要使用编译程序(pyrcc)的特定版本进行编译。我可以通过将pyrcc -version的输出放在configure.ac中的一个变量中来获得版本。但是,我不知道如何检查输出中是否存在字符串pyrcc5。如果它不存在,我想告诉用户他的PyRCC程序有错误的版本,并中止configure。
此外,我希望避免程序输出需要额外的变量,而是这样做(伪代码):
if "pyrcc5" not in output of "pyrcc -version":
say "pyrcc has wrong version"
exit 1我该怎么做?
发布于 2021-06-25 05:33:18
在为Autoconf编写configure.ac时,请始终记住,您基本上是在编写shell脚本。Autoconf提供了大量的宏,为您提供了大量的杠杆,但您通常至少可以了解基本的“我如何在Autoconf中做X?”而是问:“在一个可移植的shell脚本中,我将如何做X?”
特别是为了..。
我想避免程序输出需要一个额外的变量,而是这样做(伪代码):
如果"pyrcc5“不在"pyrcc -version”的输出中:例如"pyrcc有错误的版本“退出1
..。用于此类任务的可移植外壳脚本通常使用的工具是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中,但更多的是习惯于
pyrcc和grep,并使用以这种方式发现的版本;AS_IF宏来编写if构造,而不是编写它为发出“检查.”的标准自动#en0#机制。消息和报告其结果;当然,所有这些都使上述工作更加复杂,但也更加灵活和便携。看起来可能是这样的:
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脚本片段,而且完全自动没收的版本也直接从纯脚本派生出来。
https://stackoverflow.com/questions/68118259
复制相似问题