【问题标题】:How to debug nix-build errors for a custom nix file?如何调试自定义 nix 文件的 nix-build 错误?
【发布时间】:2018-02-14 05:34:38
【问题描述】:

我正在尝试在 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 环境 - 如果有帮助,我可以发布更多详细信息。

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

【问题讨论】:

  • 发布错误消息时,请发布您运行的确切命令以获取错误。

标签: nix nixpkgs


【解决方案1】:

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

  1. derivation,由 Nix 提供。
  2. stdenv.mkDerivation,由 Nix Packages Collection 提供。

mkDerivation 在后台使用derivation,因此在使用mkDerivation 时,了解它们两者的工作原理很重要。对于您的特定问题,问题是 derivation 具有三个必需的输入:

必须有一个名为system的属性,其值必须是字符串 指定 Nix 平台标识符,例如“i686-linux”或 "powerpc-darwin"

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

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

现在,mkDerivation 通过提供 system 和 builder 属性来处理其中两个必需的输入;当然,您可以覆盖。然而,因为mkDerivation 提供了它自己的构建器,该构建器旨在构建基于./configure、make、make install 的包,它有自己的一组要求。即,您提供指向您的源代码的src 属性。通常,fetchurl 用于提供 src 属性,但到源的 Nix 路径(不是字符串)也应该可以工作。

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

您可以分别阅读有关derivation 和mkDerivation here 和here 的更多信息。

【讨论】:

  • 谢谢,我阅读了相关文档,虽然我仍然不确定如何让它找到我的构建脚本:我添加了一个返回 0 的虚拟脚本:builder = "./scala-build.sh"; 但现在得到@987654342 @ 当我运行 nix-build ./scala-default.nix 当我在与 scala-default.nix 相同的目录中有 scala-build.sh 时
【解决方案2】:

你应该看看错误信息:

variable $src or $srcs should point to the source

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2023-03-26
    • 2015-02-27
    相关资源
    最近更新 更多