默认情况下,我在没有 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?

最佳答案

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

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

nix:
    shell-file: shell.nix

并使用堆栈构建项目:
stack --nix --flag myproj:dynamic

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

关于haskell - 如何从 shell.nix 为堆栈项目设置 cabal 标志?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48239541/

10-13 04:16