制作一个与 NixOS 兼容的简单 Deb 包(Mathematica 的 Wolframscript)

Geo*_*rge 5 nixos deb

考虑这个简单的 debian 软件包:wolframscript.deb(要检查,您必须单击 Linux 的下载链接)。解压后,文件结构如下:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 opt\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Wolfram\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WolframScript\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wolframscript\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 usr\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 local\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 share\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 man\n    \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 man1\n    \xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wolframscript.1\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 share\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 icons\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 hicolor\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 128x128\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mimetypes\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.png\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 32x32\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mimetypes\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.png\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 64x64\n        \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mimetypes\n        \xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.png\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mime\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 packages\n                \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.xml\n
Run Code Online (Sandbox Code Playgroud)\n\n

唯一相关的文件是opt/Wolfram/WolframScript/bin/wolframscript二进制文件(我认为)。我尝试简单地执行此操作,但出现错误bash: ./wolframscript: No such file or directory。如何使这个二进制文件/包在 NixOS 中可用?

\n\n

编辑:回答@muru的问题:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 opt\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Wolfram\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WolframScript\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wolframscript\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 usr\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 local\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 share\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 man\n    \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 man1\n    \xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wolframscript.1\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 share\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 icons\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 hicolor\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 128x128\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mimetypes\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.png\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 32x32\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mimetypes\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.png\n        \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 64x64\n        \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mimetypes\n        \xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.png\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mime\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 packages\n                \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application-vnd.wolfram.wls.xml\n
Run Code Online (Sandbox Code Playgroud)\n\n
$ file opt/Wolfram/WolframScript/bin/wolframscript\nopt/Wolfram/WolframScript/bin/wolframscript: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib\n
Run Code Online (Sandbox Code Playgroud)\n

tob*_*ora 6

我在这里提供了解决您的问题的方法的完整列表以及示例文件。两种更有效的方法是autoPatchelfHook(首选,如 Vladim\xc3\xadr \xc4\x8cun\xc3\xa1t 建议的那样),或者最终steam-run(基于buildFHSUserEnv很多默认库)当您最想要快速和-脏修复。

\n\n

这是一个快速总结:

\n\n

正确的方法与autoPatchelfHook

\n\n

NixOs 为我们做了一个特殊的“钩子” autoPatchelfHook,可以自动为您修补所有内容!您只需在 中指定它(native)BuildInputs,然后 nix 就会发挥作用。普京derivation.nix

\n\n
{ stdenv, dpkg, glibc, gcc-unwrapped, autoPatchelfHook }:\nlet\n\n  # Please keep the version x.y.0.z and do not update to x.y.76.z because the\n  # source of the latter disappears much faster.\n  version = "12.0.0";\n\n  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;\n\nin stdenv.mkDerivation {\n  name = "wolframscript-${version}";\n\n  system = "x86_64-linux";\n\n  inherit src;\n\n  # Required for compilation\n  nativeBuildInputs = [\n    autoPatchelfHook # Automatically setup the loader, and do the magic\n    dpkg\n  ];\n\n  # Required at running time\n  buildInputs = [\n    glibc\n    gcc-unwrapped\n  ];\n\n  unpackPhase = "true";\n\n  # Extract and copy executable in $out/bin\n  installPhase = \'\'\n    mkdir -p $out\n    dpkg -x $src $out\n    cp -av $out/opt/Wolfram/WolframScript/* $out\n    rm -rf $out/opt\n  \'\';\n\n  meta = with stdenv.lib; {\n    description = "Wolframscript";\n    homepage = https://www.wolfram.com/wolframscript/;\n    license = licenses.mit;\n    maintainers = with stdenv.lib.maintainers; [ ];\n    platforms = [ "x86_64-linux" ];\n  };\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并在default.nix

\n\n
{ pkgs ? import <nixpkgs> {} }:\n\npkgs.callPackage ./derivation.nix {}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译并运行

\n\n
nix-build\nresult/bin/wolframscript\n
Run Code Online (Sandbox Code Playgroud)\n\n

更快的方法,与steam-run

\n\n

Nix 提供了buildFHSUserEnv伪造经典 Linux 的功能。您可以直接使用它并向其中添加库,或者如果您愿意,它steam-run已经包含很多库(尽管它的名称与 Steam 无关)。请注意,此方法较重并且需要较长的启动时间,因此请尽可能避免使用。

\n\n

您只需要安装steam-run(您需要允许非自由软件,使用{ allowUnfree = true; }in~/.config/nixpkgs/config.nix或如果您使用nixos-rebuild,请在您的configuration.nix行中使用nixpkgs.config.allowUnfree = true;),然后运行:

\n\n
steam-run ./wolframscript\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关更多详细信息,请参阅在 Nixos 上运行非 nixos 可执行文件的不同方法

\n