Как отладить ошибки сборки nix для пользовательского файла nix?

Я пытаюсь использовать Nix на Ubuntu 16.04.

После настройки я пытаюсь построить следующее выражение:

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 ответа

В 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 здесь и здесь соответственно.

Вы должны посмотреть на сообщение об ошибке:

variable $src or $srcs should point to the source

Вероятно, вы можете найти это сообщение об ошибке в репозитории nixpkgs, чтобы точно определить, где оно было сгенерировано.

Происходит то, что вы не предоставили скрипт оболочки для строителя, поэтому nixpkgs просто пытается угадать, как построить ваш проект на основе вашего другого mkDerivation аргументы. Но он не может догадаться, как создать свою вещь, потому что вы не дали ей некоторые исходные файлы для компиляции. Я предлагаю вам написать что-то вроде builder = ./builder.sh добавить скрипт для сборки, а затем в этот файл поместить команды для сборки вашего программного обеспечения.

Другие вопросы по тегам