]> git.xonotic.org Git - xonotic/xonotic.git/blobdiff - derivation.nix
Update nix build
[xonotic/xonotic.git] / derivation.nix
diff --git a/derivation.nix b/derivation.nix
new file mode 100644 (file)
index 0000000..945f39a
--- /dev/null
@@ -0,0 +1,381 @@
+# nix-shell -A shell
+# nix-build -A xonotic
+# --argstr cc clang
+{
+    pkgs, lib,
+    cc ? null,
+    cmake ? pkgs.cmake_2_8,
+}:
+let
+    VERSION = "0.8.2";
+
+    stdenv = if (cc == null) then pkgs.stdenv
+        else pkgs.overrideCC pkgs.stdenv pkgs."${cc}";
+
+    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);
+
+    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 ".txt" baseName)
+            || (lib.hasSuffix ".cmake" baseName)
+            || (lib.hasSuffix ".in" baseName)
+            || (lib.hasSuffix ".sh" baseName)
+
+            || (lib.hasSuffix ".qc" baseName)
+            || (lib.hasSuffix ".qh" baseName)
+            || (lib.hasSuffix ".inc" baseName)
+
+            || (lib.hasSuffix ".cfg" baseName)
+        ;
+    in result;
+
+    srcs = {
+        # https://gitlab.com/xonotic/xonotic
+        "xonotic" = localFilesMain ./.;
+        "data/font-dejavu" = localFiles ./data/font-dejavu.pk3dir;
+        "data/font-nimbussansl" = localFiles ./data/font-nimbussansl.pk3dir;
+        "data/font-unifont" = localFiles ./data/font-unifont.pk3dir;
+        "data/font-xolonium" = localFiles ./data/font-xolonium.pk3dir;
+
+        # https://gitlab.com/xonotic/d0_blind_id
+        "d0_blind_id" = localFiles ./d0_blind_id;
+
+        # https://gitlab.com/xonotic/darkplaces
+        "darkplaces" = localFiles ./darkplaces;
+
+        # https://gitlab.com/xonotic/gmqcc
+        "gmqcc" = localFiles ./gmqcc;
+
+        # https://gitlab.com/xonotic/netradiant
+        "netradiant" = localFiles ./netradiant;
+
+        # https://gitlab.com/xonotic/xonotic-data.pk3dir
+        "data/xonotic-data" = localFilesCustom ./data/xonotic-data.pk3dir (name: type: type == "directory" || !(isCode name));
+        "data/xonotic-data/qcsrc" = localFilesCustom ./data/xonotic-data.pk3dir (name: type: type == "directory" || (isCode name));
+
+        # https://gitlab.com/xonotic/xonotic-maps.pk3dir
+        "data/xonotic-maps" = localFiles ./data/xonotic-maps.pk3dir;
+
+        # https://gitlab.com/xonotic/xonotic-music.pk3dir
+        "data/xonotic-music" = localFiles ./data/xonotic-music.pk3dir;
+
+        # https://gitlab.com/xonotic/xonotic-nexcompat.pk3dir
+        "data/xonotic-nexcompat" = localFiles ./data/xonotic-nexcompat.pk3dir;
+    };
+
+    targets = rec {
+        font-dejavu = mkDerivation rec {
+            name = "font-dejavu-${version}";
+            version = VERSION;
+
+            src = srcs."data/font-dejavu";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        font-nimbussansl = mkDerivation rec {
+            name = "font-nimbussansl-${version}";
+            version = VERSION;
+
+            src = srcs."data/font-nimbussansl";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        font-unifont = mkDerivation rec {
+            name = "font-unifont-${version}";
+            version = VERSION;
+
+            src = srcs."data/font-unifont";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        font-xolonium = mkDerivation rec {
+            name = "font-xolonium-${version}";
+            version = VERSION;
+
+            src = srcs."data/font-xolonium";
+
+            phases = [ "installPhase" ];
+            installPhase = ''
+                cp -r $src $out
+            '';
+        };
+
+        d0_blind_id = mkDerivation rec {
+            name = "d0_blind_id-${version}";
+            version = "xonotic-${VERSION}";
+
+            src = srcs."d0_blind_id";
+
+            nativeBuildInputs = [
+                cmake
+            ];
+
+            buildInputs = with pkgs; [
+                openssl
+            ];
+
+            installPhase = ''
+                mkdir -p $out/lib
+                cp libd0_blind_id.so $out/lib
+
+                mkdir -p $out/include/d0_blind_id
+                (cd $src; cp d0_blind_id.h d0.h $out/include/d0_blind_id)
+            '';
+        };
+
+        darkplaces = let
+            unwrapped = mkDerivation rec {
+                name = "darkplaces-unwrapped-${version}";
+                version = "xonotic-${VERSION}";
+
+                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 = "xonotic-${VERSION}";
+
+                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 darkplaces-sdl; do
+                        rpath=$(patchelf --print-rpath $exe)
+                        rpath=''${rpath:+$rpath:}${lib.makeLibraryPath runtimeInputs}
+                        patchelf --set-rpath $rpath $exe
+                    done
+
+                    for exe in dedicated sdl; do
+                        cp darkplaces-$exe $out/bin/xonotic-linux64-$exe
+                    done
+                '';
+            };
+        in result;
+
+        gmqcc = mkDerivation rec {
+            name = "gmqcc-${version}";
+            version = "xonotic-${VERSION}";
+
+            src = srcs."gmqcc";
+
+            nativeBuildInputs = [
+                cmake
+            ];
+
+            installPhase = ''
+                mkdir -p $out/bin
+                cp gmqcc $out/bin
+            '';
+        };
+
+        netradiant = mkDerivation rec {
+            name = "netradiant-${version}";
+            version = VERSION;
+
+            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 = "xonotic-${VERSION}";
+
+            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 = "xonotic-${VERSION}";
+
+            src = srcs."data/xonotic-data/qcsrc";
+
+            env = {
+                QCC = "${gmqcc}/bin/gmqcc";
+            };
+
+            nativeBuildInputs = with pkgs; [
+                cmake
+                git
+            ];
+
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+                chmod -R +w $out
+                cp {menu,progs,csprogs}.{dat,lno} $out
+                find $out -depth -type d -empty -exec rmdir {} \;
+            '';
+        };
+
+        xonotic = mkDerivation rec {
+            name = "xonotic-${version}";
+            version = VERSION;
+
+            src = srcs."xonotic";
+
+            env = {
+                XON_NO_DAEMON = "1";
+            };
+
+            phases = [ "installPhase" ];
+
+            # test: `ln -s`
+            # release: `cp -r`
+            installPhase = ''
+                mkdir $out
+                cp -r $src/. $out
+                cp ${darkplaces}/bin/* $out
+
+                mkdir -p $out/data
+                ln -s ${font-dejavu} $out/data/font-dejavu.pk3dir
+                ln -s ${font-nimbussansl} $out/data/font-nimbussansl.pk3dir
+                ln -s ${font-unifont} $out/data/font-unifont.pk3dir
+                ln -s ${font-xolonium} $out/data/font-xolonium.pk3dir
+
+                ln -s ${xonotic-data} $out/data/xonotic-data.pk3dir
+                ln -s ${xonotic-data-code} $out/data/xonotic-data-code.pk3dir
+                ln -s ${srcs."data/xonotic-maps"} $out/data/xonotic-maps.pk3dir # todo: build
+                ln -s ${srcs."data/xonotic-music"} $out/data/xonotic-music.pk3dir
+                ln -s ${srcs."data/xonotic-nexcompat"} $out/data/xonotic-nexcompat.pk3dir
+
+                mkdir -p $out/mapping
+                ln -s ${netradiant} $out/mapping/${netradiant.name}
+            '';
+        };
+    };
+
+    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 (n: v: v) targets); in stdenv.mkDerivation (rec {
+        name = "xonotic-shell";
+        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