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-run
dass 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-ld
das 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-ld
wirklich 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. autoPatchelfHook
Wenn 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 ldd
oder 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-index
Programm, um nach diesen Dateien in einer viel größeren Datenbank zu suchen (danke Hydra). Dazu installieren nix-index
und 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 yourlib
um die Neuerstellung der Datenbank lokal zu vermeiden. Siehe auch nix-index-update
vonNix-Alienzum automatischen Herunterladen des Cache vonNix-Index-Datenbank) Um dann nach einer Bibliothek zu suchen, können Sie Folgendes tun (beachten Sie, dass --top-level
dadurch 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_PATH
Konfiguration ausführen, dass es auf diese Datei verweist (siehe auch „ makeLibraryPath
Diesen 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 -i
oder in Ihrem configuration.nix
) patchelf
kö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-linker
einen 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.nix
geben 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, autoPatchelfHook
der 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 buildFHSUserEnv
kö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 buildFHSUserEnv
viele vorinstallierte allgemeine Bibliotheken enthält (einige davon sind möglicherweise nicht kostenlos, wie steamrt
z. B. Nvidia-Code, danke, Simpson!). Um es zu verwenden, installieren Sie einfach steam-run
und 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-env
mü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 makeWrapper
stattdessen 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.2
Datei 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-ld
standardmäß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 run
with 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).
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.11
um 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
- https://github.com/NixOS/nixpkgs/blob/5a9eaf02ae3c6403ce6f23d33ae569be3f9ce644/pkgs/applications/video/lightworks/default.nix
- https://sandervanderburg.blogspot.com/2015/10/deploying-prebuilt-binary-software-with.html
- https://github.com/NixOS/nixpkgs/blob/35c3396f41ec73c5e968a11f46d79a94db4042d7/pkgs/applications/networking/dropbox/default.nix
Für Leute, die mit dem Verpacken anfangen möchten, habe ich kürzlich ein ähnliches Tutorial geschriebenHier.