製作一個與 NixOS 兼容的簡單 Deb 包(Mathematica 的 wolframscript)
考慮這個簡單的 debian 軟體包:wolframscript.deb(要檢查,您必須點擊 Linux 的下載連結)。解壓後文件結構如下:
├── opt │ └── Wolfram │ └── WolframScript │ └── bin │ └── wolframscript └── usr ├── local │ └── share │ └── man │ └── man1 │ └── wolframscript.1 └── share ├── icons │ └── hicolor │ ├── 128x128 │ │ └── mimetypes │ │ └── application-vnd.wolfram.wls.png │ ├── 32x32 │ │ └── mimetypes │ │ └── application-vnd.wolfram.wls.png │ └── 64x64 │ └── mimetypes │ └── application-vnd.wolfram.wls.png └── mime └── packages └── application-vnd.wolfram.wls.xml
唯一相關的文件是
opt/Wolfram/WolframScript/bin/wolframscript
二進製文件(我認為)。我嘗試簡單地執行此操作,但出現bash: ./wolframscript: No such file or directory
錯誤。如何使這個二進制/包在 NixOS 中可用?**編輯:**回答@muru 的問題:
$ file opt/Wolfram/WolframScript/bin/wolframscript opt/Wolfram/WolframScript/bin/wolframscript: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib
$ ldd opt/Wolfram/WolframScript/bin/wolframscript linux-vdso.so.1 (0x00007fff767c9000) libpthread.so.0 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libpthread.so.0 (0x00007f55b8525000) librt.so.1 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/librt.so.1 (0x00007f55b831d000) libdl.so.2 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libdl.so.2 (0x00007f55b8119000) libstdc++.so.6 => not found libm.so.6 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libm.so.6 (0x00007f55b7d84000) libgcc_s.so.1 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libgcc_s.so.1 (0x00007f55b7b6e000) libc.so.6 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libc.so.6 (0x00007f55b77ba000) /lib64/ld-linux-x86-64.so.2 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib64/ld-linux-x86-64.so.2 (0x00007f55b874400
我在這裡提供了解決您的問題的方法的完整列表,並帶有範例文件。兩種更有效的方法是
autoPatchelfHook
(首選,正如 Vladimír Čunát 所建議的那樣),或者最終steam-run
(基於buildFHSUserEnv
大量預設庫),當您最想要快速修復時。這是一個快速的總結:
正確的方法與
autoPatchelfHook
NixOs 為我們做了一個特殊的“鉤子”
autoPatchelfHook
,它會自動為您修補所有內容!您只需要在 中指定它(native)BuildInputs
,然後 nix 就可以了。放入derivation.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" ]; }; }
並在
default.nix
:{ pkgs ? import <nixpkgs> {} }: pkgs.callPackage ./derivation.nix {}
編譯並執行
nix-build result/bin/wolframscript
更快的方法,與
steam-run
Nix 提供
buildFHSUserEnv
了偽造經典 linux 的方法。您可以直接使用它並將庫添加到其中,或者如果您更喜歡steam-run
已經包含很多庫(儘管它的名稱獨立於 steam)。請注意,此方法較重且需要更長的啟動時間,因此請盡可能避免使用。你只需要安裝
steam-run
(你需要允許非自由軟體,使用{ allowUnfree = true; }
in~/.config/nixpkgs/config.nix
或者如果你使用nixos-rebuild
,使用 in yourconfiguration.nix
linenixpkgs.config.allowUnfree = true;
),然後執行:steam-run ./wolframscript
有關更多詳細資訊,請參閱在 Nixos 上執行非 nixos 執行檔的不同方法