方法1)汚れた手動方法、パッチなし

方法1)汚れた手動方法、パッチなし

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.nixpatchelf実行可能ファイルを直接変更して、ローダーとライブラリをパッケージ化することもできます。ローダーを変更するには:

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)BuildInputsnixはそれを行います。

{ 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コードパッケージのように無料ではないかもしれませsteamrtsteam-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の実行で行ったようにサンドボックスを作成したくない場合(サンドボックスで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 runnix --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のバージョンをプログラムと一致させるには、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 を使用してテストします。

ソースまたは例

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

関連情報