Создайте простую библиотеку haskell с помощью nix

Некоторое время меня интересовал 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, поэтому я могу сделать здесь ошибку новичка.

Чтобы создать это с помощью Nix, я читал https://github.com/Gabriel439/haskell-nix, чтобы получить мою информацию. Я выполнил cabal2nix . > default.nix, чтобы получить 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, за которым я следил, также использовал исполняемый файл.


person phil    schedule 17.04.2017    source источник
comment
Небольшой снимок в темноте, но помогает ли вообще добавление enableSplitObjs = false; к файлу default.nix? Если эта ошибка возникла с error: assertion failed at.., не могли бы вы вместо этого попробовать enableDeadCodeElimination = false;?   -  person ppb    schedule 17.04.2017
comment
@ppb enableSplitObjs = false; сделал сборку правильно. Но почему это все исправляет? Есть ли место, где задокументированы все параметры haskell nix? Кроме того, если вы дадите ответ, я его приму.   -  person phil    schedule 17.04.2017


Ответы (1)


Я считаю, что по умолчанию nix, в отличие от обычного Cabal, попытается создать любой проект Haskell с использованием функции разделенных объектов, согласно руководству клики:

--enable-split-objs

При создании библиотеки используйте функцию GHC -split-objs. Это уменьшает окончательный размер исполняемых файлов, которые используют библиотеку, позволяя им связываться только с теми битами, которые они используют, а не со всей библиотекой. Обратной стороной является то, что сборка библиотеки занимает больше времени и использует значительно больше памяти.

Я не совсем уверен, почему это может не работать в вашей системе, но в зависимости от вашей версии nixpkgs можно отключить, добавив одно из:

enableSplitObjs = false;

enableDeadCodeElimination = false;

к выводам.

Список других атрибутов / параметров можно найти в https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix К сожалению, мне не известно ни одной официальной документации, описывающей эти более подробно.

person ppb    schedule 17.04.2017