默认情况下,我在没有 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
没有意义。为此,您必须使用 stack2nix
或 stackage2nix
之类的工具。
所以要回顾一下。上面的 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/