默认情况下,我构建的项目没有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?
答案 0 :(得分:0)
不幸的是,堆栈nix集成相当倒退。它没有使用nix来构建你的包(尽管有非常误导的buildStackPackage
),只是为了创建一个GHC和本机依赖的环境。您必须使用stack
本身来构建项目,并且由于stack
将运行cabal
,它仍应使用该标志。堆栈nix集成将不生成.nix
文件,其中依赖项由堆栈解析,因此您无法使用nix-build
构建项目,并且那里有nix-shell
输入stack2nix
没有意义。您必须使用stackage2nix
或shell.nix
之类的工具。
所以回顾一下。上面的stack.yaml
看起来不错。将其添加到您的nix:
shell-file: shell.nix
:
stack --nix --flag myproj:dynamic
用堆栈构建项目:
nix
这应该像往常一样使用标志构建项目,但是使用来自${ProjDirPath}
的GHC和zlib。