【问题标题】:How can I build a Haskell program with optional dependencies?如何构建具有可选依赖项的 Haskell 程序?
【发布时间】:2021-08-15 17:26:53
【问题描述】:

我正在为自己的研究编写一些模拟软件,并制作了一个可视化工具作为项目的一部分。这在我的工作站上运行得非常好,我可以用它来监视正在运行的模拟,或者稍后可视化日志数据。我已经明白了,我现在需要在集群上运行模拟,而OpenGL 既不可用,也不需要实际模拟。但是,由于该项目依赖于OpenGL,因此不会构建。

现在显然我可以创建一个没有 OpenGL 部分的单独分支,这可能是我的短期解决方案,但维护起来似乎有点麻烦。

我不确定最好的长期解决方案是什么。理想情况下,如果OpenGL 可用,我希望有一个可选地构建可视化部分的设置,如果没有,则跳过它。 stack(或cabal)是否支持这种类型的东西?

另一种选择是将可视化部分设为不同的项目,但这会使监控正在运行的模拟变得更加困难。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您可以使用 flags 根据给定的标志编译项目:docs.haskellstack.org/en/stable/yaml_configuration/#flags
  • 你必须在目标机器上构建吗?你不能在不同的机器上构建和运行吗?
  • 我真的很想知道一个合适的解决方案。 flags 可以使用,但是很繁琐。
  • 为什么使可视化成为一个不同的项目会更加困难(除了必须管理两个项目的苦差事)?无 gui 项目可以提供独立的无 GUI 可执行文件和库。可视化项目可以依赖于库并添加 GUI 功能。
  • @danidiaz 这最终可能是最干净的选择,但我不确定。大部分计算代码都使用一种称为 Futhark 的语言,它可以编译 OpenCL、CUDA 和 C,并将其用于低级别的东西。我有一个生成 Haskell FFI 代码的程序,但有些细节取决于后端。我选择的后端取决于机器,所以我希望能够将所有内容编译为一个包。目前,我已经使用一个小的 shellscript 将构建过程自动化,它将 Futhark 代码编译到所选后端,生成 FFI 代码,然后构建 Haskell 程序。

标签: haskell build dependency-management cabal haskell-stack


【解决方案1】:

有几种方法可以做到这一点。

第一个也是最简单的方法是将您的代码分成两个不同的包。一种是不依赖 OpenGL 的代码,另一种是使用 OpenGL 的可视化工具。如果没有理由不能这样做,这是迄今为止最好的选择。

如果你不能这样做,那么你可以使用 Cabal 标志,正如评论中提到的那样。带有标志的 cabal 文件的示例是:

name:        mylibname
description: some description

...

flag opengl
  description: build opengl support
  default:     False

library
  ...
  build-depends: base, containers, ...
  if flag(opengl)
    build-depends: OpenGL
    cpp-options: -DWITH_OPENGL
  ...

现在在您的源文件中,您可以这样做:

{-# LANGUAGE CPP #-}

...

#ifdef WITH_OPENGL
    someOpenGLCode
#endif

默认情况下,您的构建不包含 OpenGL 部分。您可以使用 cabal 或 stack 来请求使用 OpenGL 构建包。在 cabal 中,您可以在命令行中使用 -f--flags 选项来 either do so,或者在 cabal.project 文件中使用 flags: 字段。其他人已经链接到一些类似的堆栈文档(尽管我不太了解堆栈以评论其正确性)

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 2018-08-22
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多