4 # for it in $(nix-build -A dockerImage --no-out-link); do docker load -i $it; done
8 cmake ? pkgs.cmake_2_8,
14 # https://gitlab.com/xonotic/xonotic
15 "xonotic" = localFilesMain ./.;
16 "data/font-dejavu" = localFiles ./data/font-dejavu.pk3dir;
17 "data/font-nimbussansl" = localFiles ./data/font-nimbussansl.pk3dir;
18 "data/font-unifont" = localFiles ./data/font-unifont.pk3dir;
19 "data/font-xolonium" = localFiles ./data/font-xolonium.pk3dir;
21 # https://gitlab.com/xonotic/d0_blind_id
22 "d0_blind_id" = localFiles ./d0_blind_id;
24 # https://gitlab.com/xonotic/darkplaces
25 "darkplaces" = localFiles ./darkplaces;
27 # https://gitlab.com/xonotic/gmqcc
28 "gmqcc" = localFiles ./gmqcc;
30 # https://gitlab.com/xonotic/netradiant
31 "netradiant" = localFiles ./netradiant;
33 # https://gitlab.com/xonotic/xonotic-data.pk3dir
34 "data/xonotic-data" = localFilesCustom ./data/xonotic-data.pk3dir (name: type: type == "directory" || !(isCode name));
35 "data/xonotic-data/qcsrc" = localFilesCustom ./data/xonotic-data.pk3dir (name: type: type == "directory" || (isCode name));
37 # https://gitlab.com/xonotic/xonotic-maps.pk3dir
38 "data/xonotic-maps" = localFiles ./data/xonotic-maps.pk3dir;
40 # https://gitlab.com/xonotic/xonotic-music.pk3dir
41 "data/xonotic-music" = localFiles ./data/xonotic-music.pk3dir;
43 # https://gitlab.com/xonotic/xonotic-nexcompat.pk3dir
44 "data/xonotic-nexcompat" = localFiles ./data/xonotic-nexcompat.pk3dir;
47 localFilesMain = src: let
48 project = toString ./.;
49 cleanSourceFilterMain = name: type: let
50 baseName = baseNameOf (toString name);
51 result = (cleanSourceFilter name type)
52 && !(name == "${project}/release")
53 && !(name == "${project}/d0_blind_id")
54 && !(name == "${project}/daemon")
55 && !(name == "${project}/darkplaces")
56 && !(name == "${project}/data")
57 && !(name == "${project}/gmqcc")
58 && !(name == "${project}/netradiant")
59 && !(name == "${project}/wiki" || name == "${project}/wiki.yes")
60 && !(name == "${project}/xonstat" || name == "${project}/xonstat.yes")
63 in builtins.filterSource cleanSourceFilterMain src;
66 baseName = baseNameOf (toString name);
68 || (lib.hasSuffix ".ase" baseName)
69 || (lib.hasSuffix ".dem" baseName)
70 || (lib.hasSuffix ".dpm" baseName)
71 || (lib.hasSuffix ".framegroups" baseName)
72 || (lib.hasSuffix ".iqm" baseName)
73 || (lib.hasSuffix ".jpg" baseName)
74 || (lib.hasSuffix ".lmp" baseName)
75 || (lib.hasSuffix ".md3" baseName)
76 || (lib.hasSuffix ".mdl" baseName)
77 || (lib.hasSuffix ".obj" baseName)
78 || (lib.hasSuffix ".ogg" baseName)
79 || (lib.hasSuffix ".png" baseName)
80 || (lib.hasSuffix ".shader" baseName)
81 || (lib.hasSuffix ".skin" baseName)
82 || (lib.hasSuffix ".sounds" baseName)
83 || (lib.hasSuffix ".sp2" baseName)
84 || (lib.hasSuffix ".spr" baseName)
85 || (lib.hasSuffix ".spr32" baseName)
86 || (lib.hasSuffix ".svg" baseName)
87 || (lib.hasSuffix ".tga" baseName)
88 || (lib.hasSuffix ".wav" baseName)
89 || (lib.hasSuffix ".width" baseName)
90 || (lib.hasSuffix ".zym" baseName)
94 pk3 = drv: mkDerivation {
95 name = "${drv.name}.pk3";
96 version = drv.version;
98 nativeBuildInputs = with pkgs; [
102 phases = [ "installPhase" ];
104 (cd ${drv} && zip -r ${drv.pk3args or ""} $out .)
109 font-dejavu = mkDerivation rec {
110 name = "font-dejavu-${version}";
113 src = srcs."data/font-dejavu";
115 phases = [ "installPhase" ];
121 font-nimbussansl = mkDerivation rec {
122 name = "font-nimbussansl-${version}";
125 src = srcs."data/font-nimbussansl";
127 phases = [ "installPhase" ];
133 font-unifont = mkDerivation rec {
134 name = "font-unifont-${version}";
137 src = srcs."data/font-unifont";
139 phases = [ "installPhase" ];
145 font-xolonium = mkDerivation rec {
146 name = "font-xolonium-${version}";
149 src = srcs."data/font-xolonium";
151 phases = [ "installPhase" ];
157 d0_blind_id = mkDerivation rec {
158 name = "d0_blind_id-${version}";
159 version = "xonotic-${VERSION}";
161 src = srcs."d0_blind_id";
163 nativeBuildInputs = [
167 buildInputs = with pkgs; [
173 mkdir -p $out/include/d0_blind_id
175 cp libd0_blind_id.so $out/lib
176 (cd $src; cp d0.h d0_blind_id.h $out/include/d0_blind_id)
178 cp libd0_rijndael.so $out/lib
179 (cd $src; cp d0_rijndael.h $out/include/d0_blind_id)
184 unwrapped = mkDerivation rec {
185 name = "darkplaces-unwrapped-${version}";
186 version = "xonotic-${VERSION}";
188 src = srcs."darkplaces";
190 nativeBuildInputs = [
194 buildInputs = with pkgs; [
203 cp darkplaces-{dedicated,sdl} $out/bin
206 result = mkDerivation rec {
207 name = "darkplaces-${version}";
208 version = "xonotic-${VERSION}";
210 buildInputs = unwrapped.buildInputs ++ runtimeInputs;
211 runtimeInputs = with pkgs; [
227 phases = [ "installPhase" ];
231 cp -r ${unwrapped}/bin .
235 for exe in dedicated sdl; do
237 rpath=$(patchelf --print-rpath $f)
238 rpath=''${rpath:+$rpath:}${lib.makeLibraryPath runtimeInputs}
239 patchelf --set-rpath $rpath $f
240 cp $f $out/bin/xonotic-linux64-$exe
246 gmqcc = mkDerivation rec {
247 name = "gmqcc-${version}";
248 version = "xonotic-${VERSION}";
252 nativeBuildInputs = [
262 netradiant = mkDerivation rec {
263 name = "netradiant-${version}";
266 src = srcs."netradiant";
268 nativeBuildInputs = with pkgs; [
273 buildInputs = with pkgs; [
298 xonotic-data = mkDerivation rec {
299 name = "xonotic-data-${version}";
300 version = "xonotic-${VERSION}";
302 src = srcs."data/xonotic-data";
304 phases = [ "installPhase" ];
309 find $out -depth -type d -empty -exec rmdir {} \;
313 xonotic-data-code = mkDerivation rec {
314 name = "xonotic-data-code-${version}";
315 version = "xonotic-${VERSION}";
317 src = srcs."data/xonotic-data/qcsrc";
320 QCC = "${gmqcc}/bin/gmqcc";
323 nativeBuildInputs = with pkgs; [
332 cp {menu,progs,csprogs}.{dat,lno} $out
333 find $out -depth -type d -empty -exec rmdir {} \;
338 xonotic-maps = mkDerivation rec {
339 name = "xonotic-maps-${version}";
340 version = "xonotic-${VERSION}";
342 src = srcs."data/xonotic-maps";
344 phases = [ "installPhase" ];
350 passthru.dance = mkDerivation rec {
352 version = "xonotic-${VERSION}";
354 src = pkgs.fetchurl {
355 url = http://beta.xonotic.org/autobuild-bsp/dance-full-88c416b8c11bdcecfdb889af2a2b97b4c0e2b8de-319ee7234504199da56f07ce25185f6d6cb889cd.pk3;
356 sha256 = "1jgdg4mz56kbxcy3mwn4h5qlf3ahm1cmarp9l70fz9nfn6cnaknq";
359 phases = [ "installPhase" ];
364 ${pkgs.unzip}/bin/unzip $src
369 xonotic-music = mkDerivation rec {
370 name = "xonotic-music-${version}";
371 version = "xonotic-${VERSION}";
373 src = srcs."data/xonotic-music";
375 phases = [ "installPhase" ];
381 passthru.pk3args = "-0";
384 xonotic-nexcompat = mkDerivation rec {
385 name = "xonotic-nexcompat-${version}";
386 version = "xonotic-${VERSION}";
388 src = srcs."data/xonotic-nexcompat";
390 phases = [ "installPhase" ];
397 xonotic-keys = mkDerivation rec {
398 name = "xonotic-keys-${version}";
401 src = srcs."xonotic";
403 phases = [ "installPhase" ];
411 xonotic = mkDerivation rec {
412 name = "xonotic-${version}";
415 src = srcs."xonotic";
433 inherit (xonotic-maps)
438 phases = [ "installPhase" ];
443 cp ${darkplaces}/bin/* $out
446 ${lib.concatStringsSep "\n" (lib.mapAttrsToList (k: v:
447 # "cp ${pk3 v} $out/data/${k}.pk3"
448 "ln -s ${v} $out/data/${k}.pk3dir"
451 mkdir -p $out/mapping
452 ln -s ${netradiant} $out/mapping/${netradiant.name}
457 main = pkgs.dockerTools.buildImage {
460 contents = mkDerivation {
461 name = "xonotic-init";
462 phases = [ "installPhase" ];
465 cat > $out/init <<EOF
467 ${pkgs.coreutils}/bin/ln -s ${xonotic-keys}/* /
469 ${pkgs.coreutils}/bin/ls -l /
470 ${pkgs.coreutils}/bin/ls -l /data
472 exec ${darkplaces}/bin/xonotic-linux64-dedicated "\''${@}"
477 config.Entrypoint = "/init";
479 unpackImage = { name, from, to }: pkgs.dockerTools.buildImage {
480 name = "xonotic_${name}";
482 contents = mkDerivation {
483 name = "xonotic-${name}-init";
484 phases = [ "installPhase" ];
487 cat > $out/init <<EOF
489 ${pkgs.coreutils}/bin/cp -r ${from} /data/${to}
494 config.Entrypoint = "/init";
497 // (lib.mapAttrs (k: v: unpackImage { name = k; from = pk3 v; to = "${k}.pk3"; }) xonotic.paks)
501 cleanSourceFilter = name: type: let
502 baseName = baseNameOf (toString name);
503 result = (lib.cleanSourceFilter name type)
504 && !(lib.hasSuffix ".nix" baseName)
505 && !(type == "directory" && baseName == ".git")
506 && !(type == "directory" && baseName == ".idea")
507 && !(type == "directory" && (lib.hasPrefix "cmake-build-" baseName))
511 localFilesCustom = src: filter:
512 builtins.filterSource (name: type: (cleanSourceFilter name type) && (filter name type)) src
515 localFiles = src: localFilesCustom src (name: type: true);
517 stdenv = if (cc == null) then pkgs.stdenv
518 else pkgs.overrideCC pkgs.stdenv pkgs."${cc}";
520 mkDerivation = {env ? {}, shellHook ? "", runtimeInputs ? [], ...}@args: stdenv.mkDerivation ({}
521 // { enableParallelBuilding = true; }
522 // (removeAttrs args ["env" "shellHook" "runtimeInputs"])
527 ${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: "export ${n}=${v}") env)}
528 export LD_LIBRARY_PATH=''${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}${lib.makeLibraryPath runtimeInputs}
533 shell = let inputs = (lib.mapAttrsToList (k: v: v) targets); in stdenv.mkDerivation (rec {
534 name = "xonotic-shell";
535 nativeBuildInputs = builtins.map (it: it.nativeBuildInputs) (builtins.filter (it: it?nativeBuildInputs) inputs);
536 buildInputs = builtins.map (it: it.buildInputs) (builtins.filter (it: it?buildInputs) inputs);
537 shellHook = builtins.map (it: it.shellHook) (builtins.filter (it: it?shellHook) inputs);
539 in { inherit shell; } // targets