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