core-lightning/tools/check-includes.sh
Rusty Russell 00a0d09340 tools/check-includes.sh: test that c files include their .h files.
This is best-practice (to ensure prototypes match up), but there were a
few places we didn't (at least, directly).  Make it a requirement,
either of form "foo.h" or <dir/foo.h>.

The noise is the change to our print templates.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2021-09-17 09:43:22 +09:30

68 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
EXIT_CODE=0
# Check include guards
HEADER_ID_PREFIX="LIGHTNING_"
HEADER_ID_SUFFIX="_H"
REGEXP_EXCLUDE_FILES_WITH_PREFIX="ccan/"
for HEADER_FILE in $(git ls-files -- "*.h" | grep -vE "^${REGEXP_EXCLUDE_FILES_WITH_PREFIX}")
do
HEADER_ID_BASE=$(tr /- _ <<< "${HEADER_FILE/%.h/}" | tr "[:lower:]" "[:upper:]")
HEADER_ID="${HEADER_ID_PREFIX}${HEADER_ID_BASE}${HEADER_ID_SUFFIX}"
if [[ $(grep -cE "^#((ifndef|define) ${HEADER_ID}|endif /\\* ${HEADER_ID} \\*/)$" "${HEADER_FILE}") != 3 ]]; then
echo "${HEADER_FILE} seems to be missing the expected include guard:"
echo " #ifndef ${HEADER_ID}"
echo " #define ${HEADER_ID}"
echo " ..."
echo " #endif /* ${HEADER_ID} */"
echo
EXIT_CODE=1
fi
done
# Check redundant includes
filter_suffix() {
git ls-files | grep -v 'ccan/' | grep -E "\\.${1}"'$'
}
for HEADER_FILE in $(filter_suffix h); do
DUPLICATE_INCLUDES_IN_HEADER_FILE=$(grep -E "^#include " < "${HEADER_FILE}" | sort | uniq -d)
if [[ ${DUPLICATE_INCLUDES_IN_HEADER_FILE} != "" ]]; then
echo "Duplicate include(s) in ${HEADER_FILE}:"
echo "${DUPLICATE_INCLUDES_IN_HEADER_FILE}"
echo
EXIT_CODE=1
fi
C_FILE=${HEADER_FILE/%\.h/.c}
if [[ ! -e $C_FILE ]]; then
continue
fi
DUPLICATE_INCLUDES_IN_HEADER_AND_C_FILES=$(grep -hE "^#include " <(sort -u < "${HEADER_FILE}") <(sort -u < "${C_FILE}" | grep -v '"config.h"') | grep -E "^#include " | sort | uniq -d)
if [[ ${DUPLICATE_INCLUDES_IN_HEADER_AND_C_FILES} != "" ]]; then
echo "Include(s) from ${HEADER_FILE} duplicated in ${C_FILE}:"
echo "${DUPLICATE_INCLUDES_IN_HEADER_AND_C_FILES}"
echo
EXIT_CODE=1
fi
done
for C_FILE in $(filter_suffix c); do
DUPLICATE_INCLUDES_IN_C_FILE=$(grep -E "^#include " < "${C_FILE}" | sort | uniq -d)
if [[ ${DUPLICATE_INCLUDES_IN_C_FILE} != "" ]]; then
echo "Duplicate include(s) in ${C_FILE}:"
echo "${DUPLICATE_INCLUDES_IN_C_FILE}"
echo
EXIT_CODE=1
fi
H_FILE="${C_FILE%.c}.h"
H_BASE="$(basename "$H_FILE")"
if [ -f "$H_FILE" ] && ! grep -E '#include (<'"$H_FILE"'>|"'"$H_BASE"'")' "$C_FILE" > /dev/null; then
echo "${C_FILE} does not include $H_FILE" >& 2
EXIT_CODE=1
fi
done
exit ${EXIT_CODE}