Как использовать пакет 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
ищет такое определение, и это полезно при связывании узла, чтобы объединить все наложения вместе.