2017-04-17 5 views
5

Ich habe mich schon eine Weile für Nix interessiert und dachte mir, ich würde es endlich versuchen, um ein neues Haskell-Projekt zu starten.Erstelle eine einfache Haskell-Bibliothek mit nix

ich mit der Verzeichnisstruktur begann

project.cabal 
src/Lib.hs 

Wo die Kabalen-Datei den folgenden Inhalt hat:

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 

und Lib.hs hat

module Lib where 

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

Wie Sie sehen können, Es ist ganz einfach. Wenn ich cabal build ausführe, scheint es glücklich zu sein. Beachte, dass ich kein Hakkell-Experte bin, also mache ich hier vielleicht einen Anfängerfehler.

Um dies mit Nix zu bauen, habe ich https://github.com/Gabriel439/haskell-nix gelesen, um meine Informationen zu erhalten. Ich habe cabal2nix . > default.nix ausgeführt, um eine Nix-Version meiner Cabal-Datei zu erhalten. Ich habe dann eine release.nix Datei erstellt, um es tatsächlich zu bauen. Der Inhalt der beiden Dateien sind wie folgt:

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 { } 

Nachdem Sie das getan, ich nix-build release.nix ausgeführt und bekam zurück

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 

Was natürlich nicht gut ist. Welchen Fehler mache ich hier? Ich war in einem ähnlichen Versuch erfolgreich, der eine ausführbare Datei anstelle einer Bibliothek erstellte, also vermute ich, dass es etwas damit zu tun hat. Das Github-Repo, dem ich folgte, verwendete auch eine ausführbare Datei.

+0

Bit einer Aufnahme im Dunkeln, aber fügt 'enableSplitObjs = false;' zu Ihrer default.nix Datei Hilfe überhaupt hinzu? Wenn der Fehler mit "error: assertion failed at.." ausfällt, können Sie stattdessen 'enableDeadCodeElimination = false;' versuchen? – ppb

+0

@ppb 'enableSplitObjs = false;' hat es korrekt erstellt. Warum repariert das die Dinge? Gibt es einen Ort, an dem alle Haskell Nix Optionen dokumentiert sind? Auch, wenn Sie dies zu einer Antwort machen, werde ich es akzeptieren. – phil

Antwort

0

ich standardmäßig nichts, im Gegensatz zu Normal Kabale glaube, versuchen, ein Haskell-Projekt erstellen Split Objekte mithilfe der Funktion, 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.

Ich bin mir nicht sicher, warum das auf sein Versäumnis kann Du System, aber je nach nixpkgs Version kann durch Hinzufügen eines deaktiviert werden:

enableSplitObjs = false;

enableDeadCodeElimination = false;

zur Ableitung.

Eine Liste anderer Attribute/Optionen finden Sie unter https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix. Leider sind mir keine offiziellen Dokumente bekannt, die diese genauer beschreiben.

Verwandte Themen