バイナリ形式でのみ配布されるプログラムで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
'';
}