如何告诉configure检查给定Haskell包的version >= x.y
?
谢谢,
答案 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.])