]> Git Repo - qemu.git/blob - scripts/clean-includes
s390x/pci: introduce S390PCIBus
[qemu.git] / scripts / clean-includes
1 #!/bin/sh -e
2 #
3 # Clean up QEMU #include lines by ensuring that qemu/osdep.h
4 # is the first include listed in .c files, and no headers provided
5 # by osdep.h itself are redundantly included in either .c or .h files.
6 #
7 # Copyright (c) 2015 Linaro Limited
8 #
9 # Authors:
10 #  Peter Maydell <[email protected]>
11 #
12 # This work is licensed under the terms of the GNU GPL, version 2
13 # or (at your option) any later version. See the COPYING file in
14 # the top-level directory.
15
16 # Usage:
17 #   clean-includes [--git subjectprefix] file ...
18 # or
19 #   clean-includes [--git subjectprefix] --all
20 #
21 # If the --git subjectprefix option is given, then after making
22 # the changes to the files this script will create a git commit
23 # with the subject line "subjectprefix: Clean up includes"
24 # and a boilerplate commit message.
25 #
26 # Using --all will cause clean-includes to run on the whole source
27 # tree (excluding certain directories which are known not to need
28 # handling).
29
30 # This script requires Coccinelle to be installed.
31
32 # .c files will have the osdep.h included added, and redundant
33 # includes removed.
34 # .h files will have redundant includes (including includes of osdep.h)
35 # removed.
36 # Other files (including C++ and ObjectiveC) can't be handled by this script.
37
38 # The following one-liner may be handy for finding files to run this on.
39 # However some caution is required regarding files that might be part
40 # of the guest agent or standalone tests.
41
42 # for i in $(git ls-tree --name-only HEAD) ; do test -f $i && \
43 #   grep -E '^# *include' $i | head -1 | grep 'osdep.h' ; test $? != 0 && \
44 #   echo $i ; done
45
46
47 GIT=no
48
49 # Extended regular expression defining files to ignore when using --all
50 XDIRREGEX='^(tests/tcg|tests/multiboot|pc-bios|disas/libvixl)'
51
52 if [ $# -ne 0 ] && [ "$1" = "--git" ]; then
53     if [ $# -eq 1 ]; then
54         echo "--git option requires an argument"
55         exit 1
56     fi
57     GITSUBJ="$2"
58     GIT=yes
59     shift
60     shift
61 fi
62
63 if [ $# -eq 0 ]; then
64     echo "Usage: clean-includes [--git subjectprefix] [--all | foo.c ...]"
65     echo "(modifies the files in place)"
66     exit 1
67 fi
68
69 if [ "$1" = "--all" ]; then
70     # We assume there are no files in the tree with spaces in their name
71     set -- $(git ls-files '*.[ch]' | grep -E -v "$XDIRREGEX")
72 fi
73
74 # Annoyingly coccinelle won't read a scriptfile unless its
75 # name ends '.cocci', so write it out to a tempfile with the
76 # right kind of name.
77 COCCIFILE="$(mktemp --suffix=.cocci)"
78
79 trap 'rm -f -- "$COCCIFILE"' INT TERM HUP EXIT
80
81 cat >"$COCCIFILE" <<EOT
82 @@
83 @@
84
85 (
86 + #include "qemu/osdep.h"
87  #include "..."
88 |
89 + #include "qemu/osdep.h"
90  #include <...>
91 )
92 EOT
93
94
95 for f in "$@"; do
96   case "$f" in
97     *.inc.c)
98       # These aren't standalone C source files
99       echo "SKIPPING $f (not a standalone source file)"
100       continue
101       ;;
102     *.c)
103       MODE=c
104       ;;
105     *include/qemu/osdep.h | \
106     *include/qemu/compiler.h | \
107     *include/glib-compat.h | \
108     *include/sysemu/os-posix.h | \
109     *include/sysemu/os-win32.h | \
110     *include/standard-headers/ )
111       # Removing include lines from osdep.h itself would be counterproductive.
112       echo "SKIPPING $f (special case header)"
113       continue
114       ;;
115     *include/standard-headers/*)
116       echo "SKIPPING $f (autogenerated header)"
117       continue
118       ;;
119     *.h)
120       MODE=h
121       ;;
122     *)
123       echo "WARNING: ignoring $f (cannot handle non-C files)"
124       continue
125       ;;
126   esac
127
128   if [ "$MODE" = "c" ]; then
129     # First, use Coccinelle to add qemu/osdep.h before the first existing include
130     # (this will add two lines if the file uses both "..." and <...> #includes,
131     # but we will remove the extras in the next step)
132     spatch  --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f"
133
134     # Now remove any duplicate osdep.h includes
135     perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f"
136   else
137     # Remove includes of osdep.h itself
138     perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
139                             ! (grep { $_ eq $1 } qw ("qemu/osdep.h"))' "$f"
140   fi
141
142   # Remove includes that osdep.h already provides
143   perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
144                           ! (grep { $_ eq $1 } qw (
145            "config-host.h" "config-target.h" "qemu/compiler.h"
146            <setjmp.h> <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h>
147            <stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h>
148            <limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h>
149            <sys/stat.h> <sys/time.h> <assert.h> <signal.h> <glib.h>
150            <sys/stat.h> <sys/time.h> <assert.h> <signal.h> <glib.h> <sys/mman.h>
151            "sysemu/os-posix.h, sysemu/os-win32.h "glib-compat.h"
152            "qemu/typedefs.h"
153             ))' "$f"
154
155 done
156
157 if [ "$GIT" = "yes" ]; then
158     git add -- "$@"
159     git commit --signoff -F - <<EOF
160 $GITSUBJ: Clean up includes
161
162 Clean up includes so that osdep.h is included first and headers
163 which it implies are not included manually.
164
165 This commit was created with scripts/clean-includes.
166
167 EOF
168
169 fi
This page took 0.034279 seconds and 4 git commands to generate.