parent
c4b3aa6260
commit
758c87007c
@ -0,0 +1,191 @@ |
||||
{ 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 |
||||
]; |
||||
}; |
||||
} |
Loading…
Reference in new issue