2017-04-17 21 views
5

Tôi đã quan tâm đến Nix trong một thời gian, và tôi nghĩ cuối cùng tôi sẽ cố gắng sử dụng nó để bắt đầu một dự án haskell mới.Xây dựng thư viện haskell đơn giản sử dụng nix

tôi bắt đầu với cấu trúc thư mục

project.cabal 
src/Lib.hs 

Trong trường hợp tập tin cabal có các nội dung sau:

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 

và Lib.hs có

module Lib where 

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

Như bạn có thể thấy, nó khá đơn giản. Khi tôi thực hiện cabal build, nó có vẻ là hạnh phúc. Lưu ý rằng tôi không có chuyên gia haskell bởi bất kỳ phương tiện, vì vậy tôi có thể làm cho một số sai lầm người mới bắt đầu ở đây.

Để xây dựng điều này với Nix, tôi đã đọc https://github.com/Gabriel439/haskell-nix để nhận thông tin của mình. Tôi đã thực hiện cabal2nix . > default.nix để nhận phiên bản Nix của tệp cabal của tôi. Sau đó tôi đã tạo một tệp release.nix để thực sự tạo tệp. Nội dung của hai tập tin như sau:

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

Sau khi thực hiện điều này, tôi thực hiện nix-build release.nix và đã trở lại

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 

Điều này tất nhiên là không tốt. Tôi đang làm gì ở đây? Tôi đã thành công trong một nỗ lực tương tự đã được xây dựng một thực thi thay vì một thư viện, vì vậy tôi nghi ngờ nó có cái gì để làm với điều đó. Các repo github tôi đã theo dõi đã được sử dụng một thực thi là tốt.

+0

Bit của ảnh trong bóng tối nhưng không thêm 'enableSplitObjs = false;' vào tệp mặc định.nix của bạn sẽ giúp bạn? Nếu lỗi đó xảy ra với 'error: assertion failed at..' bạn có thể thử' enableDeadCodeElimination = false; 'thay thế không? – ppb

+0

@ppb 'enableSplitObjs = false;' làm cho nó xây dựng chính xác. Tại sao điều đó sửa chữa mọi thứ? Có một nơi mà tất cả các tùy chọn haskell nix được ghi lại không? Ngoài ra, nếu bạn thực hiện câu trả lời này, tôi sẽ chấp nhận nó. – phil

Trả lời

0

Tôi tin rằng bằng nix mặc định, không giống như cabal đơn giản, sẽ cố gắng xây dựng bất kỳ dự án Haskell sử dụng đối tượng chia đặc trưng, ​​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.

Tôi không quá chắc chắn là tại sao có thể bị thất bại trên của bạn hệ thống nhưng tùy thuộc vào phiên bản nixpkgs của bạn có thể bị vô hiệu hóa bằng cách thêm một trong số:

enableSplitObjs = false;

enableDeadCodeElimination = false;

dẫn xuất.

Để biết danh sách các thuộc tính/tùy chọn khác, bạn có thể tham khảo https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix Rất tiếc, tôi không biết bất kỳ tài liệu chính thức nào mô tả chi tiết hơn.

Các vấn đề liên quan