Deb

製作一個與 NixOS 兼容的簡單 Deb 包(Mathematica 的 wolframscript)

  • June 7, 2019

考慮這個簡單的 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 your configuration.nixline nixpkgs.config.allowUnfree = true;),然後執行:

steam-run ./wolframscript

有關更多詳細資訊,請參閱在 Nixos 上執行非 nixos 執行檔的不同方法

引用自:https://unix.stackexchange.com/questions/520675