如何从 autoconf 脚本中检查程序的版本 configure.ac

how to check the version of a program from inside autoconf script configure.ac

我花了半天时间想弄清楚我的问题是否可行。有一个宏用于检查程序的可用性。例如 R:

AC_PATH_PROG([R], [R], [nor])

是否有检查找到的 R 版本的标准方法?例如,我正在尝试将我的项目建立在 R 3.6.x 的基础上。这个问题可以适用于您喜欢的任何程序。我可以用 shell 脚本找出答案:

R --version | grep "R version" | cut -d ' ' -f 3

上面的 snipit 将 return R 的版本。假设我可以在 configure.ac 中以某种方式达到这一点,我如何确保 rversion > 3.5。 ax_compare_version 是正确的选择吗?以下是我的测试片段。有点不对劲。我的一般问题:我的做法是否可以接受?

AC_PATH_PROG([R], [R], [nor])
if test "$R" = nor; then
   AC_MSG_ERROR([No R installed in this system])
fi
RVERSION=`$R --version | grep "R version" | cut -d ' ' -f 3`
AX_COMPARE_VERSION([$RVERSION], [ge], [3.6.0], AC_MSG_NOTICE([R $RVERSION good]), AC_MSG_ERROR([R $RVERSION too low]))

 checking for R... /usr/local/bin/R
 configure: R 3.6.3 good

注意:要使用 AX_COMPARE_VERSION,您必须将 m4 文件复制到您的项目 m4 目录或某个系统位置。

当然可以。一般的想法是把它变成表达式 shell 脚本可以评估的东西/你可以 运行 来自`configure.以下是三种不同的方法。

首先是 g++ 的一些基本测试,我们在 RQuantLib configure.ac 包中进行了多年(是的,我们测试了 许多g++-3.* ...)。这里的主要要点是通配符比较

AC_PROG_CXX
if test "${GXX}" = yes; then
    gxx_version=`${CXX} -v 2>&1 | grep "^.*g.. version" | \
               sed -e 's/^.*g.. version *//'`
    case ${gxx_version} in
        1.*|2.*)
         AC_MSG_WARN([Only g++ version 3.0 or greater can be used with RQuantib.])
         AC_MSG_ERROR([Please use a different compiler.])
        ;;
    4.6.*|4.7.*|4.8.*|4.9.*|5.*|6.*|7.*|8.*|9.*|10.*)
         gxx_newer_than_45="-fpermissive"
    ;;
    esac
fi

这是来自 RProtoBuf 的另一个版本,我们编译了一些东西,使版本冒泡为 true/false 表达式:

## also check for minimum version
AC_MSG_CHECKING([if ProtoBuf version >= 2.2.0])
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <google/protobuf/stubs/common.h>
int main() {
   if (GOOGLE_PROTOBUF_VERSION >= 2001000) {
        exit (0);
   } else {
        exit(1);
   }
}
]])],
[pb_version_ok=yes],
[pb_version_ok=no],
[pb_version_ok=yes])
if test x"${pb_version_ok}" == x"no"; then
    AC_MSG_ERROR([Need ProtoBuf version >= 2.2.0])
else
    AC_MSG_RESULT([yes])
fi

我想我最近做了一些事情,我把它变成了 R 中的一个 package_version 对象,这样人们就可以比较了——这里是来自 RcppRedis——这又回到了配置为 true/false.

## look for (optional !!) MsgPack headers
## RcppMsgPack on CRAN fits the bill -- but is a soft dependency
AC_MSG_CHECKING([for RcppMsgPack])
## Check if R has RcppMsgPack
$("${R_HOME}/bin/Rscript" --vanilla -e 'hasPkg <- "RcppMsgPack" %in% rownames(installed.packages()); q(save="no", status=if (hasPkg) packageVersion("RcppMsgPack") >= "0.2.0" else FALSE)')
if test x"$?" == x"1"; then
    AC_MSG_RESULT([yes])
    msgpackincdir=$("${R_HOME}/bin/Rscript" --vanilla -e 'cat(system.file("include", package="RcppMsgPack"))')
    msgpack_cxxflags="-I${msgpackincdir} -DHAVE_MSGPACK"
    AC_MSG_NOTICE([Found RcppMsgPack, using '${msgpack_cxxflags}'])
else
    AC_MSG_RESULT([no])
    AC_MSG_NOTICE([Install (optional) RcppMsgPack (>= 0.2.0) from CRAN via 'install.packages("RcppMsgPack")'])
fi  

我希望这能给你一些想法。