2017-04-17 21 views
5

Przez jakiś czas interesowałem się Nixem i pomyślałem, że spróbuję go wreszcie użyć do uruchomienia nowego projektu haskell.Zbuduj prostą bibliotekę haskell za pomocą nix

zacząłem ze strukturą katalogów

project.cabal 
src/Lib.hs 

Jeżeli plik Cabal ma następującą zawartość:

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 

i Lib.hs ma

module Lib where 

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

Jak widać, to całkiem proste. Kiedy wykonuję cabal build, wydaje się być szczęśliwy. Zauważ, że nie jestem żadnym ekspertem od haskell w żaden sposób, więc być może popełniam tutaj błąd początkowy.

Aby zbudować to za pomocą Nixa, czytałem https://github.com/Gabriel439/haskell-nix, aby uzyskać informacje. Wykonałem cabal2nix . > default.nix, aby uzyskać wersję Nix mojego pliku cabal. Następnie utworzyłem plik release.nix, aby go faktycznie skompilować. Zawartość obu plików są następujące:

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

Po wykonaniu tej czynności wykonywane nix-build release.nix i ja wróciłem

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 

Co oczywiście nie jest dobre. Jaki błąd tu popełniam? Udało mi się w podobnej próbie, która budowała plik wykonywalny zamiast biblioteki, więc podejrzewam, że ma to coś wspólnego z tym. Program github repo, którego obserwowałem, również używał pliku wykonywalnego.

+0

Trochę ujęcia w ciemności, ale czy dodanie do polecenia pliku default.nix w ogóle funkcji? EnableSplitObjs = false; '? Jeśli te błędy z 'error: asercja nie powiodło się w..' możesz spróbować' enableDeadCodeElimination = false; 'zamiast? – ppb

+0

@ppb 'enableSplitObjs = false;' wykonane poprawnie. Dlaczego jednak to naprawia? Czy jest miejsce, w którym wszystkie opcje z haskell nix są udokumentowane? Ponadto, jeśli zrobisz to, przyjmuję to. – phil

Odpowiedz

0

wierzę domyślnie nix, w przeciwieństwie do zwykłego kabała, postara się zbudować żadnego projektu Haskell stosując podzielone obiekty wyposażone, 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.

Nie jestem też pewien, dlaczego to może być w przypadku braku na swoje System, ale w zależności od wersji nixpkgs można wyłączyć poprzez dodanie jednego:

enableSplitObjs = false;

enableDeadCodeElimination = false;

do wyprowadzenia.

Aby zapoznać się z listą innych atrybutów/opcji, można zapoznać się z https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix Niestety nie znam żadnej oficjalnej dokumentacji opisującej je bardziej szczegółowo.

Powiązane problemy