바이너리 형태로만 배포되는 프로그램으로 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
'';
}