Nixos
在基於二進制分發的新 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
,我該如何解決它?
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 ''; }