2011-10-04 36 views

回答

5

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

例如,验证秒差距的版本为> = 0.4,你可以发出:

$ cabalvchk parsec '>= 0.4' 

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

+0

这确实很酷,即使它意味着我必须引入新的依赖关系。 –

+0

谢谢!从长远来看,我可以请求cabal工具人员直接将此功能添加到cabal中,这样可以减少依赖性,但是这种额外的依赖性对于您的直接需求是必需的。 –

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。如果您想了解更多关于此的信息,请另外打个问题。

+0

感谢您的回答。我已经使用ghc-pkg,但我不知道说'我需要版本> = x.y'。使用'configure'的原因是haskell脚本是主要用python编写的更大程序的一部分,所有的依赖关系已经通过configure进行管理。 –

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

也许更好的问题是:你应该?检查特定的版本号是autoconf世界的重要参数之一,辩论的总冠军是说你永远不应该这样做的一面。你需要什么Haskell特性?测试一下。作为一个简单的例子(与haskell无关),假设你的程序使用inotify,所以你想让configury测试它是否可用。你可以测试内核版本是否大于2.6.13,但是当Joe试图在他的2.4.xx版本上构建你的程序时,他已经修复了inotify的能力,他会非常烦恼你的程序不会工作。

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

相关问题