xref: /openbmc/qemu/scripts/clean-includes (revision 8ff98f1ed2f50cd05c3c5027c7efdf69859ec664)
185071702SPeter Maydell#!/bin/sh -e
285071702SPeter Maydell#
385071702SPeter Maydell# Clean up QEMU #include lines by ensuring that qemu/osdep.h
4fd3e39a4SPeter Maydell# is the first include listed in .c files, and no headers provided
5fd3e39a4SPeter Maydell# by osdep.h itself are redundantly included in either .c or .h files.
685071702SPeter Maydell#
785071702SPeter Maydell# Copyright (c) 2015 Linaro Limited
885071702SPeter Maydell#
985071702SPeter Maydell# Authors:
1085071702SPeter Maydell#  Peter Maydell <peter.maydell@linaro.org>
1185071702SPeter Maydell#
1285071702SPeter Maydell# This work is licensed under the terms of the GNU GPL, version 2
1385071702SPeter Maydell# or (at your option) any later version. See the COPYING file in
1485071702SPeter Maydell# the top-level directory.
1585071702SPeter Maydell
1685071702SPeter Maydell# Usage:
1785071702SPeter Maydell#   clean-includes [--git subjectprefix] file ...
18d57106a4SPeter Maydell# or
19d57106a4SPeter Maydell#   clean-includes [--git subjectprefix] --all
2085071702SPeter Maydell#
2185071702SPeter Maydell# If the --git subjectprefix option is given, then after making
2285071702SPeter Maydell# the changes to the files this script will create a git commit
2385071702SPeter Maydell# with the subject line "subjectprefix: Clean up includes"
2485071702SPeter Maydell# and a boilerplate commit message.
25d57106a4SPeter Maydell#
26d57106a4SPeter Maydell# Using --all will cause clean-includes to run on the whole source
27d57106a4SPeter Maydell# tree (excluding certain directories which are known not to need
28d57106a4SPeter Maydell# handling).
2985071702SPeter Maydell
3085071702SPeter Maydell# This script requires Coccinelle to be installed.
3185071702SPeter Maydell
32fd3e39a4SPeter Maydell# .c files will have the osdep.h included added, and redundant
33fd3e39a4SPeter Maydell# includes removed.
34fd3e39a4SPeter Maydell# .h files will have redundant includes (including includes of osdep.h)
35fd3e39a4SPeter Maydell# removed.
36fd3e39a4SPeter Maydell# Other files (including C++ and ObjectiveC) can't be handled by this script.
3785071702SPeter Maydell
3885071702SPeter Maydell# The following one-liner may be handy for finding files to run this on.
3985071702SPeter Maydell# However some caution is required regarding files that might be part
4085071702SPeter Maydell# of the guest agent or standalone tests.
4185071702SPeter Maydell
4285071702SPeter Maydell# for i in `git ls-tree --name-only HEAD`  ; do test -f $i && \
4385071702SPeter Maydell#   grep -E '^# *include' $i | head -1 | grep 'osdep.h' ; test $? != 0 && \
4485071702SPeter Maydell#   echo $i ; done
4585071702SPeter Maydell
4685071702SPeter Maydell
4785071702SPeter MaydellGIT=no
4885071702SPeter Maydell
49d57106a4SPeter Maydell# Extended regular expression defining files to ignore when using --all
50d57106a4SPeter MaydellXDIRREGEX='^(tests/tcg|tests/multiboot|pc-bios|disas/libvixl)'
51d57106a4SPeter Maydell
5285071702SPeter Maydellif [ $# -ne 0 ] && [ "$1" = "--git" ]; then
5385071702SPeter Maydell    if [ $# -eq 1 ]; then
5485071702SPeter Maydell        echo "--git option requires an argument"
5585071702SPeter Maydell        exit 1
5685071702SPeter Maydell    fi
5785071702SPeter Maydell    GITSUBJ="$2"
5885071702SPeter Maydell    GIT=yes
5985071702SPeter Maydell    shift
6085071702SPeter Maydell    shift
6185071702SPeter Maydellfi
6285071702SPeter Maydell
6385071702SPeter Maydellif [ $# -eq 0 ]; then
64d57106a4SPeter Maydell    echo "Usage: clean-includes [--git subjectprefix] [--all | foo.c ...]"
6585071702SPeter Maydell    echo "(modifies the files in place)"
6685071702SPeter Maydell    exit 1
6785071702SPeter Maydellfi
6885071702SPeter Maydell
69d57106a4SPeter Maydellif [ "$1" = "--all" ]; then
70d57106a4SPeter Maydell    # We assume there are no files in the tree with spaces in their name
71d57106a4SPeter Maydell    set -- $(git ls-files '*.[ch]' | grep -E -v "$XDIRREGEX")
72d57106a4SPeter Maydellfi
73d57106a4SPeter Maydell
7485071702SPeter Maydell# Annoyingly coccinelle won't read a scriptfile unless its
7585071702SPeter Maydell# name ends '.cocci', so write it out to a tempfile with the
7685071702SPeter Maydell# right kind of name.
7785071702SPeter MaydellCOCCIFILE="$(mktemp --suffix=.cocci)"
7885071702SPeter Maydell
7985071702SPeter Maydelltrap 'rm -f -- "$COCCIFILE"' INT TERM HUP EXIT
8085071702SPeter Maydell
8185071702SPeter Maydellcat >"$COCCIFILE" <<EOT
8285071702SPeter Maydell@@
8385071702SPeter Maydell@@
8485071702SPeter Maydell
8585071702SPeter Maydell(
8685071702SPeter Maydell+ #include "qemu/osdep.h"
8785071702SPeter Maydell #include "..."
8885071702SPeter Maydell|
8985071702SPeter Maydell+ #include "qemu/osdep.h"
9085071702SPeter Maydell #include <...>
9185071702SPeter Maydell)
9285071702SPeter MaydellEOT
9385071702SPeter Maydell
9485071702SPeter Maydell
9585071702SPeter Maydellfor f in "$@"; do
96fd3e39a4SPeter Maydell  case "$f" in
97f8e1f5d6SPeter Maydell    *.inc.c)
98f8e1f5d6SPeter Maydell      # These aren't standalone C source files
99f8e1f5d6SPeter Maydell      echo "SKIPPING $f (not a standalone source file)"
100f8e1f5d6SPeter Maydell      continue
101f8e1f5d6SPeter Maydell      ;;
102fd3e39a4SPeter Maydell    *.c)
103fd3e39a4SPeter Maydell      MODE=c
104fd3e39a4SPeter Maydell      ;;
105fd3e39a4SPeter Maydell    *include/qemu/osdep.h | \
106fd3e39a4SPeter Maydell    *include/qemu/compiler.h | \
107fd3e39a4SPeter Maydell    *include/standard-headers/ )
108fd3e39a4SPeter Maydell      # Removing include lines from osdep.h itself would be counterproductive.
109fd3e39a4SPeter Maydell      echo "SKIPPING $f (special case header)"
110fd3e39a4SPeter Maydell      continue
111fd3e39a4SPeter Maydell      ;;
112fd3e39a4SPeter Maydell    *include/standard-headers/*)
113fd3e39a4SPeter Maydell      echo "SKIPPING $f (autogenerated header)"
114fd3e39a4SPeter Maydell      continue
115fd3e39a4SPeter Maydell      ;;
116fd3e39a4SPeter Maydell    *.h)
117fd3e39a4SPeter Maydell      MODE=h
118fd3e39a4SPeter Maydell      ;;
119fd3e39a4SPeter Maydell    *)
120fd3e39a4SPeter Maydell      echo "WARNING: ignoring $f (cannot handle non-C files)"
121fd3e39a4SPeter Maydell      continue
122fd3e39a4SPeter Maydell      ;;
123fd3e39a4SPeter Maydell  esac
124fd3e39a4SPeter Maydell
125fd3e39a4SPeter Maydell  if [ "$MODE" = "c" ]; then
126fd3e39a4SPeter Maydell    # First, use Coccinelle to add qemu/osdep.h before the first existing include
12785071702SPeter Maydell    # (this will add two lines if the file uses both "..." and <...> #includes,
12885071702SPeter Maydell    # but we will remove the extras in the next step)
12985071702SPeter Maydell    spatch  --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f"
13085071702SPeter Maydell
13185071702SPeter Maydell    # Now remove any duplicate osdep.h includes
13285071702SPeter Maydell    perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f"
133fd3e39a4SPeter Maydell  else
134fd3e39a4SPeter Maydell    # Remove includes of osdep.h itself
135fd3e39a4SPeter Maydell    perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
136fd3e39a4SPeter Maydell                            ! (grep { $_ eq $1 } qw ("qemu/osdep.h"))' "$f"
137fd3e39a4SPeter Maydell  fi
13885071702SPeter Maydell
13985071702SPeter Maydell  # Remove includes that osdep.h already provides
14085071702SPeter Maydell  perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
14185071702SPeter Maydell                          ! (grep { $_ eq $1 } qw (
14285071702SPeter Maydell           "config-host.h" "qemu/compiler.h" "config.h"
143*8ff98f1eSStefan Weil           <setjmp.h> <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h>
14485071702SPeter Maydell           <stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h>
14585071702SPeter Maydell           <limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h>
14685071702SPeter Maydell           <sys/stat.h> <sys/time.h> <assert.h> <signal.h>
14785071702SPeter Maydell           "glib-compat.h" "qapi/error.h"
14885071702SPeter Maydell            ))' "$f"
14985071702SPeter Maydell
15085071702SPeter Maydelldone
15185071702SPeter Maydell
15285071702SPeter Maydellif [ "$GIT" = "yes" ]; then
15385071702SPeter Maydell    git add -- "$@"
15485071702SPeter Maydell    git commit --signoff -F - <<EOF
15585071702SPeter Maydell$GITSUBJ: Clean up includes
15685071702SPeter Maydell
15785071702SPeter MaydellClean up includes so that osdep.h is included first and headers
15885071702SPeter Maydellwhich it implies are not included manually.
15985071702SPeter Maydell
16085071702SPeter MaydellThis commit was created with scripts/clean-includes.
16185071702SPeter Maydell
16285071702SPeter MaydellEOF
16385071702SPeter Maydell
16485071702SPeter Maydellfi
165