如何从 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
我希望这能给你一些想法。
我花了半天时间想弄清楚我的问题是否可行。有一个宏用于检查程序的可用性。例如 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
我希望这能给你一些想法。