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 ... 18*d57106a4SPeter Maydell# or 19*d57106a4SPeter 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. 25*d57106a4SPeter Maydell# 26*d57106a4SPeter Maydell# Using --all will cause clean-includes to run on the whole source 27*d57106a4SPeter Maydell# tree (excluding certain directories which are known not to need 28*d57106a4SPeter 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 49*d57106a4SPeter Maydell# Extended regular expression defining files to ignore when using --all 50*d57106a4SPeter MaydellXDIRREGEX='^(tests/tcg|tests/multiboot|pc-bios|disas/libvixl)' 51*d57106a4SPeter 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 64*d57106a4SPeter 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 69*d57106a4SPeter Maydellif [ "$1" = "--all" ]; then 70*d57106a4SPeter Maydell # We assume there are no files in the tree with spaces in their name 71*d57106a4SPeter Maydell set -- $(git ls-files '*.[ch]' | grep -E -v "$XDIRREGEX") 72*d57106a4SPeter Maydellfi 73*d57106a4SPeter 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 97fd3e39a4SPeter Maydell *.c) 98fd3e39a4SPeter Maydell MODE=c 99fd3e39a4SPeter Maydell ;; 100fd3e39a4SPeter Maydell *include/qemu/osdep.h | \ 101fd3e39a4SPeter Maydell *include/qemu/compiler.h | \ 102fd3e39a4SPeter Maydell *include/config.h | \ 103fd3e39a4SPeter Maydell *include/standard-headers/ ) 104fd3e39a4SPeter Maydell # Removing include lines from osdep.h itself would be counterproductive. 105fd3e39a4SPeter Maydell echo "SKIPPING $f (special case header)" 106fd3e39a4SPeter Maydell continue 107fd3e39a4SPeter Maydell ;; 108fd3e39a4SPeter Maydell *include/standard-headers/*) 109fd3e39a4SPeter Maydell echo "SKIPPING $f (autogenerated header)" 110fd3e39a4SPeter Maydell continue 111fd3e39a4SPeter Maydell ;; 112fd3e39a4SPeter Maydell *.h) 113fd3e39a4SPeter Maydell MODE=h 114fd3e39a4SPeter Maydell ;; 115fd3e39a4SPeter Maydell *) 116fd3e39a4SPeter Maydell echo "WARNING: ignoring $f (cannot handle non-C files)" 117fd3e39a4SPeter Maydell continue 118fd3e39a4SPeter Maydell ;; 119fd3e39a4SPeter Maydell esac 120fd3e39a4SPeter Maydell 121fd3e39a4SPeter Maydell if [ "$MODE" = "c" ]; then 122fd3e39a4SPeter Maydell # First, use Coccinelle to add qemu/osdep.h before the first existing include 12385071702SPeter Maydell # (this will add two lines if the file uses both "..." and <...> #includes, 12485071702SPeter Maydell # but we will remove the extras in the next step) 12585071702SPeter Maydell spatch --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f" 12685071702SPeter Maydell 12785071702SPeter Maydell # Now remove any duplicate osdep.h includes 12885071702SPeter Maydell perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f" 129fd3e39a4SPeter Maydell else 130fd3e39a4SPeter Maydell # Remove includes of osdep.h itself 131fd3e39a4SPeter Maydell perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ || 132fd3e39a4SPeter Maydell ! (grep { $_ eq $1 } qw ("qemu/osdep.h"))' "$f" 133fd3e39a4SPeter Maydell fi 13485071702SPeter Maydell 13585071702SPeter Maydell # Remove includes that osdep.h already provides 13685071702SPeter Maydell perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ || 13785071702SPeter Maydell ! (grep { $_ eq $1 } qw ( 13885071702SPeter Maydell "config-host.h" "qemu/compiler.h" "config.h" 13985071702SPeter Maydell <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h> 14085071702SPeter Maydell <stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h> 14185071702SPeter Maydell <limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h> 14285071702SPeter Maydell <sys/stat.h> <sys/time.h> <assert.h> <signal.h> 14385071702SPeter Maydell "glib-compat.h" "qapi/error.h" 14485071702SPeter Maydell ))' "$f" 14585071702SPeter Maydell 14685071702SPeter Maydelldone 14785071702SPeter Maydell 14885071702SPeter Maydellif [ "$GIT" = "yes" ]; then 14985071702SPeter Maydell git add -- "$@" 15085071702SPeter Maydell git commit --signoff -F - <<EOF 15185071702SPeter Maydell$GITSUBJ: Clean up includes 15285071702SPeter Maydell 15385071702SPeter MaydellClean up includes so that osdep.h is included first and headers 15485071702SPeter Maydellwhich it implies are not included manually. 15585071702SPeter Maydell 15685071702SPeter MaydellThis commit was created with scripts/clean-includes. 15785071702SPeter Maydell 15885071702SPeter MaydellEOF 15985071702SPeter Maydell 16085071702SPeter Maydellfi 161