Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / games / xonotic / default.nix
blob60eb1189391df549f7940a9fb87da5e2e890c5e9
1 { lib, stdenv, fetchurl, fetchzip, makeWrapper, runCommand, makeDesktopItem
2 , xonotic-data, copyDesktopItems
3 , # required for both
4   unzip, libjpeg, zlib, libvorbis, curl, freetype, libpng, libtheora
5 , # glx
6   libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, alsa-lib
7 , # sdl
8   SDL2
9 , # blind
10   gmp
12 , withSDL ? true
13 , withGLX ? false
14 , withDedicated ? true
17 let
18   pname = "xonotic";
19   version = "0.8.6";
20   name = "${pname}-${version}";
21   variant =
22     if withSDL && withGLX then
23       ""
24     else if withSDL then
25       "-sdl"
26     else if withGLX then
27       "-glx"
28     else if withDedicated then
29       "-dedicated"
30     else "-what-even-am-i";
32   meta = {
33     description = "A free fast-paced first-person shooter";
34     longDescription = ''
35       Xonotic is a free, fast-paced first-person shooter that works on
36       Windows, macOS and Linux. The project is geared towards providing
37       addictive arena shooter gameplay which is all spawned and driven
38       by the community itself. Xonotic is a direct successor of the
39       Nexuiz project with years of development between them, and it
40       aims to become the best possible open-source FPS of its kind.
41     '';
42     homepage = "https://www.xonotic.org/";
43     license = lib.licenses.gpl2Plus;
44     maintainers = with lib.maintainers; [ astsmtl zalakain ];
45     platforms = lib.platforms.linux;
46   };
48   desktopItem = makeDesktopItem {
49     name = "xonotic";
50     exec = "xonotic";
51     comment = meta.description;
52     desktopName = "Xonotic";
53     categories = [ "Game" "Shooter" ];
54     icon = "xonotic";
55     startupNotify = false;
56   };
58   xonotic-unwrapped = stdenv.mkDerivation rec {
59     pname = "xonotic${variant}-unwrapped";
60     inherit version;
62     src = fetchurl {
63       url = "https://dl.xonotic.org/xonotic-${version}-source.zip";
64       hash = "sha256-i5KseBz/SuicEhoj6s197AWiqr7azMI6GdGglYtAEqg=";
65     };
67     nativeBuildInputs = [ unzip ];
68     buildInputs = [ libjpeg zlib libvorbis curl gmp ]
69       ++ lib.optionals withGLX [ libX11.dev libGLU.dev libGL.dev libXpm.dev libXext.dev libXxf86vm.dev alsa-lib.dev ]
70       ++ lib.optionals withSDL [ SDL2.dev ];
72     sourceRoot = "Xonotic/source/darkplaces";
74     # "debug", "release", "profile"
75     target = "release";
77     dontStrip = target != "release";
79     postConfigure = ''
80       pushd ../d0_blind_id
81       ./configure $configureFlags
82       popd
83     '';
85     buildPhase = (lib.optionalString withDedicated ''
86       make -j $NIX_BUILD_CORES sv-${target}
87     '' + lib.optionalString withGLX ''
88       make -j $NIX_BUILD_CORES cl-${target}
89     '' + lib.optionalString withSDL ''
90       make -j $NIX_BUILD_CORES sdl-${target}
91     '') + ''
92       pushd ../d0_blind_id
93       make -j $NIX_BUILD_CORES
94       popd
95     '';
97     enableParallelBuilding = true;
99     installPhase = (''
100       install -Dm644 ../../misc/logos/xonotic_icon.svg \
101         $out/share/icons/hicolor/scalable/apps/xonotic.svg
102       pushd ../../misc/logos/icons_png
103       for img in *.png; do
104         size=''${img#xonotic_}
105         size=''${size%.png}
106         dimensions="''${size}x''${size}"
107         install -Dm644 $img \
108           $out/share/icons/hicolor/$dimensions/apps/xonotic.png
109       done
110       popd
111     '' + lib.optionalString withDedicated ''
112       install -Dm755 darkplaces-dedicated "$out/bin/xonotic-dedicated"
113     '' + lib.optionalString withGLX ''
114       install -Dm755 darkplaces-glx "$out/bin/xonotic-glx"
115     '' + lib.optionalString withSDL ''
116       install -Dm755 darkplaces-sdl "$out/bin/xonotic-sdl"
117     '') + ''
118       pushd ../d0_blind_id
119       make install
120       popd
121     '';
123     # Xonotic needs to find libcurl.so at runtime for map downloads
124     dontPatchELF = true;
125     postFixup = lib.optionalString withDedicated ''
126       patchelf --add-needed ${curl.out}/lib/libcurl.so $out/bin/xonotic-dedicated
127     '' + lib.optionalString withGLX ''
128       patchelf \
129           --add-needed ${curl.out}/lib/libcurl.so \
130           --add-needed ${libvorbis}/lib/libvorbisfile.so \
131           --add-needed ${libvorbis}/lib/libvorbisenc.so \
132           --add-needed ${libvorbis}/lib/libvorbis.so \
133           --add-needed ${libGL.out}/lib/libGL.so \
134           --add-needed ${freetype}/lib/libfreetype.so \
135           --add-needed ${libpng}/lib/libpng.so \
136           --add-needed ${libtheora}/lib/libtheora.so \
137           $out/bin/xonotic-glx
138     '' + lib.optionalString withSDL ''
139       patchelf \
140           --add-needed ${curl.out}/lib/libcurl.so \
141           --add-needed ${libvorbis}/lib/libvorbisfile.so \
142           --add-needed ${libvorbis}/lib/libvorbisenc.so \
143           --add-needed ${libvorbis}/lib/libvorbis.so \
144           --add-needed ${freetype}/lib/libfreetype.so \
145           --add-needed ${libpng}/lib/libpng.so \
146           --add-needed ${libtheora}/lib/libtheora.so \
147           $out/bin/xonotic-sdl
148     '';
149   };
151 in rec {
152   xonotic-data = fetchzip {
153     name = "xonotic-data";
154     url = "https://dl.xonotic.org/xonotic-${version}.zip";
155     hash = "sha256-Lhjpyk7idmfQAVn4YUb7diGyyKZQBfwNXxk2zMOqiZQ=";
156     postFetch = ''
157       cd $out
158       rm -rf $(ls | grep -v "^data$" | grep -v "^key_0.d0pk$")
159     '';
160     meta.hydraPlatforms = [];
161     passthru.version = version;
162   };
164   xonotic = runCommand "xonotic${variant}-${version}" {
165     inherit xonotic-unwrapped;
166     nativeBuildInputs = [ makeWrapper copyDesktopItems ];
167     desktopItems = [ desktopItem ];
168     passthru = {
169       inherit version;
170       meta = meta // {
171         hydraPlatforms = [];
172       };
173     };
174   } (''
175     mkdir -p $out/bin
176   '' + lib.optionalString withDedicated ''
177     ln -s ${xonotic-unwrapped}/bin/xonotic-dedicated $out/bin/
178   '' + lib.optionalString withGLX ''
179     ln -s ${xonotic-unwrapped}/bin/xonotic-glx $out/bin/xonotic-glx
180     ln -s $out/bin/xonotic-glx $out/bin/xonotic
181   '' + lib.optionalString withSDL ''
182     ln -s ${xonotic-unwrapped}/bin/xonotic-sdl $out/bin/xonotic-sdl
183     ln -sf $out/bin/xonotic-sdl $out/bin/xonotic
184   '' + lib.optionalString (withSDL || withGLX) ''
185     mkdir -p $out/share
186     ln -s ${xonotic-unwrapped}/share/icons $out/share/icons
187     copyDesktopItems
188   '' + ''
189     for binary in $out/bin/xonotic-*; do
190       wrapProgram $binary --add-flags "-basedir ${xonotic-data}" --prefix LD_LIBRARY_PATH : "${xonotic-unwrapped}/lib"
191     done
192   '');