如何在堆栈中使用不同的 ghc 构建?

How to use different ghc builds with stack?

我想要不同的、非 ABI 兼容的、相同版本的 GHC 构建,并在不同的项目中使用它们。

(在我的例子中,构建之间的区别是整数简单与 gmp。)

this issue 中的注释显示了如何将自定义风格的 ghc 添加到 stack-setup-2.yaml。但是我如何指定在每个特定案例或项目中使用哪个 ghc 构建?

即我正在寻找一个(更好的是,两个):

  1. 能够在 stack.yaml 中指定是使用 integer-simple 还是 gmp 构建。
  2. 能够在 stack build 时间指定要生成的版本。

您可以使用 the ghc-variant option--ghc-variant 标志。

如果您使用 Windows 并使用默认值 stack-setup-2.yaml,使用 --ghc-variant integersimple 构建应该使用与使用 --ghc-variant standard.[=16= 不同的 GHC ]

对于想要尝试不同的 ghc 版本而不是完全不同的构建的人来说,--compiler 标志很有用 https://docs.haskellstack.org/en/stable/yaml_configuration/#compiler

另请查看此答案 ,其中讨论了 --ghc-variant 标志

为了完整起见,这里是关于这些标志的实现的讨论:

知道这一点很有用,因为这个 Whosebug 问题是 google 结果中的第一页。

其他答案都不错,但这里有一个完整的示例,因此您不必从提供的链接中拼凑起来。

将此放入您的 stack.yaml 文件中:

resolver: lts-12.20

setup-info:
  ghc:
    linux64-custom-dwarf:
      8.4.4:
        url: "https://downloads.haskell.org/~ghc/8.4.4/ghc-8.4.4-x86_64-deb9-linux-dwarf.tar.xz"
        sha256: f9cac6e402c71d7251f2e22f412fb4abd72c64f34481a1e548cd7f6ff2352a07

ghc-variant: dwarf

setup-info 部分,我提供了 bindist 的路径、校验和(可选但推荐用于重现性),然后说我想将此自定义 ghc 与 ghc-variant: dwarf 一起使用(它似乎通过将单词附加到 linux64-custom-).

来将其中的 dwarf 变成 linux64-custom-dwarf

如果你想跨项目共享那个自定义ghc的定义,你也可以把setup-info部分放到$HOME/.stack/config.yaml.


GHC 黑客注意事项:如果您想破解 ghc 本身并使用经常更新的 GHC 快速迭代您的包,那么 this approach 您只需覆盖 GHC 二进制文件而不是声明一个完全构建的 bindist更好(因为您不必在每次重新编译时都构建绑定器)。

对于再次需要它的人,我将留下一个使用 Stack(Alpine 上的 GHC 8.6.5)安装 musl bindist 的方法——作为另一个 example/variation OP 问了什么。

首先,找到一个 bindist(二进制分布),例如https://github.com/commercialhaskell/ghc/releases
我需要选择 musl libc 变体。

将其填入 ~/.stack/config.yaml 中的 setup-info 部分并指定 ghc-variant:

setup-info:
  ghc:
    linux64-custom-musl-ncurses6:
      8.6.5:
        url: "https://github.com/commercialhaskell/ghc/releases/download/ghc-8.6.5-release/ghc-8.6.5-x86_64-unknown-linux-musl.tar.xz"
        content-length: 140167348
        sha1: 3ce575af840e886ba5d2641f68577ace38ac21c6
        sha256: ec6d0417822c3bfafc7aea0b0402294901231bc5d72dd17a2b849e3f44850695

ghc-variant: musl

这样,安装 GHC 变体就很简单了:

stack setup \
    --install-ghc \
    --resolver=$RESOLVER_CHOICE \
    --ghc-variant musl \
    8.6.5