2019-09-19 16:11:47 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
# $1:WATCHROOT (default: ".")
|
|
|
|
|
g_watchroot="$(readlink -f "${1:-.}")"
|
|
|
|
|
|
|
|
|
|
# compile using bare make command
|
|
|
|
|
do_make() { # $1:DIR $2:OBJECT
|
|
|
|
|
# extract params
|
|
|
|
|
local dir="$1"
|
|
|
|
|
local object="$2"
|
|
|
|
|
|
|
|
|
|
# extract Makefile 'source pattern'
|
2019-09-20 12:56:25 +00:00
|
|
|
local srcpat="$(grep -E "^#@SRCPAT" "${dir}/Makefile" | tail -n 1 | sed -r "s/^#@SRCPAT\s+//")"
|
2019-09-19 16:11:47 +00:00
|
|
|
|
|
|
|
|
if [ -z "${srcpat}" ]; then
|
2019-09-20 09:02:01 +00:00
|
|
|
echo "Empty source pattern! Makefile needs '#@SRCPAT' annotation!"
|
|
|
|
|
|
2019-09-19 16:11:47 +00:00
|
|
|
elif [[ "${object}" =~ ${srcpat} ]]; then
|
2019-09-20 12:56:25 +00:00
|
|
|
# check for autodoc target
|
|
|
|
|
local target="$(grep -E "^autodoc:" "${dir}/Makefile" | sed -r "s/:.*$//")"
|
|
|
|
|
local target="${target:-all}"
|
|
|
|
|
|
|
|
|
|
echo "SRCPAT OK, building '${target}'."
|
|
|
|
|
make --no-print-directory -C "${dir}" -j "${target}"
|
2019-09-20 09:02:01 +00:00
|
|
|
|
2019-09-19 16:11:47 +00:00
|
|
|
else
|
2019-09-20 09:02:01 +00:00
|
|
|
echo "SRCPAT mismatch '${srcpat}'."
|
2019-09-19 16:11:47 +00:00
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# compile a directory
|
2019-09-20 09:02:01 +00:00
|
|
|
do_compile() { # $1:DIR $2:OBJECT $3:DONE
|
2019-09-19 16:11:47 +00:00
|
|
|
# extract params
|
|
|
|
|
local dir="$1"
|
|
|
|
|
local object="$2"
|
2019-09-20 09:02:01 +00:00
|
|
|
local done="${3:-0}"
|
2019-09-19 16:11:47 +00:00
|
|
|
|
2019-09-20 09:02:01 +00:00
|
|
|
# build systems
|
|
|
|
|
|
|
|
|
|
if [ -r "${dir}/Makefile" ]; then
|
|
|
|
|
# Makefile found
|
|
|
|
|
echo -n "Using '${dir}/Makefile'. "
|
2019-09-19 16:11:47 +00:00
|
|
|
do_make "${dir}" "${object}"
|
2019-09-20 09:02:01 +00:00
|
|
|
local done="1"
|
|
|
|
|
fi
|
2019-09-19 16:11:47 +00:00
|
|
|
|
2019-09-20 09:02:01 +00:00
|
|
|
# search parent dir for more build instructions
|
|
|
|
|
if [ "${dir}" != "${g_watchroot}" ]; then
|
|
|
|
|
# never leave $g_watchroot
|
2019-09-20 07:48:30 +00:00
|
|
|
local dir="$(dirname "${dir}")"
|
2019-09-20 09:02:01 +00:00
|
|
|
do_compile "${dir}" "${object}" "${done}"
|
2019-09-19 16:11:47 +00:00
|
|
|
|
2019-09-20 09:02:01 +00:00
|
|
|
elif [ "${done}" == "0" ]; then
|
|
|
|
|
# hit $g_watchroot
|
|
|
|
|
echo "No build instructions found!"
|
2019-09-19 16:11:47 +00:00
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# process an inotify event
|
|
|
|
|
do_handle() { # $1:FLAGS $2:OBJECT
|
|
|
|
|
# extract params
|
|
|
|
|
local flags="$1"
|
|
|
|
|
shift 1
|
|
|
|
|
local dir="$(dirname "$*")"
|
|
|
|
|
local object="$(basename "$*")"
|
|
|
|
|
|
|
|
|
|
if [[ "${flags}" =~ "ISDIR" ]]; then
|
2019-09-20 07:48:30 +00:00
|
|
|
# object refers to directory
|
2019-09-19 16:11:47 +00:00
|
|
|
local dir="${dir}/${object}"
|
|
|
|
|
local object="."
|
|
|
|
|
fi
|
|
|
|
|
|
2019-09-20 07:48:30 +00:00
|
|
|
# start using toolchain
|
2019-09-20 09:02:01 +00:00
|
|
|
echo -n "'${object}': '${flags}' in '${dir}'. "
|
2019-09-19 16:11:47 +00:00
|
|
|
do_compile "${dir}" "${object}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# MAIN
|
|
|
|
|
#
|
|
|
|
|
|
2019-09-20 07:48:30 +00:00
|
|
|
echo "Booting ${0} in '${g_watchroot}'."
|
2019-09-19 16:11:47 +00:00
|
|
|
# setup inotify:
|
|
|
|
|
# -mrq monitor, recursive, quiet
|
|
|
|
|
# -e events
|
|
|
|
|
# --format %e eventlist csv, %w workdir, %f filename
|
|
|
|
|
inotifywait -mrq \
|
|
|
|
|
-e create -e delete -e moved_to -e close_write \
|
|
|
|
|
--format '%e %w%f' \
|
|
|
|
|
"${g_watchroot}" | \
|
|
|
|
|
\
|
|
|
|
|
while read FILE; do
|
|
|
|
|
do_handle ${FILE}
|
|
|
|
|
done
|