Как проверить наличие версий пакетов haskell в ./configure?

#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.])