NixOでnixos以外の実行可能ファイルを実行する他の方法は何ですか? (例:独自のバイナリ。)手動アプローチも見たいです。
答え1
関連回答
バイナリを実行する代わりにパッケージ化する予定の場合は、次の答えが気に入るでしょう。私のソフトウェアをnixにパッケージ化したり、nixpkgs用のパッケージフォークを直接作成する方法
簡潔なバージョン
速くて厄介です。steam-run
インストールされていることを確認してください(奇妙な名前、Steamとは関係ありません)。たとえば、次のようにnix-shell -p steam-run
なります。
$ steam-run ./your-binary
この回答が書かれて以来、蒸気の実行の他の代替案が開発されました。たとえば、NixOの一部です(デフォルトでnix-ld
失われたローダーを再生成...)。/lib
高度にパッチが適用されなくなったバイナリの実行を心配する必要がなくなるように、一度に設定することをお勧めします。これにより、頭痛なしにNPMなどを使用できます。
(警告する: 最近の nix アップデート以降はprograms.nix-ld.enable = true;
、構成変数のみ使用できます。
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 ]);
環境変数は自動的に設定されますが、以下のコードは以前のシステムでも機能します。テストするのと同じくらい最近ではありません。
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";
};
しかもニックスエイリアン/ニックス高速道路また、欠落しているライブラリを自動的に追加しようとします。最後に使えます配電箱ホストと緊密に統合されたdocker / podmanコンテナへの展開を提供します。しかし、私の経験では、nix-ld
実際に透明なものよりも使用する方がはるかに複雑です。
これには、より長く詳細な説明と一般的に汚れが少ないさまざまな方法があります。
長いバージョン
これにはいくつかの方法があります(ほとんどの場合、正しい派生語を書く方が良いので、手動の方法は主に教育目的で使用されます)。私はまったく専門家ではなく、nixを学ぶためにこのリストを作成しました。もっと良い方法があれば教えてください!
したがって、主な問題は、実行可能ファイルが最初にローダーを呼び出してから機能するためにいくつかのライブラリが必要であるのに対して、nixosはローダーとライブラリの両方です/nix/store/
。
このリストには、これまで私が見つけたすべての方法がリストされています。基本的には3つの「グループ」があります。
- 完全なマニュアル:教育目的と何が起こっているのかを理解するのに興味がありますが、それ以上ではありません。 (後でガベージコレクションにフォークを使用するのを防ぐことはありません。実際には使用しないでください。)
- パッチバージョン:これらのメソッドは、良いライブラリを直接指すように実行可能ファイルを修正しようとします(autoPatchelfHookで推奨方法4を使用すると自動的に変更されます)。
- 基本的には、「一般的なLinux」を偽造するFHSベースのアプローチです(パッチされたバージョンよりも実行するのが難しいので、可能であれば避けるべきです)。
実際の正しい設定のために方法4を使用することをお勧めします。時間が足りず、バイナリを1行で実行したい場合(方法7)にautoPatchelfHook
基づいてタスクを実行できます。steam-run
方法1)汚れた手動方法、パッチなし
まずローダーを探す必要があります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
ここにローダーがあります/lib64/ld-linux-x86-64.so.2
。 nixos用のローダーを見つけるには、次のようにします。
$ ls /nix/store/*glibc*/lib/ld-linux-x86-64.so.2
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2
ldd
また、例えば、または以下を使用して、プログラムに必要なライブラリーを見つける必要があります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)
ここでは...を除くほとんどのライブラリが見つかったことがわかりますlibstdc++.so.6
。今見てみましょう!これを見つける最初の迅速で汚れた方法は、システムにすでに存在していることを確認することです。
$ find /nix/store -name libstdc++.so.6
/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/libstdc++.so.6
まだライブラリをインストールしていない場合は、確かにより洗練されたライブラリを使用することをお勧めします。nix-index
プログラムは大きなデータベースからこれらのファイルを検索します(Hydraのおかげで)。これを行うには、まずnix-index
データベースをインストールして作成します(最初にのみ必要ですが、実行には数分かかることがあります)。
$ nix-index
nix run github:mic92/nix-index-database yourlib
(データベースのローカル再作成を防ぐためにもnix-index-update
使用できます。ニックスエイリアン自動ダウンロードキャッシュnix インデックスデータベース)その後、ライブラリを検索するには、次の操作を実行できます(--top-level
一部の項目の削除を参照)。
$ 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
…
その後、この迅速で簡単な例のためにこれらのライブラリをインストールできます(後でより良い解決策を見てみましょう)。
さて、LD_LIBRARY_PATH
ファイルを指すように設定されたプログラムを実行し(派生からのmakeLibraryPath
文字列の生成を参照)、ファイルの最初のステップで識別されたローダを呼び出すだけです。
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
(スクリプト名の前に必ず来て、ライブラリ./
のディレクトリだけを保持してください。ライブラリが複数ある場合は、パスをコロンで連結するだけです。)
方法2)パッチを使用したDirtyの手動方法
インストール後(nixenv -i
または使用configuration.nix
)patchelf
実行可能ファイルを直接変更して、ローダーとライブラリをパッケージ化することもできます。ローダーを変更するには:
patchelf --set-interpreter /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 wolframscript
そして確認してください:
$ patchelf --print-interpreter wolframscript
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.
実行可能ファイルにハードコードされたライブラリへのパスを変更するには、まず現在のrpathが何であるかを確認してください(私は空でした)。
$ patchelf --print-rpath wolframscript
以前に決定したライブラリパスに追加し、最後にコロンで区切ります。
$ patchelf --set-rpath /nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/ wolframscript
$ ./wolframscript
方法 3) nix 派生物にパッチを適用する
私たちは、以下からインスピレーションを得て、nix派生から同じものをある程度再現できます。Linux用スカイプ
この例では、利用可能な代替方法も提供します。
patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true
(「手動」アプローチを理解すると、この内容は非常に明確になります。)
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true
2番目の方法はもう少し微妙ですが、次のように実行すると:
$ 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
ファイルに$NIX_CC/nix-support/dynamic-linker
ローダーへのパスが含まれていることがわかりますld-linux-x86-64.so.2
。
代替derivation.nix
、これは
{ 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" ];
};
}
そしてdefault.nix
以下を入力してください:
{ pkgs ? import <nixpkgs> {} }:
pkgs.callPackage ./derivation.nix {}
コンパイルと実行
nix-build
result/bin/wolframscript
方法4)autoPatchElfの使用:より簡単
以前のすべての方法には少しの作業が必要です(実行ファイルを見つけてパッチを適用する必要があります...)。 NixOはautoPatchelfHook
すべてを自動的にパッチする特別な「フック」を作成しました!ちょうど指定すると、(native)BuildInputs
nixはそれを行います。
{ 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" ];
};
}
方法5)FHSを使用して古典的なLinuxシェルをシミュレートし、ファイルを手動で実行します。
一部のソフトウェアは、次のようにパッケージ化するのが難しい場合があります。FHSファイルツリー構造またはバイナリファイルが変更されていないことを確認できます。その後、使用することもできますBuildFHSUserEnvアプリケーションにFHSファイル構造(軽量、名前空間を使用)を提供します。この方法はパッチベースの方法よりも重く、かなりの開始時間が追加されるため、可能であれば使用しないでください。
シェルを作成し、手動でアーカイブを抽出してファイルを実行したり、プログラムをFHSに直接パッケージ化したりできます。まず、殻を取得する方法を見てみましょう。以下をファイルに入れますfhs-env.nix
(例:)。
let nixpkgs = import <nixpkgs> {};
in nixpkgs.buildFHSUserEnv {
name = "fhs";
targetPkgs = pkgs: [];
multiPkgs = pkgs: [ pkgs.dpkg ];
runScript = "bash";
}
そして、以下を実行してください:
nix-build fhs-env.nix
result/bin/fhs
その後、より標準的なLinuxでbashを取得し、次の実行可能ファイルを実行するコマンドを実行できます。
mkdir wolf_fhs/
dpkg -x WolframScript_12.0.0_LINUX64_amd64.deb wolf_fhs/
cd wolf_fhs/opt/Wolfram/WolframScript/bin/
./wolfram
multiPkgs
依存関係でより多くのライブラリ/プログラムが必要な場合(サポートされているすべてのアーキテクチャについて)またはtargetPkgs
(現在のアーキテクチャのみ)に追加してください。
ボーナス:特定のファイルを生成せずに1行のコマンドでfhsシェルを起動することもできます。
nix-build -E '(import <nixpkgs> {}).buildFHSUserEnv {name = "fhs";}' && ./result/bin/fhs
方法6)FHSを使用して古典的なLinuxシェルをシミュレートし、その中にファイルをパッケージ化します。
源泉:https://reflexivereflection.com/posts/2015-02-28-deb-installation-nixos.html
方法7)蒸気運転
buildFHSUserEnv
多くのソフトウェアを実行できますが、必要なすべてのライブラリを手動で指定する必要があります。迅速な解決策が必要で、正確にどのライブラリが必要かを確認する時間がない場合は、試してみることもできますsteam-run
(名前にもかかわらず、Steamに直接接続せず、多くのライブラリをパッケージ化するだけです)。プレインストールされている多くの一般的なライブラリのようにbuildFHSUserEnv
(それらのいくつかはNvidiaコードパッケージのように無料ではないかもしれませsteamrt
んsteam-run
。
steam-run ./wolframscript
またはフルシェルが必要な場合:
steam-run bash
nixpkgs.config.allowUnfree = true;
追加 (またはホワイトリスト) する必要があります。この特別なパッケージ)を使用してインストールするにはnixos-rebuild
、/を使用して実行/インストールするには、を入力する必要がありますnix-shell
。nix-env
{ allowUnfree = true; }
~/.config/nixpkgs/config.nix
パッケージやライブラリをnix-shellに「上書きする」のは簡単ではありませんが、スクリプト用のラッパーを作成したい場合は、ラッパースクリプトを手動で生成できます。
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p steam-run
exec steam-run ./wolframscript "$@"
または、 nixos 派生として直接作成します。
{ stdenv, steam-run, writeScriptBin }:
let
src = ./opt/Wolfram/WolframScript/bin/wolframscript;
in writeScriptBin "wolf_wrapped_steam" ''
exec ${steam-run}/bin/steam-run ${src} "$@"
''
または.debで始まる場合(ここではこれを使用していますmakeWrapper
):
{ 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
'';
}
(書くのが疲れすぎたら、default.nix
ただ走ってもいいですnix-build -E "with import <nixpkgs> {}; callPackage ./derivation.nix {}"
)
方法8)使用nix-ld
Steamの実行で行ったようにサンドボックスを作成したくない場合(サンドボックスでsetuidアプリケーションを実行できず、サンドボックスを入れ子にできず、direnvを含むシステムパッケージとの統合が悪い)、欠落しているアイテムを再生成するできます。ローダーシステム - 次のように入力しますconfiguration.nix
。
programs.nix-ld.enable = true;
これでファイルが存在することがわかります。
$ ls /lib64/
ld-linux-x86-64.so.2
ld-linux-x86-64.so.2
ただし、新しいファイルはローダーにのみリダイレクトされるため、バイナリを実行することはできませんNIX_LD
(したがって、複数のプログラムが同じシステム上で異なるローダーを使用できる)。
$ ./blender
cannot execute ./blender: NIX_LD or NIX_LD_x86_64-linux is not set
この環境変数をローカルにするには、次のようにします。
$ 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
またはシステム全体で使用してください。
(警告する:最近のnixアップデート以降は、環境変数を使用して変数を設定する代わりに必要となりprograms.nix-ld.enable = true;
ますが、programs.nix-ld.libraries = with pkgs; [];
以下のコードはレガシーシステムでも動作しますので、ここに入れます)
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";
};
必要な点を参考にしてください再起動このファイルを変更するか、次の操作を行うたびに、X11 セッションは次のようになります。
$ cat /etc/profile | grep set-environment
. /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
$ . /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
steam-run
基本的にライブラリが提供されていないことに注意してくださいnix-ld
(実際にはもはや真実ではありません。基本リストでより現代的なインターフェイスを使用するには、このファイルの上部の説明を参照してください...しかしリストは非常に小さいです)。自分で追加したり、ツールを使用して自動化したりできます。下記をご覧ください。 Steam-runがパッケージとして提供するライブラリのリストからインスピレーションを得ることもできます。https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nixたとえば、これは私が今使っているファイルです。このファイルは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";
};
ライブラリ名を見つけることもできます(上記を参照)nix-index
。また、使用することができますニックスエイリアンLDまたはニックス高速道路ライブラリは自動的に見つけてロードされます。正しいライブラリがないと、次のエラーが発生します。
$ ./blender
./blender: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory
次のコマンドを使用すると、まだ利用できないすべてのライブラリをすぐに表示できます。
$ 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
…
方法9)nix-alien
ニックスエイリアン適切なライブラリを使用してFHSを自動的に構築します。フレークを有効にした場合は、単にこの方法で実行できます(それ以外の場合は代替項目を追加するだけですnix run
)nix --extra-experimental-features "nix-command flakes" run
(nix-alienはまだ2022年にパッケージされていません)。
nix run github:thiagokokada/nix-alien -- yourprogram
次に、自動的にnix-indexを使用してライブラリを見つけて、わからない場合はいくつかの質問をします(キャッシュ済み)。
OpenGlを使用するプログラムは、次のものを使用する必要があります。ニックスGL実行(もちろん、ここの他のメソッドにも適用されます):
nix run --impure github:guibou/nixGL --override-input nixpkgs nixpkgs/nixos-21.11 -- nix run github:thiagokokada/nix-alien -- blender
nixos-21.11
OpenGlのバージョンをプログラムと一致させるには、OpenGlのバージョンを変更する必要があるかもしれません。
自動的に生成されたファイルも表示されます(パスは、プログラムが最初に実行されたときに提供されます)。
$ 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";
}
他のバージョンのnix-ldの使用も参照してください。ニックス高速道路。
方法9)コンテナ/Dockerの使用(重さ)
太陽
今回のプロジェクトは参考にしてください配電箱必要なディストリビューションがインストールされているホストと緊密に統合された新しいコンテナを簡単に作成できます。
方法10)flatpack / appimageに依存
https://nixos.org/nixos/manual/index.html#module-services-Flatpak
appimage-run: musescore を使用してテストします。
ソースまたは例
- https://github.com/NixOS/nixpkgs/blob/5a9eaf02ae3c6403ce6f23d33ae569be3f9ce644/pkgs/applications/video/lightworks/default.nix
- https://sandervanderburg.blogspot.com/2015/10/deploying-prebuild-binary-software-with.html
- https://github.com/NixOS/nixpkgs/blob/35c3396f41ec73c5e968a11f46d79a94db4042d7/pkgs/applications/networking/dropbox/default.nix
また、パッケージングを始めたい人のために、最近同様のチュートリアルを書いています。ここ。