-#!/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"
+}