次の簡単な 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
ベストアンサー1
私が紹介した完全なリストは次のとおりです。サンプルファイルで問題の解決策を提供します。 2つのより効率的な方法はautoPatchelfHook
(Vladimír czunátによって提案されているように推奨されます)、またはクイックsteam-run
修正が最も必要な場合は最終的なものです(複数の基本ライブラリに基づいています)。buildFHSUserEnv
以下は簡単な要約です。
正しい方法はautoPatchelfHook
autoPatchelfHook
NixOはすべてを自動的にパッチする特別な「フック」を作成しました!ちょうど指定すると、(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; }
)。次に、次を実行します。~/.config/nixpkgs/config.nix
nixos-rebuild
configuration.nix
nixpkgs.config.allowUnfree = true;
steam-run ./wolframscript
詳細については、次を参照してください。Nixosでnixos以外の実行可能ファイルを実行するさまざまな方法