如何从shell.nix为堆栈项目设置cabal标志?

时间:2018-01-13 11:45:45

标签: haskell cabal haskell-stack nix

默认情况下,我构建的项目没有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。根据{{​​3}}定义,我尝试设置buildPhase,例如

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

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

1 个答案:

答案 0 :(得分:0)

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

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

stack --nix --flag myproj:dynamic

用堆栈构建项目:

nix

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