]> git.xonotic.org Git - xonotic/xonotic.git/commitdiff
Merge branch 'master' into Lyberta/d0BuildFix Lyberta/d0BuildFix 25/head
authorLyberta <lyberta@lyberta.net>
Sat, 16 Jun 2018 13:44:16 +0000 (16:44 +0300)
committerLyberta <lyberta@lyberta.net>
Sat, 16 Jun 2018 13:44:16 +0000 (16:44 +0300)
CMakeLists.txt
Docs/mapping.txt
default.nix
derivation.nix [new file with mode: 0644]
misc/infrastructure/checkupdate.txt
misc/infrastructure/transifex.cron
misc/tools/all/xonotic.subr
misc/tools/xonotic-map-compiler-autobuild
nix-build.sh [new file with mode: 0755]
release.nix [new file with mode: 0644]

index e63f71f6654983d9ed0195700ec4070da685694f..23080598b53504e61e954830ad56295dc97b3c7f 100644 (file)
@@ -13,12 +13,12 @@ function(subproject id name)
     endif ()
 endfunction()
 
-subproject(DAEMON daemon)
 subproject(PKI d0_blind_id)
+subproject(DAEMON daemon)
 subproject(DP darkplaces)
-subproject(DATA data/xonotic-data.pk3dir)
 subproject(QCC gmqcc)
 subproject(RADIANT netradiant)
+subproject(DATA data/xonotic-data.pk3dir)
 
 if (DOWNLOAD_MAPS)
     add_custom_target(update-maps ALL
index de13f2ad44f194457c5de737f8ea1a650d4e977d..5ab3e356c2a97148bf875803a0aba3c7bb16772a 100644 (file)
@@ -57,14 +57,13 @@ data/data/wazat1.mapinfo for me. The file may look like:
     _diameter 1966.839355\r
     _spawnpoints 5\r
     has weapons\r
-       cdtrack 5\r
+    cdtrack 5\r
     gametype dm // defaults: timelimit=20 pointlimit=30 leadlimit=0\r
     gametype dom // defaults: timelimit=20 pointlimit=200 teams=2 leadlimit=0\r
     gametype lms // defaults: timelimit=20 lives=9 leadlimit=0\r
-    gametype arena // defaults: timelimit=20 pointlimit=10 leadlimit=0\r
 \r
 As I see, the menu autodetected that my map may be suitable for deathmatch,\r
-domination, last man standing and arena. But I want the map to be played in\r
+domination, last man standing and keepaway. But I want the map to be played in\r
 domination, deathmatch, team deathmatch only, and I also want different\r
 timelimits/fraglimits, so I will change the "gametype" lines to:\r
 \r
@@ -98,7 +97,6 @@ Team Deathmatch | gametype tdm [timelimit=...] [pointlimit=...] [teams=...] [lea
 Domination      | gametype dom [timelimit=...] [pointlimit=...] [teams=...] [leadlimit=...]                                | 2, 3, or 4 teams, only if map has no dom_team ents\r
 CTF             | gametype ctf [timelimit=...] [caplimit=...] [leadlimit=...]                                              |\r
 LMS             | gametype lms [timelimit=...] [lives=...] [leadlimit=...]                                                 |\r
-Arena           | gametype arena [timelimit=...] [pointlinit=...] [leadlimit=...]                                          |\r
 Key Hunt        | gametype kh [timelimit=...] [pointlimit=...] [teams=...] [leadlimit=...]                                 | 2, 3, or 4 teams\r
 Assault         | gametype as [timelimit=...]                                                                              | never uses points\r
 Onslaught       | gametype ons [timelimit=...]                                                                             | never uses points\r
index 4ee0c65ae485af1edf9d9cb4b3429f231ea6d5d2..c523b5693d39f57b4d90b7bba9a917618befd2f2 100644 (file)
@@ -1,155 +1,2 @@
-# nix-shell -A shell
-# --argstr cc clang
-{
-    nixpkgs ? <nixpkgs>,
-    pkgs ? (import nixpkgs) {},
-    cc ? null
-}:
-with pkgs;
-let
-    VERSION = "0.8.2";
-    cmake = pkgs.cmake_2_8;
-    targets = rec {
-        xonotic = mkDerivation { pki = true; dp = true; data = true; } rec {
-            name = "xonotic-${version}";
-            version = VERSION;
-
-            src = lib.sourceFilesBySuffices ./. [
-                ".txt" ".cmake" ".in"
-                ".c" ".cpp" ".h"
-                ".inc" ".def"
-                ".qc" ".qh"
-                ".sh"
-            ];
-
-            env = {
-                QCC = "${gmqcc}/bin/gmqcc";
-            };
-
-            nativeBuildInputs = [
-                cmake   # for building
-                git     # for versioning
-                # unzip # for downloading maps
-            ];
-
-            cmakeFlags = [
-                "-DDOWNLOAD_MAPS=0"
-            ];
-
-            buildInputs = [
-                openssl # for d0_blind_id
-                SDL2    # for darkplaces
-            ];
-
-            runtimeInputs = [
-                zlib
-                curl
-
-                libjpeg
-                libpng
-
-                freetype
-
-                libogg
-                libtheora
-                libvorbis
-            ];
-
-            installPhase = ''
-                mkdir $out
-
-                exe=darkplaces/darkplaces
-                rpath=$(patchelf --print-rpath $exe)
-                rpath_firstparty=$out/d0_blind_id
-                rpath_thirdparty=${lib.makeLibraryPath runtimeInputs}
-                rpath=''${rpath:+$rpath:}$rpath_firstparty:$rpath_thirdparty
-                patchelf --set-rpath $rpath $exe
-
-                cp -r . $out
-            '';
-
-            dontPatchELF = true;
-        };
-
-        gmqcc = mkDerivation { qcc = true; } rec {
-            name = "gmqcc-${version}";
-            version = "xonotic-${VERSION}";
-
-            src = ./gmqcc;
-
-            installPhase = ''
-                mkdir -p $out/bin
-                cp gmqcc $out/bin
-            '';
-        };
-
-        netradiant = mkDerivation { radiant = true; } rec {
-            name = "netradiant-${version}";
-            version = VERSION;
-
-            src = ./netradiant;
-
-            nativeBuildInputs = [
-                cmake   # for building
-                git     # for versioning
-            ];
-
-            cmakeFlags = [
-                "-DDOWNLOAD_MAPS=0"
-            ];
-
-            buildInputs = [
-                pkgconfig
-                glib
-                pcre
-                libxml2
-                ncurses
-                libjpeg
-                libpng
-                minizip
-
-                mesa
-
-                xorg.libXt
-                xorg.libXmu
-                xorg.libSM
-                xorg.libICE
-                xorg.libpthreadstubs
-                xorg.libXdmcp
-
-                gnome3.gtk
-                gnome2.gtk
-                gnome2.gtkglext
-            ];
-        };
-    };
-    stdenv = if (cc != null) then overrideCC pkgs.stdenv pkgs."${cc}" else pkgs.stdenv;
-    mkEnableTargets = args: {
-        XON_NO_PKI = !args?pki;
-        XON_NO_DP = !args?dp;
-        XON_NO_DATA = !args?data;
-        XON_NO_QCC = !args?qcc;
-        XON_NO_RADIANT = !args?radiant;
-    };
-    mkDerivation = targets: {env ? {}, shellHook ? "", runtimeInputs ? [], ...}@args:
-        stdenv.mkDerivation (
-            (mkEnableTargets targets)
-            // { enableParallelBuilding = true; }
-            // (removeAttrs args ["env" "shellHook" "runtimeInputs"])  # passthru
-            // env
-            // {
-                shellHook = ''
-                    ${shellHook}
-                    ${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: "export ${n}=${v}") env)}
-                    export LD_LIBRARY_PATH=''${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}${lib.makeLibraryPath runtimeInputs}
-                '';
-            }
-        );
-    shell = let inputs = (lib.mapAttrsToList (n: v: v) targets); in stdenv.mkDerivation (rec {
-        name = "xon-shell";
-        XON_NO_DAEMON = true;
-        nativeBuildInputs = builtins.map (it: it.nativeBuildInputs) inputs;
-        buildInputs = builtins.map (it: it.buildInputs) inputs;
-        shellHook = builtins.map (it: it.shellHook) (builtins.filter (it: it?shellHook) inputs);
-    });
-in { inherit shell; } // targets
+{ pkgs ? import <nixpkgs> {}, cc ? null }@args:
+pkgs.callPackage ./derivation.nix args
diff --git a/derivation.nix b/derivation.nix
new file mode 100644 (file)
index 0000000..d036571
--- /dev/null
@@ -0,0 +1,587 @@
+# nix-shell -A shell
+# ./nix-build.sh -A xonotic
+# --argstr cc clang
+# for it in $(./nix-build.sh -A dockerImage --no-out-link); do docker load -i $it; done
+{
+    pkgs, lib,
+    cc ? null,
+    cmake ? pkgs.cmake_2_8,
+}:
+let
+    VERSION = "0.8.2";
+
+    x = {
+        # https://gitlab.com/xonotic/xonotic
+        srcs."xonotic" = localFilesMain ./.;
+        vers."xonotic" = "${VERSION}";
+
+        srcs."data/font-dejavu" = localFiles ./data/font-dejavu.pk3dir;
+        vers."data/font-dejavu" = "xonotic-${VERSION}";
+
+        srcs."data/font-nimbussansl" = localFiles ./data/font-nimbussansl.pk3dir;
+        vers."data/font-nimbussansl" = "xonotic-${VERSION}";
+
+        srcs."data/font-unifont" = localFiles ./data/font-unifont.pk3dir;
+        vers."data/font-unifont" = "xonotic-${VERSION}";
+
+        srcs."data/font-xolonium" = localFiles ./data/font-xolonium.pk3dir;
+        vers."data/font-xolonium" = "xonotic-${VERSION}";
+
+
+        # https://gitlab.com/xonotic/d0_blind_id
+        srcs."d0_blind_id" = localFiles ./d0_blind_id;
+        vers."d0_blind_id" = "xonotic-${VERSION}";
+
+
+        # https://gitlab.com/xonotic/darkplaces
+        srcs."darkplaces" = localFiles ./darkplaces;
+        vers."darkplaces" = "xonotic-${VERSION}";
+
+
+        # https://gitlab.com/xonotic/gmqcc
+        srcs."gmqcc" = localFiles ./gmqcc;
+        vers."gmqcc" = "xonotic-${VERSION}";
+
+
+        # https://gitlab.com/xonotic/netradiant
+        srcs."netradiant" = localFiles ./netradiant;
+        vers."netradiant" = "xonotic-${VERSION}";
+
+
+        # https://gitlab.com/xonotic/xonotic-data.pk3dir
+        srcs."data/xonotic-data" = localFilesCustom ./data/xonotic-data.pk3dir (name: type: type == "directory" || !(isCode name));
+        vers."data/xonotic-data" = builtins.getEnv "VERSION_data_xonotic_data_pk3dir";
+
+        srcs."data/xonotic-data/qcsrc" = localFilesCustom ./data/xonotic-data.pk3dir (name: type: type == "directory" || (isCode name));
+        vers."data/xonotic-data/qcsrc" = vers."data/xonotic-data";
+
+
+        # https://gitlab.com/xonotic/xonotic-maps.pk3dir
+        srcs."data/xonotic-maps" = localFiles ./data/xonotic-maps.pk3dir;
+        vers."data/xonotic-maps" = "${VERSION}";
+
+        # https://gitlab.com/xonotic/xonotic-music.pk3dir
+        srcs."data/xonotic-music" = localFiles ./data/xonotic-music.pk3dir;
+        vers."data/xonotic-music" = "${VERSION}";
+
+        # https://gitlab.com/xonotic/xonotic-nexcompat.pk3dir
+        srcs."data/xonotic-nexcompat" = localFiles ./data/xonotic-nexcompat.pk3dir;
+        vers."data/xonotic-nexcompat" = "${VERSION}";
+    };
+    inherit (x) srcs vers;
+
+    localFilesMain = src: let
+        project = toString ./.;
+        cleanSourceFilterMain = name: type: let
+            baseName = baseNameOf (toString name);
+            result = (cleanSourceFilter name type)
+                && !(name == "${project}/release")
+                && !(name == "${project}/d0_blind_id")
+                && !(name == "${project}/daemon")
+                && !(name == "${project}/darkplaces")
+                && !(name == "${project}/data")
+                && !(name == "${project}/gmqcc")
+                && !(name == "${project}/netradiant")
+                && !(name == "${project}/wiki" || name == "${project}/wiki.yes")
+                && !(name == "${project}/xonstat" || name == "${project}/xonstat.yes")
+            ;
+        in result;
+    in builtins.filterSource cleanSourceFilterMain src;
+
+    isCode = name: let
+        baseName = baseNameOf (toString name);
+        result = !(false
+            || (lib.hasSuffix ".ase" baseName)
+            || (lib.hasSuffix ".dem" baseName)
+            || (lib.hasSuffix ".dpm" baseName)
+            || (lib.hasSuffix ".framegroups" baseName)
+            || (lib.hasSuffix ".iqm" baseName)
+            || (lib.hasSuffix ".jpg" baseName)
+            || (lib.hasSuffix ".lmp" baseName)
+            || (lib.hasSuffix ".md3" baseName)
+            || (lib.hasSuffix ".mdl" baseName)
+            || (lib.hasSuffix ".obj" baseName)
+            || (lib.hasSuffix ".ogg" baseName)
+            || (lib.hasSuffix ".png" baseName)
+            || (lib.hasSuffix ".shader" baseName)
+            || (lib.hasSuffix ".skin" baseName)
+            || (lib.hasSuffix ".sounds" baseName)
+            || (lib.hasSuffix ".sp2" baseName)
+            || (lib.hasSuffix ".spr" baseName)
+            || (lib.hasSuffix ".spr32" baseName)
+            || (lib.hasSuffix ".svg" baseName)
+            || (lib.hasSuffix ".tga" baseName)
+            || (lib.hasSuffix ".wav" baseName)
+            || (lib.hasSuffix ".width" baseName)
+            || (lib.hasSuffix ".zym" baseName)
+        );
+    in result;
+
+    pk3 = drv: mkDerivation {
+        name = "${drv.name}.pk3";
+        version = drv.version;
+
+        nativeBuildInputs = with pkgs; [
+            zip
+        ];
+
+        phases = [ "installPhase" ];
+        installPhase = ''
+            (cd ${drv} && zip -r ${drv.pk3args or ""} $out .)
+        '';
+    };
+
+    targets = rec {
+        font-dejavu = mkDerivation rec {
+            name = "font-dejavu-${version}";
+            version = vers."data/font-dejavu";
+
+            src = srcs."data/font-dejavu";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        font-nimbussansl = mkDerivation rec {
+            name = "font-nimbussansl-${version}";
+            version = vers."data/font-nimbussansl";
+
+            src = srcs."data/font-nimbussansl";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        font-unifont = mkDerivation rec {
+            name = "font-unifont-${version}";
+            version = vers."data/font-unifont";
+
+            src = srcs."data/font-unifont";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        font-xolonium = mkDerivation rec {
+            name = "font-xolonium-${version}";
+            version = vers."data/font-xolonium";
+
+            src = srcs."data/font-xolonium";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        d0_blind_id = mkDerivation rec {
+            name = "d0_blind_id-${version}";
+            version = vers."d0_blind_id";
+
+            src = srcs."d0_blind_id";
+
+            nativeBuildInputs = [
+                cmake
+            ];
+
+            buildInputs = with pkgs; [
+                openssl
+            ];
+
+            installPhase = ''
+                mkdir -p $out/lib
+                mkdir -p $out/include/d0_blind_id
+
+                cp libd0_blind_id.so $out/lib
+                (cd $src; cp d0.h d0_blind_id.h $out/include/d0_blind_id)
+
+                cp libd0_rijndael.so $out/lib
+                (cd $src; cp d0_rijndael.h $out/include/d0_blind_id)
+            '';
+        };
+
+        darkplaces = let
+            unwrapped = mkDerivation rec {
+                name = "darkplaces-unwrapped-${version}";
+                version = vers."darkplaces";
+
+                src = srcs."darkplaces";
+
+                nativeBuildInputs = [
+                    cmake
+                ];
+
+                buildInputs = with pkgs; [
+                    SDL2
+
+                    zlib
+                    libjpeg
+                ];
+
+                installPhase = ''
+                    mkdir -p $out/bin
+                    cp darkplaces-{dedicated,sdl} $out/bin
+                '';
+            };
+            result = mkDerivation rec {
+                name = "darkplaces-${version}";
+                version = vers."darkplaces";
+
+                buildInputs = unwrapped.buildInputs ++ runtimeInputs;
+                runtimeInputs = with pkgs; [
+                    d0_blind_id
+
+                    freetype
+
+                    curl
+                    zlib
+
+                    libjpeg
+                    libpng
+
+                    libogg
+                    libtheora
+                    libvorbis
+                ];
+
+                phases = [ "installPhase" ];
+                installPhase = ''
+                    mkdir -p $out/bin
+
+                    cp -r ${unwrapped}/bin .
+                    chmod +w bin/*
+                    cd bin
+
+                    for exe in dedicated sdl; do
+                        f=darkplaces-$exe
+                        rpath=$(patchelf --print-rpath $f)
+                        rpath=''${rpath:+$rpath:}${lib.makeLibraryPath runtimeInputs}
+                        patchelf --set-rpath $rpath $f
+                        cp $f $out/bin/xonotic-linux64-$exe
+                    done
+                '';
+            };
+        in result;
+
+        gmqcc = mkDerivation rec {
+            name = "gmqcc-${version}";
+            version = vers."gmqcc";
+
+            src = srcs."gmqcc";
+
+            nativeBuildInputs = [
+                cmake
+            ];
+
+            installPhase = ''
+                mkdir -p $out/bin
+                cp gmqcc $out/bin
+            '';
+        };
+
+        netradiant = mkDerivation rec {
+            name = "netradiant-${version}";
+            version = vers."netradiant";
+
+            src = srcs."netradiant";
+
+            nativeBuildInputs = with pkgs; [
+                cmake
+                git
+            ];
+
+            buildInputs = with pkgs; [
+                pkgconfig
+                glib
+                pcre
+                libxml2
+                ncurses
+                libjpeg
+                libpng
+                minizip
+
+                mesa
+
+                xorg.libXt
+                xorg.libXmu
+                xorg.libSM
+                xorg.libICE
+                xorg.libpthreadstubs
+                xorg.libXdmcp
+
+                gnome2.gtk
+                gnome2.gtkglext
+                gnome3.gtk
+            ];
+        };
+
+        xonotic-data = mkDerivation rec {
+            name = "xonotic-data-${version}";
+            version = vers."data/xonotic-data";
+
+            src = srcs."data/xonotic-data";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+                chmod -R +w $out
+                find $out -depth -type d -empty -exec rmdir {} \;
+            '';
+        };
+
+        xonotic-data-code = mkDerivation rec {
+            name = "xonotic-data-code-${version}";
+            version = vers."data/xonotic-data/qcsrc";
+
+            src = srcs."data/xonotic-data/qcsrc";
+
+            env = {
+                QCC = "${gmqcc}/bin/gmqcc";
+                VERSION = version;
+            };
+
+            nativeBuildInputs = with pkgs; [
+                cmake
+                git
+            ];
+
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+                chmod -R +w $out
+                cp {menu,progs,csprogs}.{dat,lno} $out
+                cp csprogs-${version}.{dat,lno,txt} $out/.tmp
+                find $out -depth -type d -empty -exec rmdir {} \;
+            '';
+
+            passthru.csprogs = pkgs.runCommand "xonotic-data-csprogs-${version}" { inherit version; pk3name = "csprogs-${version}"; } ''
+                mkdir $out
+                cp ${xonotic-data-code}/.tmp/csprogs-${version}.{dat,lno,txt} $out
+            '';
+        };
+
+        # todo: build
+        xonotic-maps = mkDerivation rec {
+            name = "xonotic-maps-${version}";
+            version = vers."data/xonotic-maps";
+
+            src = srcs."data/xonotic-maps";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+            '';
+
+            passthru.dance = mkDerivation rec {
+                name = "dance";
+                version = vers."data/xonotic-maps";
+
+                src = pkgs.fetchurl {
+                    url = http://beta.xonotic.org/autobuild-bsp/dance-full-88c416b8c11bdcecfdb889af2a2b97b4c0e2b8de-319ee7234504199da56f07ce25185f6d6cb889cd.pk3;
+                    sha256 = "1jgdg4mz56kbxcy3mwn4h5qlf3ahm1cmarp9l70fz9nfn6cnaknq";
+                };
+
+                phases = [ "installPhase" ];
+
+                installPhase = ''
+                    mkdir -p $out
+                    cd $out
+                    ${pkgs.unzip}/bin/unzip $src
+                '';
+            };
+        };
+
+        xonotic-music = mkDerivation rec {
+            name = "xonotic-music-${version}";
+            version = vers."data/xonotic-music";
+
+            src = srcs."data/xonotic-music";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+            '';
+
+            passthru.pk3args = "-0";
+        };
+
+        xonotic-nexcompat = mkDerivation rec {
+            name = "xonotic-nexcompat-${version}";
+            version = vers."data/xonotic-nexcompat";
+
+            src = srcs."data/xonotic-nexcompat";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+            '';
+        };
+
+        xonotic-keys = mkDerivation rec {
+            name = "xonotic-keys-${version}";
+            version = vers."xonotic";
+
+            src = srcs."xonotic";
+
+            phases = [ "installPhase" ];
+
+            installPhase = ''
+                mkdir $out
+                cp $src/*.d0pk $out
+            '';
+        };
+
+        xonotic = mkDerivation rec {
+            name = "xonotic-${version}";
+            version = vers."xonotic";
+
+            src = srcs."xonotic";
+
+            env = {
+                XON_NO_DAEMON = "1";
+            };
+
+            passthru.paks = {
+                inherit
+                    font-dejavu
+                    font-nimbussansl
+                    font-unifont
+                    font-xolonium
+                    xonotic-data
+                    xonotic-data-code
+                    xonotic-maps
+                    xonotic-music
+                    xonotic-nexcompat
+                ;
+                xonotic-data-csprogs = xonotic-data-code.passthru.csprogs;
+                inherit (xonotic-maps)
+                    dance
+                ;
+            };
+
+            phases = [ "installPhase" ];
+
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+                cp ${darkplaces}/bin/* $out
+
+                mkdir -p $out/data
+                ${lib.concatStringsSep "\n" (lib.mapAttrsToList (k: v:
+                    # "cp ${pk3 v} $out/data/${k}.pk3"
+                    "ln -s ${v} $out/data/${k}.pk3dir"
+                ) passthru.paks)}
+
+                mkdir -p $out/mapping
+                ln -s ${netradiant} $out/mapping/${netradiant.name}
+            '';
+        };
+
+        dockerImage = let
+            main = pkgs.dockerTools.buildImage {
+                name = "xonotic";
+                tag = VERSION;
+                contents = mkDerivation {
+                    name = "xonotic-init";
+                    phases = [ "installPhase" ];
+                    installPhase = ''
+                        mkdir -p $out
+                        cat > $out/init <<EOF
+                        #!${stdenv.shell}
+                        ${pkgs.coreutils}/bin/ln -s ${xonotic-keys}/* /
+
+                        ${pkgs.coreutils}/bin/ls -l /
+                        ${pkgs.coreutils}/bin/ls -l /data
+
+                        exec ${darkplaces}/bin/xonotic-linux64-dedicated "\''${@}"
+                        EOF
+                        chmod +x $out/init
+                    '';
+                };
+                config.Entrypoint = "/init";
+            };
+            unpackImage = { name, from, to }: pkgs.dockerTools.buildImage {
+                name = "xonotic_${name}";
+                tag = VERSION;
+                contents = mkDerivation {
+                    name = "xonotic-${name}-init";
+                    phases = [ "installPhase" ];
+                    installPhase = ''
+                        mkdir -p $out
+                        cat > $out/init <<EOF
+                        #!${stdenv.shell}
+                        ${pkgs.coreutils}/bin/cp -r ${from} /data/${to}
+                        EOF
+                        chmod +x $out/init
+                    '';
+                };
+                config.Entrypoint = "/init";
+                fromImage = pkgs.dockerTools.buildImage {
+                    name = "xonotic_deps";
+                    contents = mkDerivation {
+                        name = "xonotic_deps";
+                        phases = [ "installPhase" ];
+                        installPhase = ''
+                            mkdir -p $out
+                            cat > $out/init <<EOF
+                            ${stdenv.shell}
+                            ${pkgs.coreutils}
+                            EOF
+                        '';
+                    };
+                };
+            };
+        in { main = main; }
+            // (lib.mapAttrs (k: v: unpackImage { name = k; from = pk3 v; to = "${v.pk3name or k}.pk3"; }) xonotic.paks)
+        ;
+    };
+
+    cleanSourceFilter = name: type: let
+        baseName = baseNameOf (toString name);
+        result = (lib.cleanSourceFilter name type)
+            && !(lib.hasSuffix ".nix" baseName)
+            && !(type == "directory" && baseName == ".git")
+            && !(type == "directory" && baseName == ".idea")
+            && !(type == "directory" && (lib.hasPrefix "cmake-build-" baseName))
+        ;
+    in result;
+
+    localFilesCustom = src: filter:
+        builtins.filterSource (name: type: (cleanSourceFilter name type) && (filter name type)) src
+    ;
+
+    localFiles = src: localFilesCustom src (name: type: true);
+
+    stdenv = if (cc == null) then pkgs.stdenv
+            else pkgs.overrideCC pkgs.stdenv pkgs."${cc}";
+
+    mkDerivation = {env ? {}, shellHook ? "", runtimeInputs ? [], ...}@args: stdenv.mkDerivation ({}
+        // { enableParallelBuilding = true; }
+        // (removeAttrs args ["env" "shellHook" "runtimeInputs"])
+        // env
+        // {
+            shellHook = ''
+                ${shellHook}
+                ${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: "export ${n}=${v}") env)}
+                export LD_LIBRARY_PATH=''${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}${lib.makeLibraryPath runtimeInputs}
+            '';
+        }
+    );
+
+    shell = let inputs = (lib.mapAttrsToList (k: v: v) targets); in stdenv.mkDerivation (rec {
+        name = "xonotic-shell";
+        nativeBuildInputs = builtins.map (it: it.nativeBuildInputs) (builtins.filter (it: it?nativeBuildInputs) inputs);
+        buildInputs = builtins.map (it: it.buildInputs) (builtins.filter (it: it?buildInputs) inputs);
+        shellHook = builtins.map (it: it.shellHook) (builtins.filter (it: it?shellHook) inputs);
+    });
+in { inherit shell; } // targets
index 47eba2eb3132a4fa2a0bf7e1867e5c37b9af91ec..c79e6e8f8d2427846e5fc57931139e1448f8e757 100644 (file)
@@ -29,6 +29,8 @@ B 108.61.164.188:
 B 85.25.139.30:
 B 51.15.46.239:
 B 163.172.104.191:
+B 89.163.144.198:
+B 51.38.113.134:
 
 # Emergency packs. Specify as:
 # E http://packurl/pack.pk3 file-in-pack.txt
index d18ba320c96ad24a9dc032a1a5a636b3f1f90a91..1e5b08fe1ea42197cc122543018229f62393254d 100755 (executable)
@@ -16,6 +16,7 @@ git reset --hard origin/master
 # Mode parameter:
 #   po:  just update the translations.
 #   all: also update the translation template. Will create a new commit every time, as the date header changes.
+export BATCH=true
 sh tx.sh po
 
 if [ x"`git ls-files -dm`" = x".tx/merge-base" ]; then
index 0076dae4763a9a3c3402bc8746492149eb277584..e83aa0a4050d74c7394f1ae14a71bd951ded2882 100644 (file)
@@ -26,7 +26,7 @@ case "$cmd" in
                cleandp=false
                cleanqcc=false
                cleanqc=false
-               compiled0=false
+               compiled0=
                debug=debug
                if [ -z "$CC" ]; then
                        export CC="gcc"
@@ -38,6 +38,10 @@ case "$cmd" in
                                        compiled0=true
                                        shift
                                        ;;
+                               -1)
+                                       compiled0=false
+                                       shift
+                                       ;;
                                -c)
                                        cleand0=true
                                        cleandp=true
@@ -183,7 +187,10 @@ case "$cmd" in
                rm -f conftest
 
                verbose cd "$d0/d0_blind_id"
-               if ! $compiled0; then
+               if [ -z "$compiled0" ]; then
+                       # In doubt, compile.
+                       compiled0=true
+
                        # compilation of crypto library failed
                        # use binaries then, if we can...
                        mkdir -p .libs
@@ -191,15 +198,16 @@ case "$cmd" in
                                verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
                                verbose cp "$d0/misc/buildfiles/win32/libd0_rijndael"-* .libs/
                                verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
+                               compiled0=false
                        else
                                case "`uname`" in
                                        Darwin)
                                                verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
                                                verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_rijndael".* .libs/
+                                               compiled0=false
                                                ;;
                                        *)
                                                msg "Always need to compile libd0_blind_id on `uname`."
-                                               compiled0=true
                                                ;;
                                esac
                        fi
index bbcedec0ddbc6a2db0fb9056a28b3a75d488ce6f..f8f3455206619a2b1c5ac3a5ca8b95154bd9e9dd 100755 (executable)
@@ -164,7 +164,8 @@ buildthemap()
        blobhash=$4
        commithash=$5
        if lwp-request -m HEAD "$url$M-$blobhash.pk3"; then
-               continue
+               # already compiled
+               return
        fi
 
        git reset --hard
@@ -237,13 +238,19 @@ screenshotthemap()
        M=$3
        blobhash=$4
        commithash=$5
+       if ! [ -f "$bspdir/$M-$blobhash.pk3" ]; then
+               # not downloaded yet
+               return
+       fi
+
        if lwp-request -m HEAD "$url$M-$blobhash/$M-000000.jpg"; then
-               continue
+               # already done
+               return
        fi
 
        if ! unzip -l "$bspdir/$M-$blobhash.pk3" "maps/$M.bsp"; then
                # no BSP file
-               continue
+               return
        fi
 
        rm -rf ~/.xonotic/data
@@ -304,14 +311,12 @@ getthemap()
                if ! curl -o "$bspdir/$M-$blobhash.pk3" "$url$M-$blobhash.pk3"; then
                        rm -f "$bspdir/$M-$blobhash.pk3"
                        echo "WARNING: could not download $url$M-$blobhash.pk3, maybe not ready yet"
-                       getthemap_fail=true
                        return 0
                fi
        fi
        if ! unzip -l "$bspdir/$M-$blobhash.pk3"; then
                rm -f "$bspdir/$M-$blobhash.pk3"
                echo "WARNING: could not download $url$M-$blobhash.pk3, invalid zip file"
-               getthemap_fail=true
                return 0
        fi
 }
@@ -376,13 +381,17 @@ case "$1" in
                        git clean -xfd
                        git checkout -f "$HASH"
 
+                       getthemap_fail=false
                        rundownload
+
+                       allmaps "$HASH" screenshotthemap "$REFNAME" "$url_http"
+
                        if $getthemap_fail; then
+                               # If any map fetch failed, we've skipped them and thus need to try again later.
+                               # Note that we're not going to re-screenshot maps because of this as we'll check for uploaded screenshots first.
                                continue
                        fi
 
-                       allmaps "$HASH" screenshotthemap "$REFNAME" "$url_http"
-
                        touch "$screenshot_cachedir/$HASH"
                done
                git checkout -f master
diff --git a/nix-build.sh b/nix-build.sh
new file mode 100755 (executable)
index 0000000..e8ac520
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+set -euo pipefail
+cd ${0%/*}
+export VERSION_data_xonotic_data_pk3dir=$(cd $PWD/data/xonotic-data.pk3dir && git describe --tags --dirty --long --always)
+exec nix-build $@
diff --git a/release.nix b/release.nix
new file mode 100644 (file)
index 0000000..ae69b61
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    nixpkgs ? <nixpkgs>,
+    systems ? [ "i686-linux" "x86_64-linux" ],
+}:
+{
+    xonotic = (import <nixpkgs/lib>).genAttrs systems (system:
+        import ./default.nix {
+            pkgs = import nixpkgs { inherit system; };
+        }
+    );
+}