Как отладить ошибки сборки 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 есть две деривационные функции, которые необходимо учитывать при сборке пакетов:
derivation
который предоставлен Nix.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
добавить скрипт для сборки, а затем в этот файл поместить команды для сборки вашего программного обеспечения.