Как проверить наличие версий пакета haskell./настроить?
Как я могу сказать configure, чтобы проверить version >= x.y
данного пакета Haskell?
спасибо,
5 ответов
использовать cabalvchk:http://hackage.haskell.org/package/cabalvchk-0.2
например, чтобы проверить, что версия parsec >= 0.4, вы можете выдать:
$ cabalvchk parsec '>= 0.4'
код возврата будет равен нулю, если ограничение версии выполнено и не равно нулю в противном случае. Ограничение версии может быть любым, что понимает cabal. Необязательный третий параметр может быть пустым для вывода подробного отчета.
Я мало знаю о configure
; можете ли вы попросить его выполнить определенную команду? Если так, то ghc-pkg latest
должны помочь вам. Например, вот запуск на моей машине для zlib
пакет:
% ghc-pkg latest zlib
zlib-0.5.3.1
% ghc-pkg latest --global zlib
zlib-0.5.3.1
% ghc-pkg latest --user zlib
ghc-pkg: cannot find package zlib
zsh: exit 1 ghc-pkg latest --user zlib
на --global
должны использоваться для общесистемных установок, и никакого флага вообще для пользовательских установок. The --user
флаг должен использоваться только, когда вы хотите проверить, имеет ли пользователь локальной установки пакета (который может переопределить глобальный один.)
если у вас нет причин не делать этого, я рекомендую ditching configure
в пользу cabal
. Для cabal
, решение здесь в первую очередь cabal init
в каталоге вашего проекта, затем проверьте, что у вас есть строка, подобная этой в .cabal
созданный файл:
build-depends: zlib >= 0.5
на cabal
toolchain является стандартом для проектов Haskell (потому что он автоматизирует и упрощает многие вещи, включая погоню за зависимостями). Вы также можете спросить cabal
для вызова configure
Если есть другие зависимости. Откройте отдельный вопрос, если вы хотите получить дополнительную информацию об этом.
возможно, лучший вопрос: Должны ли вы? Проверка конкретного номера версии - один из самых больших аргументов в мире autoconf, и общий победитель дебатов-сторона, которая говорит, что вы никогда не должны этого делать. Какая особенность Haskell вам нужна? Проверка на это. В качестве простого примера (не связанного с haskell) предположим, что ваша программа использует inotify, поэтому вы хотите, чтобы конфигурация проверяла, доступна ли она. Вы можете просто проверить, является ли версия ядра > 2.6.13, но тогда, когда Джо пытается построить вашу программу на своем 2.4.xx версия, в которой он исправил возможность inotify, он будет очень раздражен тем, что ваша программа не будет работать.
вам все равно, если Haskell > x.y доступен. Вместо этого есть определенная особенность Haskell, которую вы хотите, чтобы она была введена в x.y; проверьте эту функцию.
используя ghc-pkg list
, вы можете получить список установленных версий пакета по возрастанию. Надеюсь, вы сможете отфильтровать этот список в поисках совпадения. (Я не знаю, как это сделать с configure
, к сожалению).
$ ghc-pkg list yesod
/home/ahammar/.haskell/lib/ghc-7.0.2/package.conf.d
/home/ahammar/.ghc/x86_64-linux-7.0.2/package.conf.d
yesod-0.8.2.1
yesod-0.9.1
yesod-0.9.2.2
попробуйте что-то вроде этого:
# Find ghc-pkg, so we can do version checks
AC_ARG_VAR([GHC_PKG], [Path to ghc-pkg])
AC_PATH_PROG([GHC_PKG], [ghc-pkg])
AS_IF([test -z "$GHC_PKG"], [AC_MSG_ERROR([Cannot find ghc-pkg.])])
# Check that the package actually exists
AC_MSG_CHECKING([for Haskell package foo])
AS_IF([$GHC_PKG latest foo > /dev/null 2>&1],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_ERROR([Cannot find foo])])
# Check its version
AC_MSG_CHECKING([if foo is new enough])
foo_ver=`$GHC_PKG latest foo | sed 's/^foo-//'`
# At this point you have the version of foo and the minimum version you want.
# The rest of the test is pretty easy to write, use cut and test to compare the
# version numbers. If it's new enough, AC_MSG_RESULT([yes]).
# If not, AC_MSG_RESULT([no]) and AC_MSG_ERROR([foo is not new enough.])