#! /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 'exec/memory.h') files include exec/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 -DNEED_CPU_H -I../target/i386 -Ii386-softmmu -include ../include/qemu/osdep.h ../target/i386/cpu.h

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