【发布时间】:2011-10-04 09:29:51
【问题描述】:
我如何告诉 configure 检查给定 Haskell 包的 version >= x.y?
谢谢,
【问题讨论】:
标签: haskell configure autoconf
我如何告诉 configure 检查给定 Haskell 包的 version >= x.y?
谢谢,
【问题讨论】:
标签: haskell configure autoconf
使用 cabalvchk:http://hackage.haskell.org/package/cabalvchk-0.2
例如,要验证 parsec 的版本是否 >= 0.4,您可以发出:
$ cabalvchk parsec '>= 0.4'
如果满足版本约束,则返回代码为零,否则为非零。版本约束可以是 cabal 理解的任何东西。可选的第三个参数可以是非空白以请求详细输出。
【讨论】:
我对@987654321@了解不多;你能要求它运行一个特定的命令吗?如果是这样,那么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。如果您想了解更多信息,请打开一个单独的问题。
【讨论】:
I need version >= x.y 的说法。使用configure的原因是haskell脚本是一个主要用python编写的更大程序的一部分,所有的依赖都已经通过configure管理了。
也许更好的问题是:你应该吗?检查特定版本号是 autoconf 世界中的重要论据之一,而辩论的一般赢家是说你永远不应该这样做的一方。您需要 Haskell 的哪些特定功能?对此进行测试。作为一个简单的例子(与 haskell 无关),假设您的程序使用 inotify,因此您希望配置测试它是否可用。您可以只测试内核版本是否 > 2.6.13,但是当 Joe 尝试在他已修补 inotify 功能的 2.4.xx 版本上构建您的程序时,他会非常恼火,因为您的程序不会工作。
你不在乎 Haskell > x.y 是否可用。相反,在 x.y 中引入了一些您想要的 Haskell 特定功能;测试该功能。
【讨论】:
使用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.])
【讨论】: