diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 6572d6b9914..9974ef98019 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -300,6 +300,12 @@ githubId = 335271; name = "James Alexander Feldman-Crough"; }; + afontain = { + email = "antoine.fontaine@epfl.ch"; + github = "necessarily-equal"; + githubId = 59283660; + name = "Antoine Fontaine"; + }; aforemny = { email = "aforemny@posteo.de"; github = "aforemny"; diff --git a/pkgs/games/unvanquished/default.nix b/pkgs/games/unvanquished/default.nix new file mode 100644 index 00000000000..35db4625db9 --- /dev/null +++ b/pkgs/games/unvanquished/default.nix @@ -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 + ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 22baaa0c71f..0e0751f2132 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9382,6 +9382,8 @@ in untrunc-anthwlock = callPackage ../tools/video/untrunc-anthwlock { }; + unvanquished = callPackage ../games/unvanquished { }; + up = callPackage ../tools/misc/up { }; upterm = callPackage ../tools/misc/upterm { };