如何调试自定义nix文件的nix-build错误?

时间:2017-09-05 20:49:11

标签: nix nixpkgs

我正在尝试在Ubuntu 16.04上使用Nix。

设置完成后,我尝试构建以下表达式:

let
  pkgs = import <nixpkgs> {};
  stdenv = pkgs.stdenv;
in rec {
  scalaEnv = stdenv.mkDerivation rec {
    name = "scala-env";
    shellHook = ''
    alias cls=clear
    '';
    CLANG_PATH = pkgs.clang + "/bin/clang";
    CLANGPP_PATH = pkgs.clang + "/bin/clang++";
    buildInputs = with pkgs; [
      stdenv
      sbt
      openjdk
      boehmgc
      libunwind
      re2
      clang
      zlib
      ammonite
    ];
  };
} 

但这会以错误结束:

*** Downloading ‘https://cache.nixos.org/nar/022mrfa98hxccsn9znr9z9s7sh3kfc5wzvgfx45x5drcz9wq3wyv.nar.xz’ to ‘/nix/store/y1scdckyi7ij30771rl1pdq4s9gj683a-sbt-1.0.1’...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50.0M  100 50.0M    0     0  12.5M      0  0:00:04  0:00:04 --:--:-- 10.7M

building path(s) ‘/nix/store/9xykkj5z6szrwamji3gshylxca092nv9-scala-env’
unpacking sources
variable $src or $srcs should point to the source
builder for ‘/nix/store/wg0kd6z5kik46xza5xsdqw4yf10ifksv-scala-env.drv’ failed with exit code 1
error: build of ‘/nix/store/wg0kd6z5kik46xza5xsdqw4yf10ifksv-scala-env.drv’ failed
The command '/bin/sh -c $nixenv && nix-build scala-default.nix -A scalaEnv' returned a non-zero code: 100

请注意,/bin/sh -c $nixenv只是尝试设置nix环境 - 如果有用,我可以发布更多详细信息。

我过去在另一个系统上构建了一个非常相似的表达式 - 我不确定这个系统会出现什么问题 - 怎么可能会调试这个呢?

2 个答案:

答案 0 :(得分:1)

您应该查看错误消息:

variable $src or $srcs should point to the source

您可以在nixpkgs存储库中搜索该错误消息,以准确找到它的生成位置。

发生的事情是您没有提供构建器shell脚本,因此nixpkgs只是想根据您的其他mkDerivation参数猜测如何构建项目。但它无法猜测如何构建你的东西​​,因为你没有给它一些源文件来编译。我建议您编写类似builder = ./builder.sh的内容来添加构建器脚本,然后在该文件中添加用于构建软件的命令。

答案 1 :(得分:1)

在Nix中,构建包时需要考虑两个派生函数:

  1. derivation由Nix提供。
  2. stdenv.mkDerivation由Nix Packages Collection提供。
  3. mkDerivation使用derivation,因此在使用mkDerivation时,了解他们两者的工作方式非常重要。对于您的特定问题,问题是derivation有三个必需的输入:

      

    必须有一个名为 system 的属性,其值必须是字符串   指定Nix平台标识符,例如&#34; i686-linux&#34;要么   &#34; PowerPC的达尔文&#34;

         

    必须有一个名为 name 的属性,其值必须是字符串。   这被nix-env用作包的符号名称,它是   附加到派生的输出路径。

         

    必须有一个名为 builder 的属性来标识该程序   执行以执行构建。它可以是推导   或源(本地文件引用,例如./builder.sh)。

    现在,mkDerivation通过提供系统构建器属性来处理其中两个必需的输入;当然,你可以覆盖。但是,因为mkDerivation提供了自己的构建器,它旨在构建基于./configuremakemake install的程序包,所以它具有它自己的一套要求。也就是说,您提供了一个指向源代码的src属性。通常,fetchurl用于提供src属性,但源的Nix路径(不是字符串)也应该有效。

    如果mkDerivation提供的默认构建器不是您需要的,那么您需要编写自己的构建器。另一方面,如果它确实提供了您所需要的,那么您只需确保提供所需的输入。

    您可以分别详细了解derivationmkDerivation herehere