xref: /openbmc/qemu/scripts/clean-includes (revision fd3e39a40ca2ee26b09a5de3149af8b056b85233)
185071702SPeter Maydell#!/bin/sh -e
285071702SPeter Maydell#
385071702SPeter Maydell# Clean up QEMU #include lines by ensuring that qemu/osdep.h
4*fd3e39a4SPeter Maydell# is the first include listed in .c files, and no headers provided
5*fd3e39a4SPeter 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 ...
1885071702SPeter Maydell#
1985071702SPeter Maydell# If the --git subjectprefix option is given, then after making
2085071702SPeter Maydell# the changes to the files this script will create a git commit
2185071702SPeter Maydell# with the subject line "subjectprefix: Clean up includes"
2285071702SPeter Maydell# and a boilerplate commit message.
2385071702SPeter Maydell
2485071702SPeter Maydell# This script requires Coccinelle to be installed.
2585071702SPeter Maydell
26*fd3e39a4SPeter Maydell# .c files will have the osdep.h included added, and redundant
27*fd3e39a4SPeter Maydell# includes removed.
28*fd3e39a4SPeter Maydell# .h files will have redundant includes (including includes of osdep.h)
29*fd3e39a4SPeter Maydell# removed.
30*fd3e39a4SPeter Maydell# Other files (including C++ and ObjectiveC) can't be handled by this script.
3185071702SPeter Maydell
3285071702SPeter Maydell# The following one-liner may be handy for finding files to run this on.
3385071702SPeter Maydell# However some caution is required regarding files that might be part
3485071702SPeter Maydell# of the guest agent or standalone tests.
3585071702SPeter Maydell
3685071702SPeter Maydell# for i in `git ls-tree --name-only HEAD`  ; do test -f $i && \
3785071702SPeter Maydell#   grep -E '^# *include' $i | head -1 | grep 'osdep.h' ; test $? != 0 && \
3885071702SPeter Maydell#   echo $i ; done
3985071702SPeter Maydell
4085071702SPeter Maydell
4185071702SPeter MaydellGIT=no
4285071702SPeter Maydell
4385071702SPeter Maydellif [ $# -ne 0 ] && [ "$1" = "--git" ]; then
4485071702SPeter Maydell    if [ $# -eq 1 ]; then
4585071702SPeter Maydell        echo "--git option requires an argument"
4685071702SPeter Maydell        exit 1
4785071702SPeter Maydell    fi
4885071702SPeter Maydell    GITSUBJ="$2"
4985071702SPeter Maydell    GIT=yes
5085071702SPeter Maydell    shift
5185071702SPeter Maydell    shift
5285071702SPeter Maydellfi
5385071702SPeter Maydell
5485071702SPeter Maydellif [ $# -eq 0 ]; then
5585071702SPeter Maydell    echo "Usage: clean-includes [--git subjectprefix] foo.c ..."
5685071702SPeter Maydell    echo "(modifies the files in place)"
5785071702SPeter Maydell    exit 1
5885071702SPeter Maydellfi
5985071702SPeter Maydell
6085071702SPeter Maydell# Annoyingly coccinelle won't read a scriptfile unless its
6185071702SPeter Maydell# name ends '.cocci', so write it out to a tempfile with the
6285071702SPeter Maydell# right kind of name.
6385071702SPeter MaydellCOCCIFILE="$(mktemp --suffix=.cocci)"
6485071702SPeter Maydell
6585071702SPeter Maydelltrap 'rm -f -- "$COCCIFILE"' INT TERM HUP EXIT
6685071702SPeter Maydell
6785071702SPeter Maydellcat >"$COCCIFILE" <<EOT
6885071702SPeter Maydell@@
6985071702SPeter Maydell@@
7085071702SPeter Maydell
7185071702SPeter Maydell(
7285071702SPeter Maydell+ #include "qemu/osdep.h"
7385071702SPeter Maydell #include "..."
7485071702SPeter Maydell|
7585071702SPeter Maydell+ #include "qemu/osdep.h"
7685071702SPeter Maydell #include <...>
7785071702SPeter Maydell)
7885071702SPeter MaydellEOT
7985071702SPeter Maydell
8085071702SPeter Maydell
8185071702SPeter Maydellfor f in "$@"; do
82*fd3e39a4SPeter Maydell  case "$f" in
83*fd3e39a4SPeter Maydell    *.c)
84*fd3e39a4SPeter Maydell      MODE=c
85*fd3e39a4SPeter Maydell      ;;
86*fd3e39a4SPeter Maydell    *include/qemu/osdep.h | \
87*fd3e39a4SPeter Maydell    *include/qemu/compiler.h | \
88*fd3e39a4SPeter Maydell    *include/config.h | \
89*fd3e39a4SPeter Maydell    *include/standard-headers/ )
90*fd3e39a4SPeter Maydell      # Removing include lines from osdep.h itself would be counterproductive.
91*fd3e39a4SPeter Maydell      echo "SKIPPING $f (special case header)"
92*fd3e39a4SPeter Maydell      continue
93*fd3e39a4SPeter Maydell      ;;
94*fd3e39a4SPeter Maydell    *include/standard-headers/*)
95*fd3e39a4SPeter Maydell      echo "SKIPPING $f (autogenerated header)"
96*fd3e39a4SPeter Maydell      continue
97*fd3e39a4SPeter Maydell      ;;
98*fd3e39a4SPeter Maydell    *.h)
99*fd3e39a4SPeter Maydell      MODE=h
100*fd3e39a4SPeter Maydell      ;;
101*fd3e39a4SPeter Maydell    *)
102*fd3e39a4SPeter Maydell      echo "WARNING: ignoring $f (cannot handle non-C files)"
103*fd3e39a4SPeter Maydell      continue
104*fd3e39a4SPeter Maydell      ;;
105*fd3e39a4SPeter Maydell  esac
106*fd3e39a4SPeter Maydell
107*fd3e39a4SPeter Maydell  if [ "$MODE" = "c" ]; then
108*fd3e39a4SPeter Maydell    # First, use Coccinelle to add qemu/osdep.h before the first existing include
10985071702SPeter Maydell    # (this will add two lines if the file uses both "..." and <...> #includes,
11085071702SPeter Maydell    # but we will remove the extras in the next step)
11185071702SPeter Maydell    spatch  --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f"
11285071702SPeter Maydell
11385071702SPeter Maydell    # Now remove any duplicate osdep.h includes
11485071702SPeter Maydell    perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f"
115*fd3e39a4SPeter Maydell  else
116*fd3e39a4SPeter Maydell    # Remove includes of osdep.h itself
117*fd3e39a4SPeter Maydell    perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
118*fd3e39a4SPeter Maydell                            ! (grep { $_ eq $1 } qw ("qemu/osdep.h"))' "$f"
119*fd3e39a4SPeter Maydell  fi
12085071702SPeter Maydell
12185071702SPeter Maydell  # Remove includes that osdep.h already provides
12285071702SPeter Maydell  perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
12385071702SPeter Maydell                          ! (grep { $_ eq $1 } qw (
12485071702SPeter Maydell           "config-host.h" "qemu/compiler.h" "config.h"
12585071702SPeter Maydell           <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h>
12685071702SPeter Maydell           <stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h>
12785071702SPeter Maydell           <limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h>
12885071702SPeter Maydell           <sys/stat.h> <sys/time.h> <assert.h> <signal.h>
12985071702SPeter Maydell           "glib-compat.h" "qapi/error.h"
13085071702SPeter Maydell            ))' "$f"
13185071702SPeter Maydell
13285071702SPeter Maydelldone
13385071702SPeter Maydell
13485071702SPeter Maydellif [ "$GIT" = "yes" ]; then
13585071702SPeter Maydell    git add -- "$@"
13685071702SPeter Maydell    git commit --signoff -F - <<EOF
13785071702SPeter Maydell$GITSUBJ: Clean up includes
13885071702SPeter Maydell
13985071702SPeter MaydellClean up includes so that osdep.h is included first and headers
14085071702SPeter Maydellwhich it implies are not included manually.
14185071702SPeter Maydell
14285071702SPeter MaydellThis commit was created with scripts/clean-includes.
14385071702SPeter Maydell
14485071702SPeter MaydellEOF
14585071702SPeter Maydell
14685071702SPeter Maydellfi
147