方法 1) パッチなしの汚い手動方法

方法 1) パッチなしの汚い手動方法

NixOs 上で非 nixos 実行可能ファイルを実行するにはどのような方法がありますか? (たとえば、独自のバイナリなど) 手動の方法も知りたいです。

答え1

関連する回答

バイナリをパッケージ化して実行するだけでなく、パッケージ化する予定の場合は、次の私の他の回答が役立つかもしれません。ソフトウェアを nix でパッケージ化する方法、または nixpkgs 用の独自のパッケージ派生を作成する方法

短縮版

簡単に言うと、steam-runがインストールされていることを確認します (奇妙な名前ですが、Steam とは何の関係もありません)。例nix-shell -p steam-run:

$ steam-run ./your-binary

この回答の作成以来、蒸気実行に代わる他の代替手段が開発されてきました。たとえば、現在はNixOsの一部となっているもの(基本的には…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 を使用すると自動的に)、適切なライブラリを直接ポイントするようにします。
  • FHS に基づく方法は、基本的に「通常の Linux」を偽装します (パッチを適用したバージョンよりも実行が重いため、可能であればこれを避ける必要があります)。

実際の適切なセットアップには方法 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データベースをインストールして生成します (これは最初の 1 回だけ必要ですが、実行には数分かかることがあります)。

$ 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) パッチを使ったダーティマニュアル法

をインストールした後 ( またはnixenv -iconfiguration.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を使用する: よりシンプル

これまでの方法はすべて、少しの作業が必要です (実行可能ファイルを見つけて、パッチを適用する必要があります...)。NixOs は、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ファイルツリー構造をチェックしたり、バイナリが変更されていないか確認したりすることもできます。ビルドFHSUserEnvアプリケーションに 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-shellnix-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-run の場合のようにサンドボックスを生成したくない場合は (サンドボックスでは 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 がパックするライブラリのリストを参考にすることもできます。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 を自動的に構築します。flake が有効になっている場合 (そうでない場合は、置き換えを追加するだけ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.11OpenGl のバージョンがプログラムと一致するようにするには、のバージョンを変更する必要があることに注意してください。

自動的に生成されたファイルも確認できることに注意してください (パスはプログラムを初めて実行したときに指定されます)。

$ 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 などでテストする

出典または例

また、パッケージングを始めたい人のために、最近同様のチュートリアルを書きました。ここ

関連情報