90 lines
2.7 KiB
Bash
90 lines
2.7 KiB
Bash
#!/usr/bin/env sh
|
||
set -e # exit on first command error
|
||
|
||
###############################################################################
|
||
# check_stdvars.sh – verify that user-supplied CC/CFLAGS/CPPFLAGS/LDFLAGS/
|
||
# LDLIBS reach every compile- and link-command emitted by a recursive Make.
|
||
#
|
||
# Usage: tests/check_stdvars.sh build.log
|
||
# where build.log is produced with:
|
||
# make -nr V=1 \
|
||
# CC='cc -DCC_TEST' \
|
||
# CFLAGS='-DCFLAGS_TEST' \
|
||
# CPPFLAGS='-DCPPFLAGS_TEST' \
|
||
# LDFLAGS='-DLDFLAGS_TEST' \
|
||
# LDLIBS='-DLDLIBS_TEST' \
|
||
# > build.log
|
||
###############################################################################
|
||
|
||
log_file=${1:?need build-log file}
|
||
|
||
# marker flags injected by the Makefile test target
|
||
CC_TAG='-DCC_TEST'
|
||
CF_TAG='-DCFLAGS_TEST'
|
||
CP_TAG='-DCPPFLAGS_TEST'
|
||
LD_TAG='-DLDFLAGS_TEST'
|
||
LL_TAG='-DLDLIBS_TEST'
|
||
|
||
compile_seen=0 ; compile_ok=0
|
||
link_seen=0 ; link_ok=0
|
||
fail=0
|
||
|
||
report() {
|
||
echo "✖ $1:" >&2
|
||
echo " $2" >&2
|
||
fail=1
|
||
}
|
||
|
||
# read log line-by-line
|
||
while IFS= read -r line
|
||
do
|
||
# skip blank lines, comments, or progress "echo …" lines
|
||
[ -z "$line" ] && continue
|
||
case "$line" in
|
||
\#*) continue ;;
|
||
' echo '*) continue ;; # leading whitespace + echo
|
||
'echo '*) continue ;; # echo with no leading whitespace
|
||
esac
|
||
|
||
# classify
|
||
step=other
|
||
case "$line" in
|
||
*' -c '*) step=compile ;; # compile if -c appears
|
||
*' cc '*|cc\ *|*' gcc '*|gcc\ *|*' clang '*|clang\ *|*' g++ '*|g++\ *|*' clang++ '*|clang++\ *)
|
||
step=link ;; # compiler without -c ⇒ link
|
||
esac
|
||
[ "$step" = other ] && continue
|
||
|
||
if [ "$step" = compile ]; then
|
||
compile_seen=$((compile_seen + 1))
|
||
ok=1
|
||
case "$line" in *"$CC_TAG"*) : ;; *) ok=0 ;; esac
|
||
case "$line" in *"$CF_TAG"*) : ;; *) ok=0 ;; esac
|
||
case "$line" in *"$CP_TAG"*) : ;; *) ok=0 ;; esac
|
||
if [ "$ok" -eq 1 ]; then
|
||
compile_ok=$((compile_ok + 1))
|
||
else
|
||
report "compile cmd missing marker(s)" "$line"
|
||
fi
|
||
else # link
|
||
link_seen=$((link_seen + 1))
|
||
ok=1
|
||
case "$line" in *"$LD_TAG"*) : ;; *) ok=0 ;; esac
|
||
case "$line" in *"$LL_TAG"*) : ;; *) ok=0 ;; esac
|
||
if [ "$ok" -eq 1 ]; then
|
||
link_ok=$((link_ok + 1))
|
||
else
|
||
report "link cmd missing marker(s)" "$line"
|
||
fi
|
||
fi
|
||
done < "$log_file"
|
||
|
||
if [ "$fail" -ne 0 ]; then
|
||
echo "standard-variable propagation test FAILED" >&2
|
||
echo " compile: $compile_ok / $compile_seen OK" >&2
|
||
echo " link : $link_ok / $link_seen OK" >&2
|
||
exit 1
|
||
fi
|
||
|
||
echo "✓ $compile_seen compile + $link_seen link commands: all markers present"
|
||
exit 0 |