mirror of
https://github.com/perstarkse/minne.git
synced 2026-06-28 21:06:20 +02:00
250 lines
6.5 KiB
Nix
250 lines
6.5 KiB
Nix
# Portable release archives for cargo-dist-compatible GitHub Releases layout.
|
|
{
|
|
lib,
|
|
stdenv,
|
|
platform ? (if stdenv.isLinux then "linux" else if stdenv.isDarwin then "darwin" else "windows"),
|
|
patchelf ? null,
|
|
xz,
|
|
unzip ? null,
|
|
zip ? null,
|
|
minne-pkg ? null,
|
|
minne-pkg-windows ? null,
|
|
onnxruntime ? null,
|
|
ortArchiveWindows ? null,
|
|
libglvnd ? null,
|
|
fontconfig,
|
|
freetype,
|
|
openssl,
|
|
zlib,
|
|
bzip2,
|
|
libpng,
|
|
brotli,
|
|
expat,
|
|
gcc ? null,
|
|
glibc ? null,
|
|
minneVersion,
|
|
targetTriple,
|
|
srcRoot,
|
|
}:
|
|
let
|
|
archiveName = "main-${targetTriple}";
|
|
binaries = ["main" "server" "worker"];
|
|
|
|
copyBinary = ''
|
|
if [ -f "${minne-pkg}/bin/.$b-wrapped" ]; then
|
|
cp "${minne-pkg}/bin/.$b-wrapped" "$exe"
|
|
elif [ -f "${minne-pkg}/bin/$b" ]; then
|
|
cp "${minne-pkg}/bin/$b" "$exe"
|
|
else
|
|
echo "missing binary: $b" >&2
|
|
exit 1
|
|
fi
|
|
'';
|
|
|
|
copyDocs = ''
|
|
cp ${srcRoot}/README.md ${srcRoot}/LICENSE ${srcRoot}/CHANGELOG.md "$root/"
|
|
'';
|
|
|
|
mkLinux =
|
|
let
|
|
isAarch64 = lib.hasSuffix "aarch64-unknown-linux-gnu" targetTriple;
|
|
dynamicLinker =
|
|
if isAarch64
|
|
then "ld-linux-aarch64.so.1"
|
|
else "ld-linux-x86-64.so.2";
|
|
|
|
copySharedLibs = pkg: ''
|
|
if [ -d "${pkg}/lib" ]; then
|
|
find -L "${pkg}/lib" -maxdepth 1 \( -name '*.so' -o -name '*.so.*' \) -exec cp -L {} "$root/lib/" \;
|
|
fi
|
|
'';
|
|
in
|
|
stdenv.mkDerivation {
|
|
pname = "main";
|
|
version = minneVersion;
|
|
|
|
nativeBuildInputs = [patchelf xz];
|
|
|
|
dontUnpack = true;
|
|
dontStrip = true;
|
|
dontPatchELF = true;
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
root="$TMPDIR/root/${archiveName}"
|
|
mkdir -p "$root/lib"
|
|
|
|
for b in ${lib.concatStringsSep " " binaries}; do
|
|
exe="$root/.$b-bin"
|
|
${copyBinary}
|
|
chmod u+w "$exe"
|
|
patchelf --set-interpreter 'lib/${dynamicLinker}' "$exe"
|
|
patchelf --set-rpath '$ORIGIN/lib' "$exe"
|
|
printf '%s\n' \
|
|
'#!/bin/sh' \
|
|
'set -eu' \
|
|
'DIR="$(CDPATH= cd "$(dirname "$0")" && pwd)"' \
|
|
'export LD_LIBRARY_PATH="$DIR/lib"' \
|
|
'export ORT_DYLIB_PATH="$DIR/lib/libonnxruntime.so"' \
|
|
'exec "$DIR/.'"$b"'-bin" "$@"' \
|
|
> "$root/$b"
|
|
chmod +x "$root/$b"
|
|
done
|
|
|
|
cp -L ${onnxruntime}/lib/libonnxruntime.so* "$root/lib/"
|
|
${copySharedLibs libglvnd}
|
|
${copySharedLibs fontconfig.lib}
|
|
${copySharedLibs freetype}
|
|
${copySharedLibs openssl.out}
|
|
${copySharedLibs zlib}
|
|
${copySharedLibs bzip2}
|
|
${copySharedLibs libpng}
|
|
${copySharedLibs brotli}
|
|
${copySharedLibs expat}
|
|
${copySharedLibs gcc.cc.lib}
|
|
|
|
# Bundle glibc so binaries run on older distros (e.g. Ubuntu 22.04).
|
|
cp -L ${glibc}/lib/${dynamicLinker} "$root/lib/"
|
|
for lib in libc.so.6 libm.so.6 libpthread.so.0 libdl.so.2 librt.so.1 libresolv.so.2; do
|
|
if [ -f "${glibc}/lib/$lib" ]; then
|
|
cp -L "${glibc}/lib/$lib" "$root/lib/"
|
|
fi
|
|
done
|
|
|
|
${copyDocs}
|
|
|
|
mkdir -p "$out"
|
|
tar -cJf "$out/${archiveName}.tar.xz" -C "$TMPDIR/root" "${archiveName}"
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
meta = {
|
|
description = "Minne release archive for ${targetTriple}";
|
|
platforms = lib.platforms.linux;
|
|
};
|
|
};
|
|
|
|
mkDarwin =
|
|
let
|
|
copyDylibs = pkg: ''
|
|
if [ -d "${pkg}/lib" ]; then
|
|
find -L "${pkg}/lib" -maxdepth 1 \( -name '*.dylib' -o -name '*.so' \) -exec cp -L {} "$root/lib/" \;
|
|
fi
|
|
'';
|
|
in
|
|
stdenv.mkDerivation {
|
|
pname = "main";
|
|
version = minneVersion;
|
|
|
|
nativeBuildInputs = [xz];
|
|
|
|
dontUnpack = true;
|
|
dontStrip = true;
|
|
dontFixDarwinDylibs = true;
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
root="$TMPDIR/root/${archiveName}"
|
|
mkdir -p "$root/lib"
|
|
|
|
for b in ${lib.concatStringsSep " " binaries}; do
|
|
exe="$root/.$b-bin"
|
|
${copyBinary}
|
|
chmod +x "$exe"
|
|
printf '%s\n' \
|
|
'#!/bin/sh' \
|
|
'set -eu' \
|
|
'DIR="$(CDPATH= cd "$(dirname "$0")" && pwd)"' \
|
|
'export DYLD_LIBRARY_PATH="$DIR/lib''${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}"' \
|
|
'exec "$DIR/.'"$b"'-bin" "$@"' \
|
|
> "$root/$b"
|
|
chmod +x "$root/$b"
|
|
done
|
|
|
|
cp -L ${onnxruntime}/lib/libonnxruntime*.dylib "$root/lib/" 2>/dev/null || true
|
|
if [ ! -f "$root/lib/libonnxruntime.dylib" ]; then
|
|
ort="$(find -L "$root/lib" -maxdepth 1 -name 'libonnxruntime*.dylib' | head -n1)"
|
|
if [ -n "$ort" ]; then
|
|
cp -L "$ort" "$root/lib/libonnxruntime.dylib"
|
|
else
|
|
echo "missing libonnxruntime.dylib" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
${copyDylibs fontconfig.lib}
|
|
${copyDylibs freetype}
|
|
${copyDylibs openssl.out}
|
|
${copyDylibs zlib}
|
|
${copyDylibs bzip2}
|
|
${copyDylibs libpng}
|
|
${copyDylibs brotli}
|
|
${copyDylibs expat}
|
|
|
|
${copyDocs}
|
|
|
|
mkdir -p "$out"
|
|
tar -cJf "$out/${archiveName}.tar.xz" -C "$TMPDIR/root" "${archiveName}"
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
meta = {
|
|
description = "Minne release archive for ${targetTriple}";
|
|
platforms = lib.platforms.darwin;
|
|
};
|
|
};
|
|
|
|
mkWindows = stdenv.mkDerivation {
|
|
pname = "main";
|
|
version = minneVersion;
|
|
|
|
nativeBuildInputs = [unzip zip];
|
|
|
|
dontUnpack = true;
|
|
dontStrip = true;
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
root="$TMPDIR/root"
|
|
mkdir -p "$root/lib"
|
|
|
|
for b in ${lib.concatStringsSep " " binaries}; do
|
|
if [ ! -f "${minne-pkg-windows}/bin/$b.exe" ]; then
|
|
echo "missing binary: $b.exe" >&2
|
|
exit 1
|
|
fi
|
|
cp "${minne-pkg-windows}/bin/$b.exe" "$root/$b.exe"
|
|
done
|
|
|
|
unzip -q ${ortArchiveWindows} -d "$TMPDIR/ort"
|
|
dll="$(find "$TMPDIR/ort" -name onnxruntime.dll -print -quit)"
|
|
if [ -z "$dll" ]; then
|
|
echo "missing onnxruntime.dll in ORT archive" >&2
|
|
exit 1
|
|
fi
|
|
cp "$dll" "$root/lib/onnxruntime.dll"
|
|
|
|
${copyDocs}
|
|
|
|
mkdir -p "$out"
|
|
(cd "$root" && zip -qr "$out/${archiveName}.zip" .)
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
meta = {
|
|
description = "Minne release archive for ${targetTriple}";
|
|
platforms = [ "x86_64-linux" ];
|
|
};
|
|
};
|
|
in
|
|
if platform == "linux" then mkLinux
|
|
else if platform == "darwin" then mkDarwin
|
|
else if platform == "windows" then mkWindows
|
|
else throw "minne-release: unknown platform ${platform}"
|