#haskell #configure #autoconf
#haskell #настроить #автоконфигурация
Вопрос:
как я могу указать configure для проверки version >= x.y
данного пакета Haskell?
Спасибо,
Ответ №1:
Используйте cabalvchk: http://hackage.haskell.org/package/cabalvchk-0.2
Например, чтобы убедиться, что версия parsec равна> = 0.4, вы можете выдать:
$ cabalvchk parsec '>= 0.4'
Код возврата будет равен нулю, если выполняется ограничение версии, и ненулевым в противном случае. Ограничение версии может быть любым, что понимает cabal. Необязательный третий параметр может быть непустым для запроса подробного вывода.
Комментарии:
1. Это действительно круто, даже если это означает, что я должен ввести новую зависимость.
2. Спасибо! В долгосрочной перспективе я мог бы обратиться к специалистам cabal tool с просьбой добавить эту функциональность непосредственно в cabal, что уменьшило бы зависимости, но эта дополнительная зависимость была бы необходима для ваших неотложных нужд.
Ответ №2:
Я мало что знаю 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
Следует использовать для общесистемных установок и вообще не использовать флаг для пользовательских установок. --user
Флаг следует использовать только тогда, когда вы хотите проверить, имеет ли пользователь локальную установку пакета (который может переопределять глобальную).
Если у вас нет причин не делать этого, я рекомендую отказаться configure
от cabal
. Например cabal
, решение здесь заключается в том, чтобы сначала cabal init
зайти в каталог вашего проекта, а затем проверить, есть ли у вас такая строка в .cabal
созданном файле:
build-depends: zlib >= 0.5
Набор cabal
инструментов является стандартом для проектов Haskell (потому что он автоматизирует и упрощает многие вещи, включая поиск зависимостей). Вы также можете запросить cabal
вызов configure
, если есть другие зависимости. Откройте отдельный вопрос, если хотите получить дополнительную информацию об этом.
Комментарии:
1. Спасибо за ответ. Я уже использую ghc-pkg, но я не знаю, как сказать
I need version >= x.y
. Причина использованияconfigure
заключается в том, что скрипты haskell являются частью более крупной программы, в основном написанной на python, и все зависимости уже управляются с помощью configure.
Ответ №3:
Возможно, лучший вопрос: должны ли вы? Проверка определенного номера версии — один из главных аргументов в мире автоконференций, и общий победитель дебатов — это сторона, которая говорит, что вы никогда не должны этого делать. Какая конкретная функция Haskell вам нужна? Проверьте это. В качестве простого примера (не связанного с haskell) предположим, что ваша программа использует inotify, поэтому вы хотите, чтобы конфигурация проверяла, доступна ли она. Вы могли бы просто проверить, является ли версия ядра> 2.6.13, но затем, когда Джо попытается собрать вашу программу на своей версии 2.4.xx, в которой он исправил inotify, он будет очень раздражен тем, что ваша программа не будет работать.
Вам все равно, доступен ли Haskell> x.y . Вместо этого есть какая-то конкретная функция Haskell, которую вы хотите ввести в x.y; протестируйте эту функцию.
Ответ №4:
Используя 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
Ответ №5:
Попробуйте что-то вроде этого:
# 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>amp;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.])