3

目前,我在使用与 nixpkg 一起安装在另一个依赖它的 Idris 包中的 Idris 包时遇到了一些问题。这两个软件包都在 Debian 系统上进行了测试,所以问题不在于 Idris 代码本身,而在于它们在 NixOS 系统上的安装方式。nix-env -f math.nix -i idris_math我相信我可以通过调用where来成功安装第一个包,其中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'. 有谁知道我做错了什么,或者解决这个问题的方法?

4

1 回答 1

0

当您编写with import <nixpkgs> {}时,Nixpkgs 集中定义的每个属性本质上都被制成了一个局部变量。这意味着,haskellPackages例如,当您编写 时,您实际上指的haskellPackages是 Nixpkgs 定义的属性。top-level/all-packages.nix您可以通过查看Nixpkgs 结帐中的文件来查看以这种方式定义的所有包。

请注意,idris您的 inbuildDepends指的是idris上一行中属性的定义。您的新idris_math包没有在此文件中类似地定义,也没有添加到任何地方的 Nixpkgs 集中,因此您无法通过查找局部变量或 for 来获得对它的引用(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寻找这种定义,并且在将所有叠加层组合在一起时很有用。

于 2018-07-03T17:03:45.303 回答