바이너리 배포판을 기반으로 하는 새로운 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아마도 .buildInputsnativeBuildInputs

다음은 빌드의 파생 텍스트이지만 아직 포함하지 않은 일부 라이브러리가 누락되었습니다 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
    '';
}

관련 정보