AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 520675
Accepted
George
George
Asked: 2019-05-24 08:14:42 +0800 CST2019-05-24 08:14:42 +0800 CST 2019-05-24 08:14:42 +0800 CST

使一个简单的 Deb 包 NixOS 兼容(Mathematica 的 wolframscript)[重复]

  • 772
这个问题在这里已经有了答案:
在 Nixos 上运行非 nixos 可执行文件的不同方法 1 个答案
3年前关闭。

考虑这个简单的 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
nixos deb
  • 2 2 个回答
  • 2357 Views

2 个回答

  • Voted
  1. Best Answer
    tobiasBora
    2019-06-06T16:06:09+08:002019-06-06T16:06:09+08:00

    我在这里提供了解决您的问题的方法的完整列表,并带有示例文件。两种更有效的方法是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 可执行文件的不同方法

    • 5
  2. Vladimír Čunát
    2019-05-25T08:14:00+08:002019-05-25T08:14:00+08:00

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

    • 1

相关问题

  • 如何从 Live CD 重建 NixOS 安装的配置?

  • DEB:多包,在包构建过程中忽略某些文件的安装

  • 将 $NIX_PATH 指向 ~/.nix-defexpr/channels

  • 仅检测一次扫描仪

  • 使用完整的根分区清理 nixos 上的包管理器缓存

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve