191 lines
5.6 KiB
Nix
191 lines
5.6 KiB
Nix
{ lib, stdenv, fetchzip, fetchurl, fetchFromGitHub, buildFHSUserEnv
|
|
, runCommandNoCC, makeDesktopItem, copyDesktopItems, gcc, cmake, gmp
|
|
, libGL, zlib, ncurses, geoip, lua5, nettle, curl, SDL2, freetype, glew
|
|
, openal, libopus, opusfile, libogg, libvorbis, libjpeg, libwebp, libpng
|
|
, cacert, aria2 # to download assets
|
|
}:
|
|
|
|
let
|
|
version = "0.52.0";
|
|
binary-deps-version = "5";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "Unvanquished";
|
|
repo = "Unvanquished";
|
|
rev = "v${version}";
|
|
fetchSubmodules = true;
|
|
sha256 = "1acda1559q6zwmhg3x00nai88hy83i5hcfli2bqfab7slr95lm27";
|
|
};
|
|
|
|
unvanquished-binary-deps = stdenv.mkDerivation rec {
|
|
# DISCLAIMER: this is selected binary crap from the NaCl SDK
|
|
name = "unvanquished-binary-deps";
|
|
version = binary-deps-version;
|
|
src = fetchzip {
|
|
url = "https://dl.unvanquished.net/deps/linux64-${version}.tar.bz2";
|
|
sha256 = "08bpyavbh5lmyprvqqi59gnm8s1fjmlk9f1785wlv7f52d9f9z1p";
|
|
};
|
|
dontPatchELF = true;
|
|
preFixup = ''
|
|
# We are not using the autoPatchelfHook, because it would make
|
|
# nacl_bootstrap_helper unable to load nacl_loader:
|
|
# "nacl_loader: ELF file has unreasonable e_phnum=13"
|
|
interpreter="$(< "$NIX_CC/nix-support/dynamic-linker")"
|
|
for f in pnacl/bin/*; do
|
|
if [ -f "$f" && -x "$f" ]; then
|
|
echo "Patching $f"
|
|
patchelf --set-interpreter "$interpreter" "$f"
|
|
fi
|
|
done
|
|
'';
|
|
preCheck = "pnacl/bin/clang -v"; # check it links correctly
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
mkdir -p $out
|
|
cp -R ./* $out/
|
|
|
|
runHook postInstall
|
|
'';
|
|
};
|
|
|
|
libstdcpp-preload-for-unvanquished-nacl = stdenv.mkDerivation {
|
|
name = "libstdcpp-preload-for-unvanquished-nacl";
|
|
buildCommand = ''
|
|
mkdir $out/etc -p
|
|
echo ${gcc.cc.lib}/lib/libstdc++.so.6 > $out/etc/ld-nix.so.preload
|
|
'';
|
|
propagatedBuildInputs = [ gcc.cc.lib ];
|
|
};
|
|
|
|
fhsEnv = buildFHSUserEnv {
|
|
name = "unvanquished-fhs-wrapper";
|
|
targetPkgs = pkgs: [ libstdcpp-preload-for-unvanquished-nacl ];
|
|
};
|
|
|
|
wrapBinary = binary: wrappername: ''
|
|
cat > $out/lib/${binary}-wrapper <<-EOT
|
|
#!/bin/sh
|
|
exec $out/lib/${binary} -pakpath ${unvanquished-assets} "\$@"
|
|
EOT
|
|
chmod +x $out/lib/${binary}-wrapper
|
|
|
|
cat > $out/bin/${wrappername} <<-EOT
|
|
#!/bin/sh
|
|
exec ${fhsEnv}/bin/unvanquished-fhs-wrapper $out/lib/${binary}-wrapper "\$@"
|
|
EOT
|
|
chmod +x $out/bin/${wrappername}
|
|
'';
|
|
|
|
|
|
unvanquished-assets = stdenv.mkDerivation {
|
|
pname = "unvanquished-assets";
|
|
inherit version src;
|
|
|
|
outputHash = "sha256:1fy85cjnjk9rrqkhgx5701inff2yv14hnxglzx3209c553gn31n7";
|
|
outputHashMode = "recursive";
|
|
nativeBuildInputs = [ aria2 cacert ];
|
|
buildCommand = "bash $src/download-paks $out";
|
|
};
|
|
|
|
# this really is the daemon game engine, the game itself is in the assets
|
|
in stdenv.mkDerivation rec {
|
|
pname = "unvanquished";
|
|
inherit version src binary-deps-version;
|
|
|
|
preConfigure = ''
|
|
mkdir daemon/external_deps/linux64-${binary-deps-version}/
|
|
cp -r ${unvanquished-binary-deps}/* daemon/external_deps/linux64-${binary-deps-version}/
|
|
chmod +w -R daemon/external_deps/linux64-${binary-deps-version}/
|
|
'';
|
|
|
|
nativeBuildInputs = [ cmake unvanquished-binary-deps copyDesktopItems ];
|
|
buildInputs = [
|
|
gmp
|
|
libGL
|
|
zlib
|
|
ncurses
|
|
geoip
|
|
lua5
|
|
nettle
|
|
curl
|
|
SDL2
|
|
freetype
|
|
glew
|
|
openal
|
|
libopus
|
|
opusfile
|
|
libogg
|
|
libvorbis
|
|
libjpeg
|
|
libwebp
|
|
libpng
|
|
];
|
|
|
|
cmakeFlags = [
|
|
"-DBUILD_CGAME=NO"
|
|
"-DBUILD_SGAME=NO"
|
|
"-DUSE_HARDENING=TRUE"
|
|
"-DUSE_LTO=TRUE"
|
|
];
|
|
|
|
desktopItems = [
|
|
(makeDesktopItem {
|
|
name = "net.unvanquished.Unvanquished.desktop";
|
|
desktopName = "Unvanquished";
|
|
comment = "FPS/RTS Game - Aliens vs. Humans";
|
|
icon = "unvanquished";
|
|
terminal = false;
|
|
exec = "unvanquished";
|
|
categories = "Game;ActionGame;StrategyGame;";
|
|
# May or may not work
|
|
prefersNonDefaultGPU = true;
|
|
fileValidation = false; # it doesn't like PrefersNonDefaultGPU
|
|
# yes, PrefersNonDefaultGPU is standard:
|
|
# https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html
|
|
})
|
|
(makeDesktopItem {
|
|
name = "net.unvanquished.UnvanquishedProtocolHandler.desktop";
|
|
desktopName = "Unvanquished (protocol handler)";
|
|
noDisplay = true;
|
|
terminal = false;
|
|
exec = "unvanquished -connect %u";
|
|
mimeType = "x-scheme-handler/unv";
|
|
# May or may not work
|
|
prefersNonDefaultGPU = true;
|
|
fileValidation = false; # it doesn't like PrefersNonDefaultGPU
|
|
})
|
|
];
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
for f in daemon daemon-tty daemonded nacl_loader nacl_helper_bootstrap; do
|
|
install -Dm0755 -t $out/lib/ $f
|
|
done
|
|
install -Dm0644 -t $out/lib/ irt_core-x86_64.nexe
|
|
|
|
mkdir $out/bin/
|
|
${wrapBinary "daemon" "unvanquished"}
|
|
${wrapBinary "daemon-tty" "unvanquished-tty"}
|
|
${wrapBinary "daemonded" "unvanquished-server"}
|
|
|
|
for d in ${src}/dist/icons/*; do
|
|
install -Dm0644 -t $out/share/icons/hicolor/$(basename $d)/apps/ $d/unvanquished.png
|
|
done
|
|
|
|
runHook postInstall
|
|
'';
|
|
meta = {
|
|
platforms = [ "x86_64-linux" ];
|
|
homepage = "https://unvanquished.net/";
|
|
downloadPage = "https://unvanquished.net/download/";
|
|
description = "A fast paced, first person strategy game";
|
|
maintainers = with lib.maintainers; [ afontain ];
|
|
# don't replace the following lib.licenses.zlib with just "zlib",
|
|
# or you would end up with the package instead
|
|
license = with lib.licenses; [
|
|
mit gpl3Only lib.licenses.zlib cc-by-sa-25
|
|
];
|
|
};
|
|
}
|