]> git.proxmox.com Git - mirror_qemu.git/blob - scripts/clean-includes
Merge remote-tracking branch 'remotes/kraxel/tags/pull-socket-20160120-1' into staging
[mirror_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.
5 #
6 # Copyright (c) 2015 Linaro Limited
7 #
8 # Authors:
9 # Peter Maydell <peter.maydell@linaro.org>
10 #
11 # This work is licensed under the terms of the GNU GPL, version 2
12 # or (at your option) any later version. See the COPYING file in
13 # the top-level directory.
14
15 # Usage:
16 # clean-includes [--git subjectprefix] file ...
17 #
18 # If the --git subjectprefix option is given, then after making
19 # the changes to the files this script will create a git commit
20 # with the subject line "subjectprefix: Clean up includes"
21 # and a boilerplate commit message.
22
23 # This script requires Coccinelle to be installed.
24
25
26 # The following one-liner may be handy for finding files to run this on.
27 # However some caution is required regarding files that might be part
28 # of the guest agent or standalone tests.
29
30 # for i in `git ls-tree --name-only HEAD` ; do test -f $i && \
31 # grep -E '^# *include' $i | head -1 | grep 'osdep.h' ; test $? != 0 && \
32 # echo $i ; done
33
34
35 GIT=no
36
37 if [ $# -ne 0 ] && [ "$1" = "--git" ]; then
38 if [ $# -eq 1 ]; then
39 echo "--git option requires an argument"
40 exit 1
41 fi
42 GITSUBJ="$2"
43 GIT=yes
44 shift
45 shift
46 fi
47
48 if [ $# -eq 0 ]; then
49 echo "Usage: clean-includes [--git subjectprefix] foo.c ..."
50 echo "(modifies the files in place)"
51 exit 1
52 fi
53
54 # Annoyingly coccinelle won't read a scriptfile unless its
55 # name ends '.cocci', so write it out to a tempfile with the
56 # right kind of name.
57 COCCIFILE="$(mktemp --suffix=.cocci)"
58
59 trap 'rm -f -- "$COCCIFILE"' INT TERM HUP EXIT
60
61 cat >"$COCCIFILE" <<EOT
62 @@
63 @@
64
65 (
66 + #include "qemu/osdep.h"
67 #include "..."
68 |
69 + #include "qemu/osdep.h"
70 #include <...>
71 )
72 EOT
73
74
75 for f in "$@"; do
76 # First, use coccinelle to add qemu/osdep.h before the first existing include
77 # (this will add two lines if the file uses both "..." and <...> #includes,
78 # but we will remove the extras in the next step)
79 spatch --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f"
80
81 # Now remove any duplicate osdep.h includes
82 perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f"
83
84 # Remove includes that osdep.h already provides
85 perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
86 ! (grep { $_ eq $1 } qw (
87 "config-host.h" "qemu/compiler.h" "config.h"
88 <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h>
89 <stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h>
90 <limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h>
91 <sys/stat.h> <sys/time.h> <assert.h> <signal.h>
92 "glib-compat.h" "qapi/error.h"
93 ))' "$f"
94
95 done
96
97 if [ "$GIT" = "yes" ]; then
98 git add -- "$@"
99 git commit --signoff -F - <<EOF
100 $GITSUBJ: Clean up includes
101
102 Clean up includes so that osdep.h is included first and headers
103 which it implies are not included manually.
104
105 This commit was created with scripts/clean-includes.
106
107 EOF
108
109 fi