方法1)髒手工方法,無補丁

方法1)髒手工方法,無補丁

在 NixOs 上執行非 nixos 執行檔有哪些不同的方法? (例如專有二進位檔案。)我還想查看手動方法。

答案1

相關答案

如果您打算打包二進位檔案而不僅僅是運行它,您可能會喜歡我的另一個答案:如何在 nix 中打包我的軟體或為 nixpkgs 編寫我自己的套件派生

簡潔版本

快速而骯髒:確保steam-run已安裝(奇怪的名字,它與蒸汽無關),例如nix-shell -p steam-run,然後:

$ steam-run ./your-binary

自從創建這個答案以來,已經開發了 steam-run 的其他替代方案,例如,它現在是 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/.

這個清單給出了我迄今為止找到的所有方法。基本上有三個「群體」:

  • 完整手冊:對於教育目的很有趣,並且了解正在發生的事情,但僅此而已(不要在實踐中使用它們,因為沒有什麼可以阻止稍後用於垃圾收集的派生)
  • 修補版本:這些方法嘗試修改可執行檔(在將建議的方法 4 與 autoPatchelfHook 一起使用時自動修改)以直接指向好的庫
  • 基於FHS的方法,基本上偽造了一個「正常的linux」(比修補版本運行起來更繁重,所以如果可能的話應該避免這種情況)。

我建議使用方法 4autoPatchelfHook進行真正、正確的設置,如果您沒有時間而只想在一行中運行二進位文件,您可能會對基於steam-run(方法 7 )。

方法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

您還需要找到您的程式所需的程式庫,例如使用lddLD_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)髒手工法,附補丁

安裝後(使用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 版 Skype

此範例還提供了一種替代方案,您可以使用:

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

第二種方法有點微妙,但如果你運行:

$ 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 shell,並手動執行文件

有些軟體可能很難以這種方式打包,因為它們可能嚴重依賴FHS文件樹結構,或者可以檢查二進位檔案是否未更改。然後您也可以使用建置FHSUserEnv為您的應用程式提供 FHS 檔案結構(輕量級,使用命名空間)。請注意,此方法比基於補丁的方法更重,並且會增加大量啟動時間,因此請盡可能避免使用它

您可以只產生一個 shell,然後手動提取存檔並執行文件,或直接將程式打包到 FHS。我們先來看看如何獲得shell。將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(僅對於目前架構)。

額外的好處:您還可以使用一行命令啟動 fhs shell,而無需建立特定的檔案:

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

方法6)使用FHS模擬經典的linux shell,並將裡面的檔案打包

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

方法7)蒸汽運行

buildFHSUserEnv可以運行很多軟體,但您需要手動指定所有必需的庫。如果你想要一個快速的解決方案,並且沒有時間精確檢查所需的庫,你可能想嘗試一下steam-run(儘管有這個名字,但它並沒有直接與steam鏈接,只是打包了很多庫),這是就像buildFHSUserEnv預先安裝的許多通用庫一樣(其中一些可能是非免費的,就像steamrt打包了一些 nvidia 程式碼一樣,謝謝辛普森!)。要使用它,只需安裝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-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-runnix-ld默認情況下不附帶任何庫(實際上,這不再是真的,請參閱此文件頂部的註釋以使用帶有默認列表的更現代的界面......但該清單非常小)但您可以新增自己的或使用工具自動執行此操作,請參見下文。您還可以從 steam-run 打包的庫列表中獲得靈感:https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nix例如,這是我現在使用的文件,足以運行攪拌機/電子:

  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 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

請注意,您可能需要變更 openGl 的版本nixos-21.11以確保 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 進行測試

來源或範例

另外,對於想要開始打包的人,我最近寫了一個類似的教學這裡

相關內容