Как использовать пакет idris, установленный с nixpkg в другом nixpkg?

В настоящее время у меня возникают проблемы с использованием пакета Idris, который был установлен вместе с nixpkg, в другой пакет Idris, который зависит от него. Оба этих пакета были протестированы в системе Debian, поэтому проблема не в самом коде Idris, а в том, как они устанавливаются в системе NixOS. Я верю, что могу успешно установить первый пакет, позвонив nix-env -f math.nix -i idris_math где math.nix определяется как:

with import <nixpkgs> { };

stdenv.mkDerivation rec {
  name = "idris_math";
  idris = haskellPackages.idris;
  buildDepends = [ idris ];
  src = ./.;

  preHook = ''
    ln -sv ${idris}/share/x86_64-linux-ghc-8.0.1/${idris.name}/libs $PWD/libs
    export IDRIS_LIBRARY_PATH=$PWD/libs
  '';

  configurePhase = ''
    export TARGET=$out/lib/${idris.name}
  '';

  buildPhase = ''
      ${idris}/bin/idris --build *.ipkg
  '';

  installPhase = ''
    ${idris}/bin/idris --install *.ipkg
    ${idris}/bin/idris --clean *.ipkg
  '';

  }

Я могу тогда бежать nix-env -q и посмотри что idris_math была установлена. Второй nixpkg выглядит идентично math.nixкроме того, что имя изменено и buildDepends линия сейчас buildDepends = [ idris idris_math ], Однако, когда я пытаюсь собрать или установить этот пакет, меня встречают error: undefined variable 'idris_math', Кто-нибудь знает, что я делаю неправильно или как это исправить?

1 ответ

Когда ты пишешь with import <nixpkgs> {}каждый атрибут, определенный в наборе Nixpkgs, по существу превращается в локальную переменную. Это означает, что когда вы пишете haskellPackagesНапример, вы на самом деле имеете в виду haskellPackages атрибут, определенный Nixpkgs. Вы можете увидеть все пакеты, определенные таким образом, посмотрев на файл top-level/all-packages.nix в вашей проверке Nixpkgs.

Обратите внимание, что idris в вашем buildDepends имеет в виду определение idris атрибут в предыдущей строке. Твой новый idris_math Пакет не определен аналогичным образом в этом файле или не добавлен в набор Nixpkgs в любом месте, поэтому вы не можете получить ссылку на него, ища локальную переменную или (import <nixpkgs> {}).idris_math, что в основном то, что делается при написании idris_math в вашем втором выводе.

В зависимости от того, что именно вы хотите сделать с вашим пакетом, у вас есть несколько вариантов. Если вы просто хотите использовать idris_math в качестве зависимости для другого соседнего пакета (или нескольких), вы можете просто написать buildDepends = [ idris (import /path/to/math.nix) ], Это очень простой способ сделать то, что вы хотите, и, скорее всего, хороший выбор, если вы хотите использовать эту библиотеку при разработке пакетов Idris.

Если вы хотите сделать idris_math часть набора, который вы получаете от import <nixpkgs> {} в любом месте на вашей машине, и чтобы было легко nix-env -iВы можете попробовать добавить его в оверлей. Это потребует создания файла вроде ~/.config/nixpkgs/overlays/<my overlay name>/default.nix с содержимым что-то вроде:

self: super:

with super;

{
  idris_math = callPackage /path/to/idris_math.nix {};
}

В этом случае вы, вероятно, также хотите изменить свой idris_math.nix заголовок будет { stdenv, haskellPackages }:, так как callPackage ищет такое определение, и это полезно при связывании узла, чтобы объединить все наложения вместе.

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