Em uma nova derivação nixos, baseada em uma distribuição binária, por que estou recebendo um erro referindo-se a nativeBuildInputs?

3

Estou tentando fazer um pacote nixos a partir de um programa distribuído apenas na forma binária. Como a maioria, os links para o vinculador padrão e para as bibliotecas não correspondem a um sistema nixos, por isso estou tentando criar uma nova derivação que use patchelf para atualizar esses links. Estou baseando meu trabalho no pacote zoom-us já no repositório de pacotes.

No entanto, quando tento instalar o pacote, recebo este erro:

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

Aqui está o texto da minha derivação:

{ 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
    '';
}

Se eu remover a linha nativeBuildInputs , a linha buildInputs , a linha libPath e as referências a libPath , obtenho uma compilação bem-sucedida, mas um executável que não sabe onde encontrar as bibliotecas . Então eu sei que preciso especificar as bibliotecas. Além disso, posso começar com o código acima e adicionar coisas ao nativeBuildInputs , e ainda obter o mesmo erro.

Mas a questão é: por que há uma coerção falhada em torno de nativeBuildInputs e como posso corrigi-lo?

    
por Savanni D'Gerinel 12.03.2017 / 21:32

1 resposta

0

O problema está na entrada xorg em buildInputs .

xorg é uma coleção, não um módulo individual. Até onde eu posso ver, a expectativa para buildInputs é que tudo na lista seja coercível para uma string, e aparentemente módulos podem ser coagidos de tal forma (presumivelmente para o nome do módulo). Uma lista não pode ser coagida dessa maneira.

A referência a nativeBuildInputs indica que buildInputs é acumulado em nativeBuildInputs .

Aqui está o texto de uma derivação que constrói, mas está simplesmente faltando algumas das bibliotecas que eu ainda não incluí a partir de xorg . Vou substituí-lo com uma derivação completa, uma vez que o aplicativo esteja funcionando completamente.

{ 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
    '';
}
    
por 13.03.2017 / 16:28

Tags