如何在另一个nixpkg中使用与nixpkg一起安装的idris包?

时间:2017-03-18 00:00:18

标签: idris nixos nixpkgs

目前我在使用与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 个答案:

答案 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寻找这种定义,并且在打结结合时非常有用所有叠加在一起。