在基于二进制发行版的新 nixos 派生中,为什么我会收到引用 nativeBuildInputs 的错误?

在基于二进制发行版的新 nixos 派生中,为什么我会收到引用 nativeBuildInputs 的错误?

我正在尝试从仅以二进制形式分发的程序制作 nixos 包。像大多数一样,到标准链接器和库的链接与 nixos 系统不匹配,因此我尝试创建一个用于patchelf更新这些链接的新派生。我的工作基于zoom-us包存储库中已有的包。

但是,当我尝试安装该软件包时,出现以下错误:

savanni@lapis:~  $ nix-env -i all --show-trace
replacing old ‘all’
installing ‘all’
error: while evaluating the attribute ‘pkgs’ of the derivation ‘all’ at /nix/store/1fxfp03ya08rnzrzyxy7dhca3c5qm0jk-nixos-16.09.1829.c88e67d/nixos/pkgs/build-support/trivial-builders.nix:10:14:
while evaluating the attribute ‘nativeBuildInputs’ of the derivation ‘GoPanda’ at /home/savanni/.nixpkgs/gopanda2.nix:9:5:
cannot coerce a set to a string, at /home/savanni/.nixpkgs/gopanda2.nix:9:5

这是我的推导文本:

{ cairo, fetchurl, glib, patchelf, stdenv, xorg }:
stdenv.mkDerivation rec {
    name = "GoPanda";
    version = "2";
    meta = {
        homepage = "http://pandanet-igs.com/communities/gopanda2";
    };

    src = fetchurl {
        url = "http://pandanet-igs.com/gopanda2/installer/stable/linux-64/gopanda2-linux-64.tar.gz";
        sha256 = "6d0a13e81a4646779331ff182acdbf9fe7982b2659f12a794a50897ea7368e1c";
    };  

    phases = [ "unpackPhase" "installPhase" ];
    nativeBuildInputs = [ ];
    buildInputs = [
        cairo
        glib
        xorg
    ];

    libPath = stdenv.lib.makeLibraryPath buildInputs;

    installPhase = ''
        mkdir -p $out/bin
        cp GoPanda2 $out/bin/GoPanda2
        patchelf \
            --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
            --set-rpath ${libPath} \
            $out/bin/GoPanda2
    '';
}

如果我删除该nativeBuildInputs行、该buildInputs行、该libPath行以及对 的引用libPath,我将获得成功的构建,但可执行文件不知道在哪里可以找到库。所以我知道我需要指定库。此外,我可以从上面的代码开始并将内容添加到nativeBuildInputs,但仍然得到相同的错误。

但问题是,为什么周围的强制转换失败nativeBuildInputs,我该如何修复它?

答案1

问题在于xorg中的条目buildInputs

xorg是一个集合,而不是单个模块。据我所知,期望buildInputs列表中的所有内容都可以强制转换为字符串,并且显然模块可以以这种方式强制转换(大概是模块名称)。不能以这种方式强制列出列表。

对 的引用nativeBuildInputs大概表明buildInputs被挤进nativeBuildInputs.

这是构建的派生文本,但只是缺少一些我尚未包含在 中的库xorg。一旦应用程序完全运行,我将用完整的推导替换它。

{ pkgs ? import <nixpkgs> {}
, cairo ? pkgs.cairo
, fetchurl ? pkgs.fetchurl
, glib ? pkgs.glib
, patchelf ? pkgs.patchelf
, stdenv ? pkgs.stdenv
, xorg ? pkgs.xorg
}:
stdenv.mkDerivation rec {
    name = "GoPanda";
    version = "2";
    meta = {
        homepage = "http://pandanet-igs.com/communities/gopanda2";
    };

    src = fetchurl {
        url = "http://pandanet-igs.com/gopanda2/installer/stable/linux-64/gopanda2-linux-64.tar.gz";
        sha256 = "6d0a13e81a4646779331ff182acdbf9fe7982b2659f12a794a50897ea7368e1c";
    };

    phases = [ "unpackPhase" "installPhase" ];
    buildInputs = [
        cairo
        glib
        xorg.libX11
    ];

    libPath = stdenv.lib.makeLibraryPath buildInputs;

    installPhase = ''
        mkdir -p $out/share
        mkdir -p $out/bin
        cp -r locales $out/share
        cp GoPanda2 $out/bin/GoPanda2
        patchelf \
            --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
            --set-rpath ${libPath} \
            $out/bin/GoPanda2
    '';
}

相关内容