다음의 간단한 데비안 패키지를 고려해 보세요: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
제가 소개한전체 목록은 다음과 같습니다.샘플 파일과 함께 문제에 대한 솔루션을 제공합니다. 두 가지 더 효율적인 방법은 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가 아닌 실행 파일을 실행하는 다양한 방법
답변2
해당 deb를 입력으로 사용하고 압축을 푸는 등의 간단한 nix 표현식을 만드는 것이 가장 좋을 것이라고 기대합니다. 이렇게 하면 "nix 방식"으로 설치할 수 있습니다(즉, 경로 자체 전에 종속성이 제거되지 않습니다). 이렇게 할 때 을 추가하면 autoPatchelfHook
누락 buildInputs
된 참조가 수정됩니다.