【问题标题】:How to set cabal flag from shell.nix for stack project?如何从 shell.nix 为堆栈项目设置 cabal 标志?
【发布时间】:2018-01-13 11:45:45
【问题描述】:

默认情况下,我在没有nix 的情况下构建我的项目,并且可执行文件是静态链接的。但是当使用nix 构建时,我想动态链接它。于是我加了一个开关到myproj.cabal

flag dynamic
  description: Build only dynamic binaries
  default: False

executable RunMe
  ghc-options:         -O2 -Wall
  if !flag(dynamic)
    ghc-options: -optl-static -static

现在我可以构建项目了

stack --nix --nix-packages=zlib install --flag myproj:dynamic

为了避免每次都传递命令行选项,我创建了shell.nix

{ghc}:
with (import <nixpkgs> {});
haskell.lib.buildStackProject {
  inherit ghc;
  name = "myproj";
  buildInputs = [ zlib ];
}

现在,我不知道如何将标志从 nix 文件传递​​给 cabal。基于buildStackProject的定义,我尝试设置buildPhase,例如

haskell.lib.buildStackProject {
  ...
  buildPhase = "stack build --flag=myproj:dynamic";
}

但它似乎并没有改变任何东西。如何将标志从 nix 文件传递​​给 cabal?

【问题讨论】:

    标签: haskell cabal haskell-stack nix


    【解决方案1】:

    不幸的是,堆栈 nix 集成相当落后。它不使用 nix 来构建你的包(尽管非常误导buildStackPackage),只是为了创建一个具有 GHC 和本机依赖项的环境。您必须使用stack 本身来构建项目,并且由于stack 将运行cabal,它应该仍然可以使用该标志。堆栈 nix 集成不会生成一个 .nix 文件,其中的依赖项由堆栈解析,因此您无法使用 nix-build 构建项目,并且输入 nix-shell 毫无意义。为此,您必须使用stack2nixstackage2nix 之类的工具。

    所以回顾一下。上面的shell.nix 看起来不错。将此添加到您的stack.yaml

    nix:
        shell-file: shell.nix
    

    并使用堆栈构建项目:

    stack --nix --flag myproj:dynamic
    

    这应该像往常一样使用标志构建项目,但使用来自nix 的 GHC 和 zlib。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多