]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/tools/qcc.sh
Optimize vehicle impact code by only calling vlen() if damage would be taken
[xonotic/xonotic-data.pk3dir.git] / qcsrc / tools / qcc.sh
index 6295828f443587daa487f458e5b20919cd62d484..865e6e592ca48c037932fa643ec80e9dd1b20f83 100755 (executable)
@@ -1,5 +1,6 @@
-#!/bin/sh
-set -eu
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$' \n\t'
 
 WORKDIR=${WORKDIR}
 CPP=${CPP}
@@ -11,37 +12,48 @@ QCCFLAGS=${QCCFLAGS}
 function qpp() {
     IN=$1
     OUT=$2
-    >&2 echo + ${CPP} ${@:3} ${IN}
+    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} \
-        -dM 1>${WORKDIR}/${MODE}_macros.txt \
-        -H 2>${WORKDIR}/${MODE}_includes.txt \
-        ${IN}
+    ${CPP} "${@:3}" ${DEFS} \
+        -dM 1>"${WORKDIR}/${MODE}_macros.txt" \
+        -H 2>"${WORKDIR}/${MODE}_includes.txt" \
+        "${IN}"
     # main step
-    ${CPP} ${@:3} -MMD -MP -MT ${OUT} -Wall -Wundef -Werror ${IN} -o ${WORKDIR}/${MODE}.txt
-    sed 's/^#\(line\)\? \([[:digit:]]\+\) "\(.*\)".*/\n#pragma file(\3)\n#pragma line(\2)/g' ${WORKDIR}/${MODE}.txt
+    ${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"
 }
 
 function qcc() {
     >&2 echo + $(basename ${QCC}) $@
     # FIXME: relative compiler path is too deep
-    (cd tools && ${QCC} $@)
+    (cd tools && ${QCC} "$@")
 }
 
 $(return >/dev/null 2>&1) || {
     MODE=$1
     OUT=$2
     IN=$3
-
-    case ${MODE} in
-        client) PROG=CSQC
+    case "${OUT}" in
+      /*)
+        OUT_ABSOLUTE=${OUT}
         ;;
-        menu) PROG=MENUQC
-        ;;
-        server) PROG=SVQC
+      *)
+        OUT_ABSOLUTE=${PWD}/${OUT}
         ;;
     esac
-
-    qpp ${IN} ${OUT} -I. ${QCCIDENT} ${QCCDEFS} -D${PROG} > ${WORKDIR}/${MODE}.qc
-    qcc ${QCCFLAGS} -o ${OUT} ../${WORKDIR}/${MODE}.qc
+    set -x
+    qpp "${IN}" "${OUT}" -I. ${QCCIDENT} ${QCCDEFS} > "${WORKDIR}/${MODE}.qc"
+    qcc ${QCCFLAGS} -o "${OUT_ABSOLUTE}" "../${WORKDIR}/${MODE}.qc"
 }