|
|
@@ -1,10 +1,17 @@ |
|
|
|
#!/bin/bash |
|
|
|
# Usage: create a file foo.c, make foo a symlink to this script |
|
|
|
# When foo is executed, this script silently compiles foo.c into .make-and-exec-binaries/foo and execs that with the arguments provided. |
|
|
|
# The compilation goes through make, so later invocations directly exec the binary with little delay. |
|
|
|
# When foo is executed, this script silently compiles foo.c into .make-and-exec-binaries/foo (if necessary) and execs that with the arguments provided. |
|
|
|
# Making a symlink named foo-dbg causes it to compile foo.c with -DDEBUG. |
|
|
|
# To customise the compilation, you can set a CFLAGS env var before running foo. |
|
|
|
set -e |
|
|
|
name="$(basename "$0")" |
|
|
|
cd "$(dirname "$0")" |
|
|
|
make --file .make-and-exec-Makefile --silent ".make-and-exec-binaries/${name}" |
|
|
|
exec "./.make-and-exec-binaries/${name}" "$@" |
|
|
|
sourcename="${0%-dbg}.c" |
|
|
|
if [[ "$0" == *-dbg ]]; then opt='-O0 -DDEBUG'; else opt='-O3'; fi |
|
|
|
targetfile="$(dirname "$0")/.make-and-exec-binaries/$(basename "$0")" |
|
|
|
if [[ ! -f "${targetfile}" || "${sourcename}" -nt "${targetfile}" ]]; then |
|
|
|
mkdir -p "$(dirname "$0")/.make-and-exec-binaries" |
|
|
|
gcc ${opt} ${CFLAGS} -o "${targetfile}" "${sourcename}" || exit |
|
|
|
testfile="$(dirname "$0")/.$(basename "${0%-dbg}")-test" |
|
|
|
if [[ -f "${testfile}" ]]; then |
|
|
|
"${testfile}" || { st=$?; touch -d '1970-01-01T00:00:00Z' "${targetfile}"; exit "${st}"; } |
|
|
|
fi |
|
|
|
fi |
|
|
|
exec "${targetfile}" "$@" |