diff options
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | scripts/lint-makefiles.sh | 74 |
2 files changed, 84 insertions, 0 deletions
@@ -564,6 +564,16 @@ $(objpfx)check-wrapper-headers.out: scripts/check-wrapper-headers.py $(headers) --generated $(common-generated) > $@; $(evaluate-test) endif # $(headers) +# Lint all Makefiles; including this one. Pass `pwd` as the source +# directory since the top-level Makefile is in the root of the source +# tree and these tests are run from there. We add light-weight linting +# to the 'check' target to support the existing developer workflow of: +# edit -> make -> make check; without needing an additional step. +tests-special += $(objpfx)lint-makefiles.out +$(objpfx)lint-makefiles.out: scripts/lint-makefiles.sh + $(SHELL) $< "$(PYTHON)" `pwd` > $@ ; \ + $(evaluate-test) + define summarize-tests @grep -E -v '^(PASS|XFAIL):' $(objpfx)$1 || true @echo "Summary of test results$2:" diff --git a/scripts/lint-makefiles.sh b/scripts/lint-makefiles.sh new file mode 100644 index 0000000..0d20234 --- /dev/null +++ b/scripts/lint-makefiles.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# Copyright (C) 2023 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# <https://www.gnu.org/licenses/>. + +# This script checks to see that all Makefiles in the source tree +# conform to the sorted variable rules as defined by: +# scripts/sort-makefile-lines.py. +# Any difference is an error and should be corrected e.g. the lines +# reordered to sort correctly. +# The intent with this check is to ensure that changes made by +# developers match the expected format for the project. + +export LC_ALL=C + +tmpfile="$(mktemp)" + +cleanup () { + rm -f -- "$tmpfile" +} + +trap cleanup 0 + +PYTHON=$1 +# Absolute or relative path to the source directory. +srcdir=$2 + +# Must specify $PYTHON. +if [ -z "$PYTHON" ]; then + echo 'Please specify $PYTHON interpreter' + exit 1 +fi +# Absolute or relative $srcdir must exist and be a directory. +if [ ! -d "$srcdir" ]; then + echo 'Please specify $srcdir in which to look for Makefiles' + exit 1 +fi + +linted=0 +failed=0 +for mfile in `find "$srcdir" -name Makefile`; do + $PYTHON "${srcdir}/scripts/sort-makefile-lines.py" < "$mfile" > "$tmpfile" + # Printed the expected -> actual difference on error. + if ! diff -u --label "$mfile.expected" "$tmpfile" "$mfile"; then + failed=$((failed+1)) + fi + linted=$((linted+1)) +done +# Must have linted at least the top-level Makefile. +if [ $linted -lt 1 ]; then + echo "Did not lint any Makefiles!" + exit 1 +fi +if [ $failed -gt 0 ]; then + echo "---" + echo "Tested $linted Makefiles and $failed were incorrectly sorted" + echo 'Please use `patch -R -pN` and the output above to correct the sorting' + exit 1 +fi +# All Makefiles linted clean. +exit 0 |