【问题标题】:How to check for haskell package versions in ./configure?如何在 ./configure 中检查 haskell 包版本?
【发布时间】:2011-10-04 09:29:51
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: haskell configure autoconf


    【解决方案1】:

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

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

    $ cabalvchk parsec '>= 0.4'
    

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

    【讨论】:

    • 这确实很酷,即使这意味着我必须引入一个新的依赖项。
    • 谢谢!从长远来看,我可以请求 cabal 工具人员将此功能直接添加到 cabal 中,这将减少依赖关系,但是这种额外的依赖关系对于您的即时需求是必要的。
    【解决方案2】:

    我对@9​​87654321@了解不多;你能要求它运行一个特定的命令吗?如果是这样,那么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。如果您想了解更多信息,请打开一个单独的问题。

    【讨论】:

    • 感谢您的回答。我已经使用了 ghc-pkg,但我不知道I need version >= x.y 的说法。使用configure的原因是haskell脚本是一个主要用python编写的更大程序的一部分,所有的依赖都已经通过configure管理了。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案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>&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.])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2014-10-29
          • 2014-02-21
          • 2013-05-12
          • 2021-11-25
          • 2011-08-31
          • 1970-01-01
          相关资源
          最近更新 更多