目前我在使用与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'
。有谁知道我做错了什么,或者解决这个问题?
答案 0 :(得分:0)
在编写with import <nixpkgs> {}
时,Nixpkgs集中定义的每个属性实际上都变成了局部变量。这意味着,例如,当您编写haskellPackages
时,实际上是在指Nixpkgs定义的haskellPackages
属性。您可以通过在Nixpkgs结帐中查看文件top-level/all-packages.nix
来查看以此方式定义的所有软件包。
请注意,您的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
寻找这种定义,并且在打结结合时非常有用所有叠加在一起。