我对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仓库也使用了可执行文件。

最佳答案

我相信默认情况下,nix与普通的cabal不同,将尝试使用拆分对象功能per cabal's manual构建任何Haskell项目:

我不太确定为什么这可能在您的系统上失败,但是可以根据您的nixpkgs版本,通过添加以下选项之一来禁用它:enableSplitObjs = false;enableDeadCodeElimination = false;推导。
有关其他属性/选项的列表,您可以引用https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/generic-builder.nix。不幸的是,我不了解任何更详细描述它们的官方文档。

关于haskell - 使用nix构建简单的haskell库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43443961/

10-13 03:06