#! /bin/sh
#
# Copyright (C) 2016 Red Hat, Inc.
#
# Author: Paolo Bonzini <pbonzini@redhat.com>
#
# Print statistics about header file inclusions.
#
# The script has two modes of execution:
#
# 1) if invoked with a path on the command line (possibly
# preceded by a "--" argument), it will run the analysis on
# an existing build directory
#
# 2) otherwise, it will configure and builds QEMU itself in a
# "+build" subdirectory which is left around when the script
# exits.  In this case the command line is passed directly to
# "make" (typically used for a "-j" argument suitable for your
# system).
#
# Inspired by a post by Markus Armbruster.

case "x$1" in
x--)
  shift
  cd "$1" || exit $?
  ;;
x-* | x)
  mkdir -p +build
  cd +build
  test -f Makefile && make distclean
  ../configure
  make "$@"
  ;;
*)
  cd "$1" || exit $?
esac

QEMU_CFLAGS=$(sed -n s/^QEMU_CFLAGS=//p config-host.mak)
QEMU_INCLUDES=$(sed -n s/^QEMU_INCLUDES=//p config-host.mak | \
    sed 's/$(SRC_PATH)/../g' )
CFLAGS=$(sed -n s/^CFLAGS=//p config-host.mak)

grep_include() {
  find . -name "*.d" -exec grep -l "$@" {} + | wc -l
}

echo Found $(find . -name "*.d" | wc -l) object files
echo $(grep_include -F 'hw/hw.h') files include hw/hw.h
echo $(grep_include 'target/[a-z0-9]*/cpu\.h') files include cpu.h
echo $(grep_include -F 'qapi-types.h') files include qapi-types.h
echo $(grep_include -F 'trace/generated-tracers.h') files include generated-tracers.h
echo $(grep_include -F 'qapi/error.h') files include qapi/error.h
echo $(grep_include -F 'qom/object.h') files include qom/object.h
echo $(grep_include -F 'block/aio.h') files include block/aio.h
echo $(grep_include -F 'system/memory.h') files include system/memory.h
echo $(grep_include -F 'fpu/softfloat.h') files include fpu/softfloat.h
echo $(grep_include -F 'qemu/bswap.h') files include qemu/bswap.h
echo

awk1='
    /^# / { file = $3;next }
    NR>1 { bytes[file]+=length()+1; lines[file]++ }
    END { for(i in lines) print i,lines[i],bytes[i] }'

awk2='
    {tot_l+=$2;tot_b+=$3;tot_f++}
    /\/usr.*\/glib/ {glib_l+=$2;glib_b+=$3;glib_f++;next}
    /\/usr/ {sys_l+=$2;sys_b+=$3;sys_f++;next}
    {qemu_l+=$2;qemu_b+=$3;qemu_f++;next}
    END {
      printf "%s\t %s\t %s\t %s\n", "lines", "bytes", "files", "source"
      printf "%s\t %s\t %s\t %s\n", qemu_l, qemu_b, qemu_f, "QEMU"
      printf "%s\t %s\t %s\t %s\n", sys_l, sys_b, sys_f, "system"
      printf "%s\t %s\t %s\t %s\n", glib_l, glib_b, glib_f, "glib"
      printf "%s\t %s\t %s\t %s\n", tot_l, tot_b, tot_f, "total"
    }'

analyze() {
  cc $QEMU_CFLAGS $QEMU_INCLUDES $CFLAGS  -E -o - "$@" | \
    awk "$awk1" | awk "$awk2"
  echo
}

echo osdep.h:
analyze ../include/qemu/osdep.h

echo hw/hw.h:
analyze -include ../include/qemu/osdep.h ../include/hw/hw.h

echo trace/generated-tracers.h:
analyze -include ../include/qemu/osdep.h trace/generated-tracers.h

echo target/i386/cpu.h:
analyze -DCOMPILING_PER_TARGET -I../target/i386 -Ii386-softmmu -include ../include/qemu/osdep.h ../target/i386/cpu.h

echo hw/hw.h + COMPILING_PER_TARGET:
analyze -DCOMPILING_PER_TARGET -I../target/i386 -Ii386-softmmu -include ../include/qemu/osdep.h ../include/hw/hw.h
