nix

2017-04-17 20 views
5

kullanarak basit bir haskell kütüphanesi oluşturun Nix ile bir süredir ilgileniyorum ve sonunda yeni bir haskell projesi başlatmak için kullanmaya çalışacağımı düşündüm. ,nix

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 

ve Lib.hs

Gördüğünüz gibi

module Lib where 

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

ben cabal dosyanın içeriği şu şekildedir dizin yapısında

project.cabal 
src/Lib.hs 

ile başladı bu oldukça basit. cabal build'u çalıştırdığımda mutlu görünüyor. Herhangi bir yolla uzman olmadığımı unutmayın, bu yüzden burada yeni bir başlangıç ​​hatası yapabilirim.

Bunu Nix ile kurmak için, bilgilerimi almak için https://github.com/Gabriel439/haskell-nix okuyorum. Cabal dosyamın bir Nix sürümünü almak için cabal2nix . > default.nix'u çalıştırdım. Daha sonra bunu oluşturmak için bir release.nix dosyası oluşturdum. aşağıdaki gibi iki dosyaların içeriğini şunlardır:

Bunu yaptıktan sonra ben nix-build release.nix infaz ve geri

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 
var release.nix

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

default.nix

{ mkDerivation, base, stdenv }: 
mkDerivation { 
    pname = "project"; 
    version = "0.1.0.0"; 
    src = ./.; 
    libraryHaskellDepends = [ base ]; 
    license = stdenv.lib.licenses.mit; 
} 

Elbette ki iyi değil. Hangi hatayı burada yapıyorum? Benzer bir girişimde, kütüphane yerine bir yürütülebilir dosya oluştururken başarılı oldum, bu yüzden bununla ilgili bir şey olduğundan şüpheleniyorum. Takip ettiğim github repo, bir yürütülebilir dosyayı da kullanıyordu.

varsayılan nix tarafından inanıyoruz
+0

Karanlıkta bir çekim bitti ama 'enableSplitObjs = false;' ifadesini default.nix dosyanıza eklemek hiç işe yarıyor mu? Eğer bu hata "hata: iddiayla başarısız oldu" durumunda başarısız olursa, enableDeadCodeElimination = false; 'yerine? – ppb

+0

@ppb 'enableSplitObjs = false;' doğru şekilde oluşturuldu. Neden bu şeyleri düzeltiyor? Tüm haskell nix seçeneklerinin belgelendiği bir yer var mı? Ayrıca, bunu bir cevap yaparsanız kabul edeceğim. – phil

cevap

0

, düz cabal aksine, split nesneler özelliğini kullanarak herhangi Haskell projesini inşa etmek için per cabal's manual çalışacağız:

--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.

ben olarak çok emin değilim bu konuda başarısız olabilir neden senin sistem ancak nixpkgs sürümüne bağlı birini ekleyerek devre dışı bırakılabilir:

enableSplitObjs = false;

enableDeadCodeElimination = false;

Türev için

.

Diğer özelliklerin/seçeneklerin bir listesi için https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix numaralı telefona başvurabilirsiniz Ne yazık ki daha ayrıntılı olarak açıklanan resmi belgelerin farkında değilim.