]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/tools/qcc.sh
Merge branch 'master' into DefaultUser/func_button_relay
[xonotic/xonotic-data.pk3dir.git] / qcsrc / tools / qcc.sh
index b3ad199b8f833a0d5263f4921b8bc5a94b7298d8..865e6e592ca48c037932fa643ec80e9dd1b20f83 100755 (executable)
@@ -1,26 +1,59 @@
-#!/bin/sh
-set -eu
-
-MODE=$1
-IN=$3
-OUT=$2
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$' \n\t'
 
+WORKDIR=${WORKDIR}
+CPP=${CPP}
 QCC=${QCC}
 QCCIDENT="-DGMQCC"
+QCCDEFS=${QCCDEFS}
+QCCFLAGS=${QCCFLAGS}
+
+function qpp() {
+    IN=$1
+    OUT=$2
+    case ${MODE} in
+        client) DEFS="-DGAMEQC -DCSQC"
+        ;;
+        menu) DEFS="-DMENUQC"
+        ;;
+        server) DEFS="-DGAMEQC -DSVQC"
+        ;;
+    esac
+    >&2 echo + ${CPP} "${@:3}" ${DEFS} "${IN}"
+    set +e
+    # additional information
+    ${CPP} "${@:3}" ${DEFS} \
+        -dM 1>"${WORKDIR}/${MODE}_macros.txt" \
+        -H 2>"${WORKDIR}/${MODE}_includes.txt" \
+        "${IN}"
+    # main step
+    ${CPP} "${@:3}" ${DEFS} -MMD -MP -MT "${OUT}" -Wall -Wundef -Werror "${IN}" -o "${WORKDIR}/${MODE}.txt"
+    err=$?
+    set -e
+    if [ ${err} -ne 0 ]; then return ${err}; fi
+    sed -E 's/^#(line)? ([[:digit:]]+) "(.*)".*/'$'\\\n''#pragma file(\3)'$'\\\n''#pragma line(\2)/g' "${WORKDIR}/${MODE}.txt"
+}
 
-case ${MODE} in
-    client) PROG=CSQC
-    ;;
-    menu) PROG=MENUQC
-    ;;
-    server) PROG=SVQC
-    ;;
-esac
+function qcc() {
+    >&2 echo + $(basename ${QCC}) $@
+    # FIXME: relative compiler path is too deep
+    (cd tools && ${QCC} "$@")
+}
 
-CPP="${CPP} -I. ${QCCIDENT} ${QCCDEFS} -D${PROG}"
-${CPP} -MMD -MP -MT ${OUT} -Wall -Wundef -Werror -o ../.tmp/${MODE}.txt ${IN}
-${CPP} -dM 1>../.tmp/${MODE}_macros.txt -H 2>../.tmp/${MODE}_includes.txt ${IN}
-sed 's/^#\(line\)\? \([[:digit:]]\+\) "\(.*\)".*/\n#pragma file(\3)\n#pragma line(\2)/g' ../.tmp/${MODE}.txt > ../.tmp/${MODE}.qc
-cd ${MODE}
-echo $(basename ${QCC}) ${QCCFLAGS} -o ${OUT} ${MODE}.qc
-${QCC} ${QCCFLAGS} -o ${OUT} ../../.tmp/${MODE}.qc
+$(return >/dev/null 2>&1) || {
+    MODE=$1
+    OUT=$2
+    IN=$3
+    case "${OUT}" in
+      /*)
+        OUT_ABSOLUTE=${OUT}
+        ;;
+      *)
+        OUT_ABSOLUTE=${PWD}/${OUT}
+        ;;
+    esac
+    set -x
+    qpp "${IN}" "${OUT}" -I. ${QCCIDENT} ${QCCDEFS} > "${WORKDIR}/${MODE}.qc"
+    qcc ${QCCFLAGS} -o "${OUT_ABSOLUTE}" "../${WORKDIR}/${MODE}.qc"
+}