如何在./configure中检查haskell软件包版本?

时间:2011-10-04 09:29:51

标签: haskell configure autoconf

如何告诉configure检查给定Haskell包的version >= x.y

谢谢,

5 个答案:

答案 0 :(得分:5)

使用cabalvchk:http://hackage.haskell.org/package/cabalvchk-0.2

例如,要验证parsec的版本是> = 0.4,您可以发出:

$ cabalvchk parsec '>= 0.4'

如果满足版本约束,则返回码为零,否则返回非零。版本约束可以是cabal理解的任何内容。可选的第三个参数可以是非空的,以请求详细输出。

答案 1 :(得分:3)

我对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。如果您想了解更多相关信息,请打开一个单独的问题。

答案 2 :(得分:1)

也许更好的问题是:你呢?检查特定的版本号是autoconf世界中最重要的参数之一,辩论的一般赢家是说你永远不应该这样做的一方。您需要Haskell的哪些特定功能?测试。作为一个简单的例子(与haskell无关),假设您的程序使用inotify,因此您希望configury测试它是否可用。您可以测试内核版本是否为> 2.6.13但是当Joe试图在2.4.xx版本上构建你的程序时,他已经修改了inotify功能,他会非常恼火,因为你的程序无法工作。

你不关心Haskell> x.y可用。相反,你想要的Haskell的一些特定功能是在x.y中引入的;测试该功能。

答案 3 :(得分:0)

使用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

答案 4 :(得分:0)

尝试这样的事情:

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