我正在尝试从仅以二进制形式分发的程序制作 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
'';
}