首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使一个简单的Deb软件包NixOS兼容(Mathematica的wolframscript)

使一个简单的Deb软件包NixOS兼容(Mathematica的wolframscript)
EN

Unix & Linux用户
提问于 2019-05-23 16:14:42
回答 2查看 3K关注 0票数 5

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

代码语言:javascript
复制
├── 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的问题:

代码语言:javascript
复制
$ 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
代码语言:javascript
复制
$ 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
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-06-06 00:06:09

我介绍了解决问题的方法的这是一份完整的清单,并提供了示例文件。两种更有效的方法是autoPatchelfHook (正如VladimírČunát所建议的那样),或者是steam-run (基于buildFHSUserEnv和lot's的默认库),而此时你最想要的是快速和肮脏的修复。

以下是一个简短的总结:

真方法与autoPatchelfHook

NixOs为我们做了一个特殊的“钩子”autoPatchelfHook,自动为您修补所有的东西!您只需要在(native)BuildInputs中指定它,而nix就可以实现它的魔力。放入derivation.nix

代码语言:javascript
复制
{ 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中:

代码语言:javascript
复制
{ pkgs ? import  {} }:

pkgs.callPackage ./derivation.nix {}

编译和运行

代码语言:javascript
复制
nix-build
result/bin/wolframscript

快速方法,使用steam-run

Nix提供了伪造经典linux的buildFHSUserEnv。您可以直接使用它并将库添加到其中,或者如果您愿意的话,steam-run包含了大量的库(尽管它的名称与蒸汽无关)。请注意,此方法更重,需要更长的启动时间,因此在可能的情况下避免使用它。

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

代码语言:javascript
复制
steam-run ./wolframscript

如需详细信息,请参阅在Nixos上运行非Nixos可执行文件的不同方法.

票数 6
EN

Unix & Linux用户

发布于 2019-05-24 16:14:00

我希望最好创建一个简单的nix表达式,将这个deb作为输入,然后解压缩它,这样您就可以“以nix方式”安装它(例如,在路径本身之前不会删除依赖项)。当您这样做时,将autoPatchelfHook添加到buildInputs中应该会修复这些缺失的引用。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/520675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档