【问题标题】:Is it possible to use cmake for Haskell projects?是否可以将 cmake 用于 Haskell 项目?
【发布时间】:2011-05-11 19:34:42
【问题描述】:

我正在计划一个用 Haskell 编写的项目,也许有些部分也是用 C 语言编写的。对于构建系统,我决定不采用 Haskell 程序 cabal 的常见选择,主要是因为我想了解如何使用其他语言构建程序。

我听说过 CMake,我认为它是一个非常酷的产品。虽然我不知道如何使用它,但我想在该项目中使用 CMake,只是为了了解它是如何工作的。谷歌搜索没有透露任何关于如何将 cmake 与 haskell 一起使用的事实,而且我阅读的所有教程都相当混乱。是否有可能,如果有,如何使用 CMake 编译用 Haskell 编写的项目?

【问题讨论】:

  • 嘿,您是否以在 CMake 中包装 cabal 结束?如果是这样,你会分享代码吗?
  • @arrowdodger 实际上我并没有开始这个项目,因为我的管道中有很多其他的东西。

标签: haskell build-process cmake cabal


【解决方案1】:

您当然可以使用 CMake 来构建 Haskell 应用程序和库。为此,您将需要复制 Cabal 所做的大部分工作,这将是有益的,但也很耗时。

我建议使用 cabal build -v 查看 Cabal 发出的命令,然后将它们转录成 CMake 形式。

或者,使用 CMake 在 Haskell 代码上调用 cabal——这可能不会那么烦人。

【讨论】:

    【解决方案2】:

    我已经为 cabal 包编写了简单的 cmake 包装器并将其放在这里:

    http://bitbucket.org/arrowd/cmake-findcabal(使用“获取源”按钮下载)。

    目前它在 Windows 和 FreeBSD 上为我工作,但我仍计划稍后对其进行改进。我已经在这里回答了这个问题,以便人们可以在谷歌中找到它,就像我一样。

    【讨论】:

      【解决方案3】:

      虽然您当然可以使用通用构建工具直接构建 Haskell 代码,但结果更难维护,更难与社区分享,更难在其之上构建与在 Cabal 之上构建时相比。

      对于构建系统,我决定不采用 Haskell 程序 cabal 的常见选择,主要是因为我想了解如何使用其他语言构建程序。

      我理解这句话背后的意图,因为您想查看构建过程的所有单独步骤,但换一种方式阅读,通过避免 cabal,您看不到 Haskell 中的程序是如何构建的,您看到的是重建社区提供的工具是多么痛苦。

      我建议按照唐的建议去做。查看 cabal -v 的输出以在您的特定编译器(可能是 ghc)下构建并在 CMake 中复制这些步骤。

      但是,一旦您了解了这些步骤,我会认真考虑采用这些知识并返回 Cabal。如果只是让它处理支持多个编译器、平台、包管理等问题。从而减少构建系统的脆弱性,并更容易打包和共享您的工作。

      也就是说,除了 ghc 本身,我想不出有一个非 Cabal 构建的包或二进制文件被社区积极使用。

      不过,我希望您在进入构建过程的内部过程中好运!

      【讨论】:

        【解决方案4】:

        我重写了@arrowdodger 的初始工作,在此过程中修复了一些存在的错误:

        • 由于路径硬编码,无法从项目内 cmake/ 目录中使用
        • 出现了一些 Fortran/CXX 变量(导致错误行为)
        • 可以删除许多与 Haskell 无关的代码,根据 CMake 随附的较新版本的 C/CXX 语言文件添加其他代码

        可以在以下位置找到存储库:

        https://github.com/kvanberendonck/cmake-haskell

        对我来说工作得很好,我可以从 ninja 中获得的构建速度令人印象深刻。

        【讨论】:

        • 能否再次提供您的代码?
        • @TomHuntington 抱歉,我不敢说几个月前我在清除 50 多个 repos 时删除了这个 repo,而且它只是超出了能够为你恢复它的门槛。带有 cabal/stack 的 C/CXX 文件的工具现在好多了……请参阅上面 ekmett 的评论。
        猜你喜欢
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多