как проверить версию программы из скрипта autoconf configure.ac - PullRequest
0 голосов
/ 22 апреля 2020

Я потратил полдня, пытаясь выяснить, выполним ли мой вопрос или нет. Существует MACRO для проверки доступности программы. Например, R:

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

Существует ли стандартный способ проверки найденной версии R? Например, я пытаюсь основать свой проект на R 3.6.x. Этот вопрос может относиться к любой программе на ваш вкус. Я мог бы выяснить это с помощью сценария оболочки:

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

Приведенный выше фрагмент кода вернет версию R. Предположим, я могу как-то получить это далеко внутри configure.a c, как мне убедиться, что rversion> 3.5. Является ли ax_compare_version способом go? Ниже мой тестовый сегмент. Немного ошибаюсь. Мой общий вопрос: мой способ выполнения этой приемлемой практики?

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 или в какое-либо место в системе ,

1 Ответ

2 голосов
/ 23 апреля 2020

Конечно. Основная идея состоит в том, чтобы превратить его в выражения, которые скрипт оболочки может оценить / что-то, что вы можете запустить из `configure. Ниже приведены три разных подхода.

Первый - это несколько базовых c тестов для g++, которые мы имели в пакете RQuantLib configure.a c в течение многих лет (да, это много лет, которые мы проверяли на 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 , где мы собираем что-то, чтобы версия всплывала как истинная / ложное выражение:

## 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

И я думаю, что я сделал что-то совсем недавно, где я сделал его package_version объектом в R, чтобы можно было сравнивать --- вот это из 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  

Надеюсь, это даст вам некоторые идеи.

...