Método 1) Método manual sucio, sin parche

Método 1) Método manual sucio, sin parche

¿Cuáles son los diferentes métodos para ejecutar un ejecutable que no sea de Nixos en NixOs? (Por ejemplo, binarios propietarios). Me gustaría ver también los métodos manuales.

Respuesta1

Respuestas relacionadas

Si planeas empaquetar un binario y no simplemente ejecutarlo, es posible que te guste esta otra respuesta mía:Cómo empaquetar mi software en nix o escribir mi propia derivación de paquete para nixpkgs

Version corta

Rápido y sucio: asegúrese de steam-runque esté instalado (nombre extraño, no tiene nada que ver con Steam), por ejemplo nix-shell -p steam-run, luego:

$ steam-run ./your-binary

Desde la creación de esta respuesta, se han desarrollado otras alternativas al funcionamiento a vapor, ver, por ejemplo, nix-ldque ahora es parte de NixOs (que básicamente recrea los cargadores que faltan en /lib... IaltamenteTe recomiendo que lo configures de una vez por todas, de esta manera ya no tendrás que preocuparte por ejecutar archivos binarios sin parches, para que puedas usar NPM, etc. sin dolores de cabeza):

(advertencia: desde la reciente actualización de nix, solo necesita programs.nix-ld.enable = true;y las variables se pueden configurar usando

programs.nix-ld.enable = true;
## If needed, you can add missing libraries here. nix-index-database is your friend to
## find the name of the package from the error message:
## https://github.com/nix-community/nix-index-database
programs.nix-ld.libraries = options.programs.nix-ld.libraries.default ++ (with pkgs; [ yourlibrary ]);

para configurar automáticamente las variables de entorno, pero el código siguiente debería funcionar también en sistemas heredados, así que lo dejaré aquí) Tenga en cuenta que es posible que también necesite reiniciar para asegurarse de que las variables de entorno estén configuradas correctamente y no se hayan probado recientemente.

  programs.nix-ld.enable = true;
  environment.variables = {
      NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
        stdenv.cc.cc
        openssl
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        libGL
        libva
        pipewire.lib
        xorg.libxcb
        xorg.libXdamage
        xorg.libxshmfence
        xorg.libXxf86vm
        libelf
        
        # Required
        glib
        gtk2
        bzip2
        
        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        gnome2.GConf
        nspr
        nss
        cups
        libcap
        SDL2
        libusb1
        dbus-glib
        ffmpeg
        # Only libraries are needed from those two
        libudev0-shim
        
        # Verified games requirements
        xorg.libXt
        xorg.libXmu
        libogg
        libvorbis
        SDL
        SDL2_image
        glew110
        libidn
        tbb
        
        # Other things from runtime
        flac
        freeglut
        libjpeg
        libpng
        libpng12
        libsamplerate
        libmikmod
        libtheora
        libtiff
        pixman
        speex
        SDL_image
        SDL_ttf
        SDL_mixer
        SDL2_ttf
        SDL2_mixer
        libappindicator-gtk2
        libdbusmenu-gtk2
        libindicator-gtk2
        libcaca
        libcanberra
        libgcrypt
        libvpx
        librsvg
        xorg.libXft
        libvdpau
        gnome2.pango
        cairo
        atk
        gdk-pixbuf
        fontconfig
        freetype
        dbus
        alsaLib
        expat
        # Needed for electron
        libdrm
        mesa
        libxkbcommon
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };  

También haynix-alienígena/nix-autobahnque también intenta agregar automáticamente las bibliotecas que faltan. Finalmente puedes usarcaja de distribuciónque le proporciona cualquier distribución en un contenedor acoplable/podman estrechamente integrado con el host... pero según mi experiencia, es más complicado de usar que nix-ldsea verdaderamente transparente.

Aquí tienes una explicación más larga y detallada, junto con varios métodos, a menudo menos sucios.

Versión larga

Aquí hay varios métodos (los manuales tienen principalmente fines educativos, ya que la mayoría de las veces es mejor escribir una derivación adecuada). No soy un experto en absoluto, e hice esta lista también para aprender nix, así que si tienes mejores métodos, ¡házmelo saber!

Entonces, el problema principal es que el ejecutable primero llama a un cargador y luego necesita algunas bibliotecas para funcionar, y nixos coloca tanto el cargador como las bibliotecas en /nix/store/.

Esta lista proporciona todos los métodos que encontré hasta ahora. Básicamente existen tres "grupos":

  • el manual completo: interesante para fines educativos y para entender lo que está pasando, pero eso es todo (no los uses en la práctica porque nada evitará que las derivaciones utilizadas sean recolectadas como basura más adelante)
  • las versiones parcheadas: estos métodos intentan modificar el ejecutable (automáticamente cuando se utiliza el método recomendado 4 con autoPatchelfHook) para señalar directamente la biblioteca correcta
  • los métodos basados ​​en FHS, que básicamente simulan un "Linux normal" (más pesado de ejecutar que la versión parcheada, por lo que esto debe evitarse si es posible).

Recomendaría el método 4 autoPatchelfHookpara una configuración real y adecuada, y si no tiene tiempo y solo desea ejecutar un binario en una sola línea, es posible que le interese la solución rápida y sencilla basada en steam-run(método 7 ).

Método 1) Método manual sucio, sin parche

Primero debes encontrar el cargador con, por ejemplo file:

$ file wolframscript
wolframscript: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=079684175aa38e3633b60544681b338c0e8831e0, stripped

Aquí está el cargador /lib64/ld-linux-x86-64.so.2. Para encontrar el cargador de nixos, puedes hacer:

$ ls /nix/store/*glibc*/lib/ld-linux-x86-64.so.2
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2

También necesita buscar las bibliotecas que su programa requiere, por ejemplo con lddo LD_DEBUG=libs:

$ ldd wolframscript
        linux-vdso.so.1 (0x00007ffe8fff9000)
        libpthread.so.0 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libpthread.so.0 (0x00007f86aa321000)
        librt.so.1 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/librt.so.1 (0x00007f86aa317000)
        libdl.so.2 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libdl.so.2 (0x00007f86aa312000)
        libstdc++.so.6 => not found
        libm.so.6 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libm.so.6 (0x00007f86aa17c000)
        libgcc_s.so.1 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libgcc_s.so.1 (0x00007f86a9f66000)
        libc.so.6 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libc.so.6 (0x00007f86a9dae000)
        /lib64/ld-linux-x86-64.so.2 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib64/ld-linux-x86-64.so.2 (0x00007f86aa344000)

Aquí verá que se encuentran la mayoría de las bibliotecas excepto libstdc++.so.6. ¡Así que vamos a encontrarlos! Una primera forma rápida y sencilla de encontrarlos es comprobar si ya están presentes en su sistema:

$ find /nix/store -name libstdc++.so.6
/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/libstdc++.so.6

En caso de que la biblioteca aún no esté instalada, seguramente preferirás utilizar la más complicada.nix-indexprograma para buscar estos archivos en una base de datos mucho más grande (gracias hidra). Para eso, primero instale nix-indexy genere la base de datos (esto solo es necesario la primera vez, pero puede tardar unos minutos en ejecutarse):

$ nix-index

(También puede utilizarlo nix run github:mic92/nix-index-database yourlibpara evitar recrear la base de datos localmente. Consulte también nix-index-updatedesdenix-alienígenapara descargar el caché automáticamente desdebase de datos de índice nix) luego, para buscar una biblioteca puedes hacer algo como (nota que --top-levelelimina algunas entradas):

$ nix-locate lib/libstdc++.so.6 --top-level
gcc-unwrapped.lib                                     0 s /nix/store/7fv9v6mnlkb4ddf9kz1snknbvbfbcbx0-gcc-10.3.0-lib/lib/libstdc++.so.6

Luego puede instalar estas bibliotecas para este ejemplo rápido y sencillo (más adelante veremos mejores soluciones).

Bien. Ahora, solo necesitamos ejecutar el programa con el LD_LIBRARY_PATHconfigurado para apuntar a este archivo (ver también makeLibraryPathpara generar esta cadena en una derivación) y llamar al cargador que determinamos en el primer paso en este archivo:

LD_LIBRARY_PATH=/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/:$LD_LIBRARY_PATH /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 ./wolframscript

(Asegúrese de usarlo ./antes del nombre del script y de mantener solo el directorio de las bibliotecas. Si tiene varias bibliotecas, simplemente use concat la ruta con dos puntos)

Método 2) Método manual sucio, con parche

Después de instalar (con nixenv -io en su configuration.nix) patchelf, también puede modificar directamente el ejecutable para empaquetar el buen cargador y las bibliotecas. Para cambiar el cargador simplemente ejecute:

patchelf --set-interpreter /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 wolframscript

y para comprobar:

$ patchelf --print-interpreter wolframscript
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.

y para cambiar la ruta a las bibliotecas codificadas en el ejecutable, primero verifique cuál es la ruta actual (vacía para mí):

$ patchelf --print-rpath wolframscript

y agréguelos a la ruta de la biblioteca que determinó antes, eventualmente separados por dos puntos:

$ patchelf --set-rpath /nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/ wolframscript
$ ./wolframscript

Método 3) Parche en una derivación nix

Podemos reproducir más o menos lo mismo en una derivación nix inspirada enskypeforlinux

Este ejemplo presenta también una alternativa, o puedes usar:

patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true

(que debería quedar bastante claro una vez que comprenda el método "manual"), o

patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true

Este segundo método es un poco más sutil, pero si ejecutas:

$ nix-shell '<nixpkgs>' -A hello --run 'echo $NIX_CC/nix-support/dynamic-linker "->" $(cat $NIX_CC/nix-support/dynamic-linker)'
/nix/store/8zfm4i1aw4c3l5n6ay311ds6l8vd9983-gcc-wrapper-7.4.0/nix-support/dynamic-linker -> /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/ld-linux-x86-64.so.2

Verá que el archivo $NIX_CC/nix-support/dynamic-linkercontiene una ruta al cargador ld-linux-x86-64.so.2.

Ponlo derivation.nix, esto es

{ stdenv, dpkg,glibc, gcc-unwrapped }:
let

  # Please keep the version x.y.0.z and do not update to x.y.76.z because the
  # source of the latter disappears much faster.
  version = "12.0.0";

  rpath = stdenv.lib.makeLibraryPath [
    gcc-unwrapped
    glibc
  ];
  # What is it for?
  # + ":${stdenv.cc.cc.lib}/lib64";

  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

in stdenv.mkDerivation {
  name = "wolframscript-${version}";

  system = "x86_64-linux";

  inherit src;

  nativeBuildInputs = [
  ];

  buildInputs = [ dpkg ];

  unpackPhase = "true";

  # Extract and copy executable in $out/bin
  installPhase = ''
    mkdir -p $out
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/* $out
    rm -rf $out/opt
  '';

  postFixup = ''
    # Why does the following works?
    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true
    # or
    # patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true
    patchelf --set-rpath ${rpath} "$out/bin/wolframscript" || true
  '';

  meta = with stdenv.lib; {
    description = "Wolframscript";
    homepage = https://www.wolfram.com/wolframscript/;
    license = licenses.unfree;
    maintainers = with stdenv.lib.maintainers; [ ];
    platforms = [ "x86_64-linux" ];
  };
}

y en default.nixponer:

{ pkgs ? import <nixpkgs> {} }:

pkgs.callPackage ./derivation.nix {}

Compilar y ejecutar con

nix-build
result/bin/wolframscript

Método 4) Utilice autoPatchElf: más sencillo

Todos los métodos anteriores necesitan un poco de trabajo (necesitas encontrar los ejecutables, parchearlos...). ¡NixOs hizo para nosotros un "gancho" especial autoPatchelfHookque parchea todo automáticamente por ti! Sólo necesitas especificarlo en (native)BuildInputsy nix hace la magia.

{ stdenv, dpkg, glibc, gcc-unwrapped, autoPatchelfHook }:
let

  # Please keep the version x.y.0.z and do not update to x.y.76.z because the
  # source of the latter disappears much faster.
  version = "12.0.0";

  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

in stdenv.mkDerivation {
  name = "wolframscript-${version}";

  system = "x86_64-linux";

  inherit src;

  # Required for compilation
  nativeBuildInputs = [
    autoPatchelfHook # Automatically setup the loader, and do the magic
    dpkg
  ];

  # Required at running time
  buildInputs = [
    glibc
    gcc-unwrapped
  ];

  unpackPhase = "true";

  # Extract and copy executable in $out/bin
  installPhase = ''
    mkdir -p $out
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/* $out
    rm -rf $out/opt
  '';

  meta = with stdenv.lib; {
    description = "Wolframscript";
    homepage = https://www.wolfram.com/wolframscript/;
    license = licenses.mit;
    maintainers = with stdenv.lib.maintainers; [ ];
    platforms = [ "x86_64-linux" ];
  };
}

Método 5) Utilice FHS para simular un shell de Linux clásico y ejecute los archivos manualmente

Algunos programas pueden ser difíciles de empaquetar de esa manera porque pueden depender en gran medida delFHSestructura de árbol de archivos, o puede verificar que los binarios no hayan cambiado. Luego también puedes usarbuildFHSUserEnvpara proporcionar una estructura de archivos FHS (ligera, que utiliza espacios de nombres) para su aplicación.Tenga en cuenta que este método es más pesado que los métodos basados ​​en parches y agrega un tiempo de inicio significativo, así que evítelo cuando sea posible.

Puede simplemente generar un shell y luego extraer manualmente el archivo y ejecutarlo, o empaquetar directamente su programa para FHS. Primero veamos cómo conseguir un caparazón. Coloque en un archivo (digamos fhs-env.nix) lo siguiente:

let nixpkgs = import <nixpkgs> {};
in nixpkgs.buildFHSUserEnv {
   name = "fhs";
   targetPkgs = pkgs: [];
   multiPkgs = pkgs: [ pkgs.dpkg ];
   runScript = "bash";
}

y correr:

nix-build fhs-env.nix
result/bin/fhs

Luego obtendrás un bash en un Linux de aspecto más estándar y podrás ejecutar comandos para ejecutar tu ejecutable, como:

mkdir wolf_fhs/
dpkg -x WolframScript_12.0.0_LINUX64_amd64.deb wolf_fhs/
cd wolf_fhs/opt/Wolfram/WolframScript/bin/
./wolfram

Si necesita más bibliotecas/programas como dependencias, simplemente agréguelos multiPkgs(para todos los arcos compatibles) o targetPkgs(solo para el arco actual).

Bonificación: también puedes iniciar un shell fhs con un comando de una línea, sin crear un archivo específico:

nix-build -E '(import <nixpkgs> {}).buildFHSUserEnv {name = "fhs";}' && ./result/bin/fhs

Método 6) Utilice FHS para simular un shell de Linux clásico y empaquete los archivos en su interior

fuente:https://reflexivereflection.com/posts/2015-02-28-deb-installation-nixos.html

Método 7) funcionamiento con vapor

Con buildFHSUserEnvél puede ejecutar muchos softwares, pero deberá especificar manualmente todas las bibliotecas requeridas. Si desea una solución rápida y no tiene tiempo para comprobar con precisión cuáles son las bibliotecas necesarias, puede intentarlo steam-run(a pesar del nombre, no está vinculado directamente con Steam y solo incluye muchas bibliotecas), que es como buildFHSUserEnvcon muchas bibliotecas comunes preinstaladas (algunas de ellas pueden no ser gratuitas, por ejemplo, steamrtcontienen código nvidia, ¡gracias Simpson!). Para usarlo, simplemente instálelo steam-runy luego:

steam-run ./wolframscript

o si quieres un shell completo:

steam-run bash

Tenga en cuenta que es posible que deba agregar nixpkgs.config.allowUnfree = true;(o incluir en la lista blanca)este paquete específico) si desea instalarlo con nixos-rebuild, y si desea ejecutarlo/instalarlo con nix-shell/ nix-envdebe { allowUnfree = true; }ingresar ~/.config/nixpkgs/config.nix.

No es fácil "sobrescribir" paquetes o bibliotecas en nix-shell, pero si desea crear un contenedor alrededor de su script, puede crear manualmente un script contenedor:

#!/usr/bin/env nix-shell
#!nix-shell -i bash -p steam-run
exec steam-run ./wolframscript "$@"

o escríbalo directamente en una derivación de nixos:

{ stdenv, steam-run, writeScriptBin }:
let
  src = ./opt/Wolfram/WolframScript/bin/wolframscript;
in writeScriptBin "wolf_wrapped_steam" ''
    exec ${steam-run}/bin/steam-run ${src} "$@"
  ''

o si comienzas desde .deb (aquí usé makeWrapperen su lugar):

{ stdenv, steam-run, dpkg, writeScriptBin, makeWrapper }:
stdenv.mkDerivation {
  name = "wolframscript";
  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

  nativeBuildInputs = [
    dpkg makeWrapper
  ];
  unpackPhase = "true";
  installPhase = ''
    mkdir -p $out/bin
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/bin/wolframscript $out/bin/.wolframscript-unwrapped
    makeWrapper ${steam-run}/bin/steam-run $out/bin/wolframscript --add-flags $out/bin/.wolframscript-unwrapped
    rm -rf $out/opt
  '';
}

(Si estás demasiado cansado para escribir lo habitual default.nix, puedes ejecutarlo directamente nix-build -E "with import <nixpkgs> {}; callPackage ./derivation.nix {}")

Método 8) Usandonix-ld

Si no desea generar un entorno de pruebas como lo hicimos para Steam-Run (en los entornos de pruebas es imposible ejecutar aplicaciones setuid, los entornos de pruebas no se pueden anidar, la integración deficiente con los paquetes del sistema incluye direnv), puede recrear el sistema de carga que falta -ancho poniendo en tu configuration.nix:

  programs.nix-ld.enable = true;

Puedes ver que el archivo ahora está presente:

$ ls /lib64/
ld-linux-x86-64.so.2

Sin embargo, todavía es imposible ejecutar archivos binarios ya que el nuevo ld-linux-x86-64.so.2archivo solo se redirige al cargador NIX_LD(de esta manera, varios programas pueden usar diferentes cargadores mientras están en el mismo sistema):

$ ./blender 
cannot execute ./blender: NIX_LD or NIX_LD_x86_64-linux is not set

Para crear localmente esta variable de entorno, puede hacer algo como:

$ cat shell.nix 
with import <nixpkgs> {};
mkShell {
  NIX_LD_LIBRARY_PATH = lib.makeLibraryPath [
    stdenv.cc.cc
    openssl
    # ...
  ];
  NIX_LD = lib.fileContents "${stdenv.cc}/nix-support/dynamic-linker";
}

$ nix-shell 

[nix-shell:/tmp/blender-3.2.2-linux-x64]$ ./blender

o en todo el sistema usando:

(advertencia: desde la reciente actualización de Nix, solo necesita programs.nix-ld.enable = true;, y las variables se pueden configurar usando programs.nix-ld.libraries = with pkgs; [];en lugar de usar variables de entorno, pero el código siguiente debería funcionar también en sistemas heredados, así que lo dejaré aquí)

  environment.variables = {
      NIX_LD_LIBRARY_PATH = lib.makeLibraryPath [
        pkgs.stdenv.cc.cc
        pkgs.openssl
        # ...
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };

Tenga en cuenta que necesitaReanudarsu sesión X11 cada vez que cambia este archivo o hace:

$ cat /etc/profile | grep set-environment
. /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
$ . /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment

Tenga en cuenta que (a diferencia de steam-run) nix-ldno viene con ninguna biblioteca de forma predeterminada (en realidad, esto ya no es cierto; consulte la nota en la parte superior de este archivo para usar la interfaz más moderna con una lista predeterminada... pero la lista es bastante pequeña) pero puedes agregar el tuyo propio o usar herramientas para hacerlo automáticamente, ver más abajo. También puedes inspirarte con la lista de bibliotecas que ejecutan paquetes de Steam aquí:https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nixAquí está, por ejemplo, el archivo que estoy usando por ahora, es suficiente para ejecutar blender/electron:

  programs.nix-ld.enable = true;
  environment.variables = {
      NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
        stdenv.cc.cc
        openssl
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        libGL
        libva
        pipewire.lib
        xorg.libxcb
        xorg.libXdamage
        xorg.libxshmfence
        xorg.libXxf86vm
        libelf
        
        # Required
        glib
        gtk2
        bzip2
        
        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        gnome2.GConf
        nspr
        nss
        cups
        libcap
        SDL2
        libusb1
        dbus-glib
        ffmpeg
        # Only libraries are needed from those two
        libudev0-shim
        
        # Verified games requirements
        xorg.libXt
        xorg.libXmu
        libogg
        libvorbis
        SDL
        SDL2_image
        glew110
        libidn
        tbb
        
        # Other things from runtime
        flac
        freeglut
        libjpeg
        libpng
        libpng12
        libsamplerate
        libmikmod
        libtheora
        libtiff
        pixman
        speex
        SDL_image
        SDL_ttf
        SDL_mixer
        SDL2_ttf
        SDL2_mixer
        libappindicator-gtk2
        libdbusmenu-gtk2
        libindicator-gtk2
        libcaca
        libcanberra
        libgcrypt
        libvpx
        librsvg
        xorg.libXft
        libvdpau
        gnome2.pango
        cairo
        atk
        gdk-pixbuf
        fontconfig
        freetype
        dbus
        alsaLib
        expat
        # Needed for electron
        libdrm
        mesa
        libxkbcommon
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };  

También puede encontrar el nombre de las bibliotecas, ver arriba nix-index. También puedes usarnix-alien-ldonix-autobahnpara buscar y cargar automáticamente las bibliotecas. Tenga en cuenta que si no tiene las bibliotecas adecuadas, obtendrá un error como

$ ./blender
./blender: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory

Puedes ver a la vez todas las bibliotecas que aún no están disponibles usando:

$ LD_LIBRARY_PATH=$NIX_LD_LIBRARY_PATH ldd turtl
        libpangocairo-1.0.so.0 => /nix/store/n9h110ffps25rdkkim5k802p3p5w476m-pango-1.50.6/lib/libpangocairo-1.0.so.0 (0x00007f02feb83000)
        libatk-1.0.so.0 => not found

Método 9) nix-alienígena

nix-alienígenaconstruye automáticamente un FHS con las bibliotecas apropiadas. Si tiene flake habilitado (de lo contrario, simplemente agregue reemplazar nix runcon nix --extra-experimental-features "nix-command flakes" run), simplemente puede ejecutarlo de esta manera (nix-alien aún no está empaquetado en 2022)

nix run github:thiagokokada/nix-alien -- yourprogram

Luego encontrará automáticamente la biblioteca usando nix-index y le hará algunas preguntas cuando no esté seguro (esto está almacenado en caché). ingrese la descripción de la imagen aquí

Tenga en cuenta que los programas que dependen de openGl deben utilizarnixGlpara ejecutar (esto ciertamente se aplica a otros métodos aquí):

nix run --impure github:guibou/nixGL --override-input nixpkgs nixpkgs/nixos-21.11 -- nix run github:thiagokokada/nix-alien -- blender

Tenga en cuenta que es posible que deba cambiar la versión de nixos-21.11para asegurarse de que la versión de openGl coincida con su programa.

Tenga en cuenta que también puede ver el archivo generado automáticamente (la ruta se proporciona la primera vez que se ejecuta el programa):

$ cat /home/leo/.cache/nix-alien/87a5d119-f810-5222-9b47-4809257c60ec/fhs-env/default.nix
{ pkgs ? import <nixpkgs> { } }:

let
  inherit (pkgs) buildFHSUserEnv;
in
buildFHSUserEnv {
  name = "blender-fhs";
  targetPkgs = p: with p; [
    xorg.libX11.out
    xorg.libXfixes.out
    xorg.libXi.out
    xorg.libXrender.out
    xorg.libXxf86vm.out
    xorg_sys_opengl.out
  ];
  runScript = "/tmp/blender-3.2.2-linux-x64/blender";
}

Vea también la otra versión que trabaja con nix-ld ynix-autobahn.

Método 9) Usar contenedores/Docker (más pesado)

HACER

Tenga en cuenta que el proyectocaja de distribuciónle permite crear simplemente nuevos contenedores estrechamente integrados con el host instalando cualquier distribución que desee.

Método 10) Confíe en flatpack/appimage

https://nixos.org/nixos/manual/index.html#module-services-flatpak

appimage-run: Para probar con, ex, musescore

Fuentes o ejemplos

Además, para las personas que quieran iniciarse en el empaquetado, escribí recientemente un tutorial similar.aquí.

información relacionada