2017-04-17 95 views
5

我一直对Nix感兴趣,我想我最终会尝试使用它来启动一个新的haskell项目。使用nix构建简单的haskell库

我开始了与目录结构

project.cabal 
src/Lib.hs 

凡阴谋文件具有以下内容:

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 

和Lib.hs具有

module Lib where 

hello :: Int -> IO() 
hello x = putStrLn (show x) 

正如你所看到的,这很简单。当我执行cabal build时,它似乎很高兴。请注意,我不是任何方式的haskell专家,所以我可能会在这里犯一些初学者的错误。

要与尼克斯建立这个,我一直在阅读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; 
} 

release.nix

let 
    pkgs = import <nixpkgs> { }; 
in 
    pkgs.haskellPackages.callPackage ./default.nix { } 

这样做后,我执行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 

当然哪个不好。我在这里犯了什么错误?我在一个类似的尝试中取得了成功,那就是构建一个可执行文件而不是一个库,所以我怀疑它与此有关。我跟随的github回购也使用了可执行文件。

+0

在黑暗中一枪的位,但确实添加'enableSplitObjs = false;'到你的default.nix文件的帮助呢?如果错误:'assertion'失败,那么你可以尝试'enableDeadCodeElimination = false;'而不是? – ppb

+0

@ppb'enableSplitObjs = false;'使它正确构建。为什么会修复这些问题?有没有一个地方可以记录所有的haskell nix选项?另外,如果你让这个答案,我会接受它。 – phil

回答

0

我相信,在默认情况下尼克斯,不像普通的阴谋,将尝试使用拆分对象特征来构建任何Haskell的项目,per cabal's manual

--enable-split-objs

Use the GHC -split-objs feature when building the library. This reduces the final size of the executables that use the library by allowing them to link with only the bits that they use rather than the entire library. The downside is that building the library takes longer and uses considerably more memory.

我也不太清楚,为什么可以上你的失败系统,但根据您的nixpkgs版本可以通过添加一个被禁用:

enableSplitObjs = false;

enableDeadCodeElimination = false;

来推导。

有关其他属性/选项的列表,您可以参考https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix不幸的是,我不知道任何官方文档更详细地描述这些属性。