2017-09-05 22 views
0

我想在Ubuntu 16.04上使用Nix。如何调试自定义nix文件的nix-build错误?

设置后,我尝试建立下面的表达式:

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的环境 - 我可以发布更多细节,如果这是有帮助的。

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

+0

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

回答

1

你应该看看错误消息:

variable $src or $srcs should point to the source 

你也许可以搜索在nixpkgs库的错误消息准确找到它生成。

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

1

在尼克斯还有,你需要建立包时,需要考虑两个导出函数:

  1. derivation这是由尼克斯提供。
  2. stdenv.mkDerivation它由Nix Packages Collection提供。

mkDerivation使用derivation引擎盖下,所以在使用时mkDerivation了解他们如何工作是很重要的。为了您的具体问题,事情是,derivation有三个必需输入:

There must be an attribute named system whose value must be a string specifying a Nix platform identifier, such as "i686-linux" or "powerpc-darwin"

There must be an attribute named name whose value must be a string. This is used as a symbolic name for the package by nix-env, and it is appended to the output paths of the derivation.

There must be an attribute named builder that identifies the program that is executed to perform the build. It can be either a derivation or a source (a local file reference, e.g., ./builder.sh).

现在,mkDerivation通过提供系统建设者属性需要照顾两个那些需要投入;这当然可以覆盖。但是,因为mkDerivation提供了它自己的构建器,它旨在构建基于./configuremakemake install的包,它具有它自己的一组要求。也就是说,您提供了一个指向源代码的src属性。通常,fetchurl用于提供src属性,但源的Nix路径(不是字符串)也应该起作用。

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

您可以分别阅读更多关于derivationmkDerivationherehere

+0

谢谢,我读了相关的文档,但我仍然不确定如何让它找到我的构建脚本:我添加了一个返回0的虚拟脚本:'builder =“./scala-build.sh”;“但现在当我在'scala-build.sh'和'scala-build.sh'在同一目录下运行'nix-build。/ scala-default.nix'时,得到'./scala-build.sh:没有这样的文件或目录' default.nix' – bbarker

+0

我想这是一个不同的问题,所以我在这里添加它:https://stackoverflow.com/questions/46116114/where-should-the-builder-script-be-located-for-a- stand-alone-nix-expression无论如何,好消息是我可以用'nix-shell'来看看我现在需要的东西。 – bbarker