139c1837db
With Makefiles that have automatically generated dependencies, you generated includes are set as dependencies of the Makefile, so that they are built before everything else and they are available when first building the .c files. Alternatively you can use a fine-grained dependency, e.g. target/arm/translate.o: target/arm/decode-neon-shared.inc.c With Meson you have only one choice and it is a third option, namely "build at the beginning of the corresponding target"; the way you express it is to list the includes in the sources of that target. The problem is that Meson decides if something is a source vs. a generated include by looking at the extension: '.c', '.cc', '.m', '.C' are sources, while everything else is considered an include---including '.inc.c'. Use '.c.inc' to avoid this, as it is consistent with our other convention of using '.rst.inc' for included reStructuredText files. The editorconfig file is adjusted. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
199 lines
5.6 KiB
Bash
Executable File
199 lines
5.6 KiB
Bash
Executable File
#!/bin/sh -e
|
|
#
|
|
# Clean up QEMU #include lines by ensuring that qemu/osdep.h
|
|
# is the first include listed in .c files, and no headers provided
|
|
# by osdep.h itself are redundantly included in either .c or .h files.
|
|
#
|
|
# Copyright (c) 2015 Linaro Limited
|
|
#
|
|
# Authors:
|
|
# Peter Maydell <peter.maydell@linaro.org>
|
|
#
|
|
# This work is licensed under the terms of the GNU GPL, version 2
|
|
# or (at your option) any later version. See the COPYING file in
|
|
# the top-level directory.
|
|
|
|
# Usage:
|
|
# clean-includes [--git subjectprefix] [--check-dup-head] file ...
|
|
# or
|
|
# clean-includes [--git subjectprefix] [--check-dup-head] --all
|
|
#
|
|
# If the --git subjectprefix option is given, then after making
|
|
# the changes to the files this script will create a git commit
|
|
# with the subject line "subjectprefix: Clean up includes"
|
|
# and a boilerplate commit message.
|
|
#
|
|
# If --check-dup-head is specified, additionally check for duplicate
|
|
# header includes.
|
|
#
|
|
# Using --all will cause clean-includes to run on the whole source
|
|
# tree (excluding certain directories which are known not to need
|
|
# handling).
|
|
|
|
# This script requires Coccinelle to be installed.
|
|
|
|
# .c files will have the osdep.h included added, and redundant
|
|
# includes removed.
|
|
# .h files will have redundant includes (including includes of osdep.h)
|
|
# removed.
|
|
# Other files (including C++ and ObjectiveC) can't be handled by this script.
|
|
|
|
# The following one-liner may be handy for finding files to run this on.
|
|
# However some caution is required regarding files that might be part
|
|
# of the guest agent or standalone tests.
|
|
|
|
# for i in $(git ls-tree --name-only HEAD) ; do test -f $i && \
|
|
# grep -E '^# *include' $i | head -1 | grep 'osdep.h' ; test $? != 0 && \
|
|
# echo $i ; done
|
|
|
|
|
|
GIT=no
|
|
DUPHEAD=no
|
|
|
|
# Extended regular expression defining files to ignore when using --all
|
|
XDIRREGEX='^(tests/tcg|tests/multiboot|pc-bios|disas/libvixl)'
|
|
|
|
while true
|
|
do
|
|
case $1 in
|
|
"--git")
|
|
if [ $# -eq 1 ]; then
|
|
echo "--git option requires an argument"
|
|
exit 1
|
|
fi
|
|
GITSUBJ="$2"
|
|
GIT=yes
|
|
shift
|
|
shift
|
|
;;
|
|
"--check-dup-head")
|
|
DUPHEAD=yes
|
|
shift
|
|
;;
|
|
"--")
|
|
shift
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ $# -eq 0 ]; then
|
|
echo "Usage: clean-includes [--git subjectprefix] [--check-dup-head] [--all | foo.c ...]"
|
|
echo "(modifies the files in place)"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$1" = "--all" ]; then
|
|
# We assume there are no files in the tree with spaces in their name
|
|
set -- $(git ls-files '*.[ch]' | grep -E -v "$XDIRREGEX")
|
|
fi
|
|
|
|
# Annoyingly coccinelle won't read a scriptfile unless its
|
|
# name ends '.cocci', so write it out to a tempfile with the
|
|
# right kind of name.
|
|
COCCIFILE="$(mktemp --suffix=.cocci)"
|
|
|
|
trap 'rm -f -- "$COCCIFILE"' INT TERM HUP EXIT
|
|
|
|
cat >"$COCCIFILE" <<EOT
|
|
@@
|
|
@@
|
|
|
|
(
|
|
+ #include "qemu/osdep.h"
|
|
#include "..."
|
|
|
|
|
+ #include "qemu/osdep.h"
|
|
#include <...>
|
|
)
|
|
EOT
|
|
|
|
for f in "$@"; do
|
|
case "$f" in
|
|
*.c.inc)
|
|
# These aren't standalone C source files
|
|
echo "SKIPPING $f (not a standalone source file)"
|
|
continue
|
|
;;
|
|
*.c)
|
|
MODE=c
|
|
;;
|
|
*include/qemu/osdep.h | \
|
|
*include/qemu/compiler.h | \
|
|
*include/qemu/qemu-plugin.h | \
|
|
*include/glib-compat.h | \
|
|
*include/sysemu/os-posix.h | \
|
|
*include/sysemu/os-win32.h | \
|
|
*include/standard-headers/ )
|
|
# Removing include lines from osdep.h itself would be counterproductive.
|
|
echo "SKIPPING $f (special case header)"
|
|
continue
|
|
;;
|
|
*include/standard-headers/*)
|
|
echo "SKIPPING $f (autogenerated header)"
|
|
continue
|
|
;;
|
|
*.h)
|
|
MODE=h
|
|
;;
|
|
*)
|
|
echo "WARNING: ignoring $f (cannot handle non-C files)"
|
|
continue
|
|
;;
|
|
esac
|
|
|
|
if [ "$MODE" = "c" ]; then
|
|
# First, use Coccinelle to add qemu/osdep.h before the first existing include
|
|
# (this will add two lines if the file uses both "..." and <...> #includes,
|
|
# but we will remove the extras in the next step)
|
|
spatch --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f"
|
|
|
|
# Now remove any duplicate osdep.h includes
|
|
perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f"
|
|
else
|
|
# Remove includes of osdep.h itself
|
|
perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
|
|
! (grep { $_ eq $1 } qw ("qemu/osdep.h"))' "$f"
|
|
fi
|
|
|
|
# Remove includes that osdep.h already provides
|
|
perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
|
|
! (grep { $_ eq $1 } qw (
|
|
"config-host.h" "config-target.h" "qemu/compiler.h"
|
|
<setjmp.h> <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h>
|
|
<stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h>
|
|
<limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h>
|
|
<sys/stat.h> <sys/time.h> <assert.h> <signal.h> <glib.h>
|
|
<sys/stat.h> <sys/time.h> <assert.h> <signal.h> <glib.h> <sys/mman.h>
|
|
"sysemu/os-posix.h, sysemu/os-win32.h "glib-compat.h"
|
|
"qemu/typedefs.h"
|
|
))' "$f"
|
|
|
|
done
|
|
|
|
if [ "$DUPHEAD" = "yes" ]; then
|
|
egrep "^[[:space:]]*#[[:space:]]*include" "$@" | tr -d '[:blank:]' \
|
|
| sort | uniq -c | awk '{if ($1 > 1) print $0}'
|
|
if [ $? -eq 0 ]; then
|
|
echo "Found duplicate header file includes. Please check the above files manually."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ "$GIT" = "yes" ]; then
|
|
git add -- "$@"
|
|
git commit --signoff -F - <<EOF
|
|
$GITSUBJ: Clean up includes
|
|
|
|
Clean up includes so that osdep.h is included first and headers
|
|
which it implies are not included manually.
|
|
|
|
This commit was created with scripts/clean-includes.
|
|
|
|
EOF
|
|
|
|
fi
|