我对Nix感兴趣了一段时间,我想我最终会尝试用它来启动一个新的haskell项目.
我从目录结构开始
project.cabal
src/Lib.hs
Run Code Online (Sandbox Code Playgroud)
cabal文件具有以下内容:
name: project
version: 0.1.0.0
build-type: Simple
license: MIT
cabal-version: >= 1.18
library
exposed-modules: Lib
build-depends: base < 5
hs-source-dirs: src
default-language: Haskell2010
Run Code Online (Sandbox Code Playgroud)
和Lib.hs有
module Lib where
hello :: Int -> IO ()
hello x = putStrLn (show x)
Run Code Online (Sandbox Code Playgroud)
如您所见,它非常简单.当我执行时cabal build,它似乎很高兴.请注意,我无论如何都不是哈斯克尔专家,所以我可能会在这里犯一些初学者错误.
要使用Nix进行构建,我一直在阅读https://github.com/Gabriel439/haskell-nix来获取我的信息.我执行cabal2nix . > default.nix以获取我的cabal文件的Nix版本.然后我创建了一个release.nix文件来实际构建它.这两个文件的内容如下:
default.nix
{ mkDerivation, base, stdenv }:
mkDerivation {
pname = "project";
version = "0.1.0.0";
src = ./.;
libraryHaskellDepends = [ base ];
license = stdenv.lib.licenses.mit;
}
Run Code Online (Sandbox Code Playgroud)
release.nix
let
pkgs = import <nixpkgs> { };
in
pkgs.haskellPackages.callPackage ./default.nix { }
Run Code Online (Sandbox Code Playgroud)
在这之后,我执行nix-build release.nix并回来了
these derivations will be built:
/nix/store/p481alkpm89712n3hnwai0nxhmjrm8b2-project-0.1.0.0.drv
building path(s) ‘/nix/store/yszy2a6wd88pf6zlw0nw99l5wzvc0s9x-project-0.1.0.0’
setupCompilerEnvironmentPhase
Build with /nix/store/d5w12a8bprd2518xnqp1cwh3rbjiagyx-ghc-8.0.1.
unpacking sources
unpacking source archive /nix/store/fsn4b9w54h2jdpv546nwvy82vnkszl1w-project
source root is project
patching sources
compileBuildDriverPhase
setupCompileFlags: -package-db=/tmp/nix-build-project-0.1.0.0.drv-0/package.conf.d -j4 -threaded
[1 of 1] Compiling Main ( /nix/store/4mdp8nhyfddh7bllbi7xszz7k9955n79-Setup.hs, /tmp/nix-build-project-0.1.0.0.drv-0/Main.o )
Linking Setup ...
...
...
Building project-0.1.0.0...
Preprocessing library project-0.1.0.0...
dist/build/Lib_o_split: getDirectoryContents: does not exist (No such file or
directory)
builder for ‘/nix/store/p481alkpm89712n3hnwai0nxhmjrm8b2-project-0.1.0.0.drv’ failed with exit code 1
error: build of ‘/nix/store/p481alkpm89712n3hnwai0nxhmjrm8b2-project-0.1.0.0.drv’ failed
Run Code Online (Sandbox Code Playgroud)
这当然不好.我在这里犯了什么错误?我已经成功地进行了类似的尝试,即构建可执行文件而不是库,因此我怀疑它与此有关.我正在关注的github repo也使用了可执行文件.
我相信默认情况下,nix 与普通的 cabal 不同,将尝试根据 cabal 的手册使用分割对象功能构建任何 Haskell 项目:
--启用分割对象
构建库时使用 GHC -split-objs 功能。这允许使用该库的可执行文件仅链接它们使用的位而不是整个库,从而减少了它们的最终大小。缺点是构建库需要更长的时间并且使用更多的内存。
我不太确定为什么这可能会在您的系统上失败,但根据您的 nixpkgs 版本,可以通过添加以下之一来禁用:
enableSplitObjs = false;
enableDeadCodeElimination = false;
到推导。
有关其他属性/选项的列表,您可以参考https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix不幸的是,我不知道任何官方文档更详细地描述了这些内容。