Nixos

在基於二進制分發的新 nixos 派生中,為什麼我在引用 nativeBuildInputs 時出現錯誤?

  • March 13, 2017

我正在嘗試從僅以二進制形式分發的程序製作一個 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
   '';
}

引用自:https://unix.stackexchange.com/questions/350997