Methode 1) Schmutzige manuelle Methode, kein Patch

Methode 1) Schmutzige manuelle Methode, kein Patch

Welche verschiedenen Methoden gibt es, um eine Nicht-Nixos-ausführbare Datei auf NixOs auszuführen? (Zum Beispiel proprietäre Binärdateien.) Ich würde auch gerne die manuellen Methoden sehen.

Antwort1

Ähnliche Antworten

Wenn Sie vorhaben, eine Binärdatei zu verpacken und nicht nur auszuführen, könnte Ihnen auch diese andere Antwort von mir gefallen:Wie verpacke ich meine Software in Nix oder schreibe meine eigene Paketableitung für Nixpkgs?

Kurzfassung

Kurz und knapp: Stellen Sie sicher, steam-rundass installiert ist (seltsamer Name, hat nichts mit Steam zu tun), zB nix-shell -p steam-run, dann:

$ steam-run ./your-binary

Seit der Erstellung dieser Antwort wurden andere Alternativen zu Steam-Run entwickelt, siehe zB nix-lddas ist jetzt Teil von NixOs (das im Grunde die fehlenden Loader in /lib… I neu erstellthöchstIch empfehle Ihnen, es ein für alle Mal zu konfigurieren, so dass Sie sich nicht mehr um die Ausführung von Binärdateien ohne Patch kümmern müssen und NPM usw. ohne Kopfschmerzen verwenden können):

(Warnung: seit dem letzten Nix-Update benötigen Sie nur noch programs.nix-ld.enable = true;, und Variablen können konfiguriert werden mit

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 ]);

um die Umgebungsvariablen automatisch festzulegen, aber der folgende Code sollte auch auf älteren Systemen funktionieren, deshalb lasse ich ihn hier) Beachten Sie, dass Sie möglicherweise auch einen Neustart durchführen müssen, um sicherzustellen, dass die Umgebungsvariablen richtig festgelegt sind (wurde kürzlich nicht getestet).

  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";
  };  

Es gibt auchNix-Alien/Nix-Autobahndie auch automatisch versuchen, die fehlenden Bibliotheken hinzuzufügen. Schließlich können Sie verwendenVerteilerboxdas Ihnen jede beliebige Distribution in einem Docker/Podman-Container bereitstellt, der eng mit dem Host integriert ist … meiner Erfahrung nach ist die Verwendung jedoch komplizierter als das, was nix-ldwirklich transparent ist.

Hier finden Sie eine längere und detailliertere Erklärung sowie verschiedene, oft weniger schmutzige Methoden.

Lange Version

Hier sind mehrere Methoden (die manuellen Methoden dienen hauptsächlich zu Bildungszwecken, da es in den meisten Fällen besser ist, eine richtige Ableitung zu schreiben). Ich bin überhaupt kein Experte und habe diese Liste auch erstellt, um Nix zu lernen. Wenn Sie also bessere Methoden haben, lassen Sie es mich wissen!

Das Hauptproblem besteht also darin, dass die ausführbare Datei zuerst einen Loader aufruft und dann einige Bibliotheken benötigt, um zu funktionieren, und Nixos hat sowohl den Loader als auch die Bibliotheken eingefügt /nix/store/.

Diese Liste enthält alle Methoden, die ich bisher gefunden habe. Es gibt im Wesentlichen drei „Gruppen“:

  • das vollständige Handbuch: interessant für Bildungszwecke und um zu verstehen, was vor sich geht, aber das ist auch schon alles (verwenden Sie es nicht in der Praxis, denn nichts verhindert, dass die verwendeten Ableitungen später als Müll gesammelt werden)
  • die gepatchten Versionen: diese Methoden versuchen die ausführbare Datei zu ändern (automatisch bei Verwendung der empfohlenen Methode 4 mit autoPatchelfHook), um direkt auf die gute Bibliothek zu verweisen
  • die auf FHS basierenden Methoden, die grundsätzlich ein „normales Linux“ vortäuschen (schwerer auszuführen als die gepatchte Version, daher sollte dies nach Möglichkeit vermieden werden).

Für eine wirklich ordnungsgemäße Einrichtung würde ich Methode 4 empfehlen. autoPatchelfHookWenn Sie keine Zeit haben und lediglich eine Binärdatei in einer Zeile ausführen möchten, könnte für Sie die schnelle und einfache Lösung auf Grundlage von steam-run(Methode 7) interessant sein.

Methode 1) Schmutzige manuelle Methode, kein Patch

Sie müssen zuerst den Loader finden, zum Beispiel mit 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

Hier ist der Loader /lib64/ld-linux-x86-64.so.2. Um den Loader von Nixos zu finden, können Sie Folgendes tun:

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

Sie müssen außerdem die Bibliotheken finden, die Ihr Programm benötigt, beispielsweise mit lddoder 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)

Hier sehen Sie, dass die meisten Bibliotheken außer gefunden werden libstdc++.so.6. Also suchen wir sie! Eine erste schnelle und einfache Möglichkeit, sie zu finden, besteht darin, zu prüfen, ob sie bereits in Ihrem System vorhanden sind:

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

Falls die Bibliothek noch nicht installiert ist, werden Sie sicherlich die komplexere Version bevorzugen.nix-indexProgramm, um nach diesen Dateien in einer viel größeren Datenbank zu suchen (danke Hydra). Dazu installieren nix-indexund generieren Sie zunächst die Datenbank (das ist nur beim ersten Mal nötig, kann aber einige Minuten dauern):

$ nix-index

(Sie können auch verwenden, nix run github:mic92/nix-index-database yourlibum die Neuerstellung der Datenbank lokal zu vermeiden. Siehe auch nix-index-updatevonNix-Alienzum automatischen Herunterladen des Cache vonNix-Index-Datenbank) Um dann nach einer Bibliothek zu suchen, können Sie Folgendes tun (beachten Sie, dass --top-leveldadurch einige Einträge entfernt werden):

$ 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

Dann können Sie diese Bibliotheken für dieses schnelle und einfache Beispiel installieren (später werden wir bessere Lösungen sehen).

Gut. Jetzt müssen wir nur noch das Programm mit der LD_LIBRARY_PATHKonfiguration ausführen, dass es auf diese Datei verweist (siehe auch „ makeLibraryPathDiesen String in einer Ableitung generieren“) und den Loader aufrufen, den wir im ersten Schritt für diese Datei bestimmt haben:

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

(Stellen Sie sicher, dass Sie es ./vor dem Skriptnamen verwenden und nur das Verzeichnis der Bibliotheken beibehalten. Wenn Sie mehrere Bibliotheken haben, verketten Sie den Pfad einfach mit Doppelpunkten.)

Methode 2) Schmutzige manuelle Methode mit Patch

Nach der Installation (mit nixenv -ioder in Ihrem configuration.nix) patchelfkönnen Sie die ausführbare Datei auch direkt ändern, um den richtigen Loader und die richtigen Bibliotheken zu packen. Um den Loader zu ändern, führen Sie einfach Folgendes aus:

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

und zu prüfen:

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

und um den Pfad zu den in der ausführbaren Datei fest codierten Bibliotheken zu ändern, prüfen Sie zuerst den aktuellen R-Pfad (bei mir leer):

$ patchelf --print-rpath wolframscript

und hängen Sie diese an den zuvor ermittelten Bibliothekspfad an, ggf. getrennt durch Doppelpunkte:

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

Methode 3) Patch in einer Nix-Ableitung

Wir können mehr oder weniger dasselbe in einer Nix-Ableitung reproduzieren, inspiriert vonSkype für Linux

Dieses Beispiel stellt auch eine Alternative dar. Sie können entweder Folgendes verwenden:

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

(was ziemlich klar sein sollte, sobald Sie die "manuelle" Methode verstanden haben) oder

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

Diese zweite Methode ist etwas subtiler, aber wenn Sie Folgendes ausführen:

$ 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

Sie werden sehen, dass die Datei $NIX_CC/nix-support/dynamic-linkereinen Pfad zum Loader enthält ld-linux-x86-64.so.2.

Setzen Sie ein derivation.nix, das ist

{ 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" ];
  };
}

und default.nixgeben Sie ein:

{ pkgs ? import <nixpkgs> {} }:

pkgs.callPackage ./derivation.nix {}

Kompilieren und ausführen mit

nix-build
result/bin/wolframscript

Methode 4) Verwenden Sie autoPatchElf: einfacher

Alle vorherigen Methoden erfordern ein wenig Arbeit (Sie müssen die ausführbaren Dateien finden, sie patchen usw.). NixOs hat für uns einen speziellen „Hook“ erstellt, autoPatchelfHookder alles automatisch für Sie patcht! Sie müssen ihn nur in angeben (native)BuildInputs, und Nix erledigt den Rest.

{ 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" ];
  };
}

Methode 5) Verwenden Sie FHS, um eine klassische Linux-Shell zu simulieren, und führen Sie die Dateien manuell aus

Manche Software kann schwierig sein, auf diese Weise zu verpacken, weil sie stark von derFHSDateibaumstruktur oder kann überprüfen, ob die Binärdateien unverändert sind. Sie können dann auch verwendenErstellen Sie FHSUserEnvum eine FHS-Dateistruktur (leichtgewichtig, unter Verwendung von Namespaces) für Ihre Anwendung bereitzustellen.Beachten Sie, dass diese Methode schwerer ist als die patchbasierten Methoden und die Startzeit erheblich verlängert. Vermeiden Sie sie daher nach Möglichkeit

Sie können entweder einfach eine Shell erstellen und dann das Archiv manuell extrahieren und die Datei ausführen oder Ihr Programm direkt für das FHS verpacken. Sehen wir uns zunächst an, wie man eine Shell erhält. Fügen Sie in eine Datei (sagen wir fhs-env.nix) Folgendes ein:

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

und Renn:

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

Sie erhalten dann eine Bash in einem standardmäßiger aussehenden Linux und können Befehle zum Ausführen Ihrer ausführbaren Datei ausführen, etwa:

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

Wenn Sie weitere Bibliotheken/Programme als Abhängigkeiten benötigen, fügen Sie sie einfach zu multiPkgs(für alle unterstützten Architekturen) oder targetPkgs(nur für die aktuelle Architektur) hinzu.

Bonus: Sie können eine FHS-Shell auch mit einem einzeiligen Befehl starten, ohne eine spezielle Datei zu erstellen:

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

Methode 6) Verwenden Sie FHS, um eine klassische Linux-Shell zu simulieren, und packen Sie die Dateien darin

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

Methode 7) Dampfbetrieb

Mit buildFHSUserEnvkönnen Sie viele Softwareprogramme ausführen, müssen aber alle erforderlichen Bibliotheken manuell angeben. Wenn Sie eine schnelle Lösung suchen und keine Zeit haben, genau zu prüfen, welche Bibliotheken erforderlich sind, können Sie Folgendes ausprobieren steam-run(trotz des Namens ist es nicht direkt mit Steam verknüpft und enthält nur viele Bibliotheken), das buildFHSUserEnvviele vorinstallierte allgemeine Bibliotheken enthält (einige davon sind möglicherweise nicht kostenlos, wie steamrtz. B. Nvidia-Code, danke, Simpson!). Um es zu verwenden, installieren Sie einfach steam-runund dann:

steam-run ./wolframscript

oder wenn Sie eine vollständige Shell möchten:

steam-run bash

Beachten Sie, dass Sie möglicherweise hinzufügen müssen nixpkgs.config.allowUnfree = true;(oder Whitelistdieses spezielle Paket), wenn Sie es mit installieren möchten nixos-rebuild, und wenn Sie es mit / ausführen/installieren möchten nix-shell, nix-envmüssen Sie { allowUnfree = true; }eingeben ~/.config/nixpkgs/config.nix.

Es ist nicht einfach, Pakete oder Bibliotheken in Nix-Shell zu „überschreiben“, wenn Sie jedoch einen Wrapper um Ihr Skript erstellen möchten, können Sie entweder manuell ein Wrapper-Skript erstellen:

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

oder schreiben Sie es direkt in eine Nixos-Ableitung:

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

oder wenn Sie von .deb aus starten (hier habe ich makeWrapperstattdessen verwendet):

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

(wenn Sie zu müde sind, um das Übliche zu schreiben default.nix, können Sie direkt loslegen nix-build -E "with import <nixpkgs> {}; callPackage ./derivation.nix {}")

Methode 8) Verwendennix-ld

Wenn Sie keine Sandbox erstellen möchten, wie wir es für Steam-Run getan haben (in Sandboxen ist es nicht möglich, Setuid-Apps auszuführen, Sandboxen können nicht verschachtelt werden, schlechte Integration mit den Systempaketen, die Direnv enthalten), können Sie den fehlenden Loader systemweit neu erstellen, indem Sie Folgendes einfügen configuration.nix:

  programs.nix-ld.enable = true;

Sie können sehen, dass die Datei jetzt vorhanden ist:

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

Es ist jedoch weiterhin nicht möglich, Binärdateien auszuführen, da die neue ld-linux-x86-64.so.2Datei nur zum Loader weiterleitet NIX_LD(auf diese Weise können mehrere Programme auf demselben System unterschiedliche Loader verwenden):

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

Um diese Umgebungsvariable lokal zu erstellen, können Sie Folgendes tun:

$ 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

oder systemweit mit:

(Warnung: seit dem letzten Nix-Update brauchen Sie nur programs.nix-ld.enable = true;, und Variablen können mithilfe von programs.nix-ld.libraries = with pkgs; [];anstelle von Umgebungsvariablen konfiguriert werden, aber der folgende Code sollte auch auf älteren Systemen funktionieren, daher lasse ich ihn hier)

  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";
  };

Beachten Sie, dass SieNeustartIhre X11-Sitzung jedes Mal, wenn Sie diese Datei ändern oder Folgendes tun:

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

Beachten Sie, dass (im Gegensatz zu steam-run) nix-ldstandardmäßig keine Bibliothek mitgeliefert wird (das stimmt eigentlich nicht mehr, siehe den Hinweis oben in dieser Datei, um die modernere Schnittstelle mit einer Standardliste zu verwenden … die Liste ist jedoch recht klein), aber Sie können Ihre eigene hinzufügen oder Tools verwenden, die das automatisch tun, siehe unten. Sie können sich auch von der Liste der Bibliotheken inspirieren lassen, die Steam-Pakete hier ausführen:https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nixHier ist zum Beispiel die Datei, die ich jetzt verwende. Sie reicht aus, um Blender/Electron auszuführen:

  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";
  };  

Sie können auch den Namen der Bibliotheken finden, siehe oben nix-index. Sie können auchNix-Alien-LDoderNix-Autobahnum die Bibliotheken automatisch zu finden und zu laden. Beachten Sie, dass Sie, wenn Sie nicht die richtigen Bibliotheken haben, eine Fehlermeldung wie

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

Sie können alle Bibliotheken, die noch nicht verfügbar sind, auf einen Blick sehen mit:

$ 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

Methode 9) Nix-Alien

Nix-Alienerstellt automatisch ein FHS mit den entsprechenden Bibliotheken. Wenn Sie flake aktiviert haben (andernfalls fügen Sie einfach replace nix runwith hinzu nix --extra-experimental-features "nix-command flakes" run), können Sie es einfach so ausführen (nix-alien ist im Jahr 2022 noch nicht gepackt)

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

Anschließend wird die Bibliothek automatisch mithilfe des Nix-Index gefunden, und im Zweifelsfall werden Ihnen einige Fragen gestellt (dies wird zwischengespeichert). Bildbeschreibung hier eingeben

Beachten Sie, dass Programme, die auf OpenGl angewiesen sind,nixGlausführen (das gilt sicherlich auch für andere Methoden hier):

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

Beachten Sie, dass Sie möglicherweise die Version ändern müssen, nixos-21.11um sicherzustellen, dass die OpenGL-Version mit Ihrem Programm übereinstimmt.

Beachten Sie, dass Sie auch die automatisch generierte Datei sehen können (der Pfad wird beim ersten Ausführen des Programms angegeben):

$ 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";
}

Siehe auch die andere Version, die mit nix-ld funktioniert undNix-Autobahn.

Methode 9) Verwendung von Containern/Docker (schwerer)

MACHEN

Beachten Sie, dass das ProjektVerteilerboxermöglicht Ihnen die einfache Erstellung neuer Container, die eng in den Host integriert sind und jede gewünschte Distribution installieren.

Methode 10) Verlassen Sie sich auf Flatpack/Appimage

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

appimage-run: Zum Testen mit z. B. musescore

Quellen oder Beispiele

Für Leute, die mit dem Verpacken anfangen möchten, habe ich kürzlich ein ähnliches Tutorial geschriebenHier.

verwandte Informationen