One source of complexity in the QEMU source is that we have a very shallow tree for a source code of over 750,000 lines of code. In fact, one third of these lines alone is in one directory, hw/.
As a prerequisite to cleaning up the structure, but as a worthwhile step on its own, this patchset cleans up the build system so that separate directories have their own Makefile snippet. As in the Linux kernel build system, the overall build system is generally flat (in the case of QEMU, with one recursive invocation per emulation target). Subdirectories do not include complete Makefiles, instead they only host the declarations for a few variables (common-obj-y, universal-obj-y, obj-y, etc.). Definitions for all the directories are merged with a little GNU Make magic (not much, only 20 lines). Two nice side effects are: - we can match the source tree and the object tree (for example the per-target device models will be in XYZ-softmmu/hw, not in XYZ-softmmu; those that are compiled once will be in hw/ rather than in the root). - because the resolution of nested makefiles tracks the nested directory, there is no need to use VPATH to find sources in the hw/ and target-*/ directory. - there is a lot less Makefile programming (conditionals, addprefix, etc.), replaced by only 20 lines in rules.mak and 1 in Makefile.objs. The series is entirely bisectable, and mostly consists of boring patches. If the concept is accepted, I would like to get it in as soon as possible. I have a few other cleanups on top (I stopped once I undid the diffstat of this series :)), but they can be covered later. Thoughts, approvals, rejections? Paolo Paolo Bonzini (24): remove trace-nested-y do not sprinkle around GENERATED_HEADERS dependencies add rules for nesting move *-user/ objects to nested Makefile move obj-TARGET-y variables to nested Makefile move libobj-y variable to nested Makefile move other target-*/ objects to nested Makefiles move rules for nesting to Makefile.objs use nested Makefile rules for qom/ objects move block/ objects to nested Makefile move net/ objects to nested Makefile move fsdev/ objects to nested Makefile move ui/ objects to nested Makefile move audio/ objects to nested Makefile move slirp/ objects to nested Makefile move qapi/ objects to nested Makefile move qga/ objects to nested Makefile move target-independent hw/ objects to nested Makefiles convert libhw to nested Makefiles move per-target hw/ objects to nested Makefiles move device tree to per-target Makefile libcacard Makefile cleanups limit usage of vpath compile oslib-obj-y once Makefile | 30 ++- Makefile.hw | 7 +- Makefile.objs | 316 ++++--------------------- Makefile.target | 325 ++++---------------------- audio/Makefile | 15 ++ block/Makefile | 11 + bsd-user/Makefile | 3 + configure | 70 +++--- fsdev/Makefile | 6 + hw/9pfs/Makefile | 9 + hw/Makefile | 162 +++++++++++++ hw/alpha/Makefile | 4 + hw/arm/Makefile | 40 ++++ hw/cris/Makefile | 13 ++ hw/i386/Makefile | 13 ++ hw/ide/Makefile | 10 + hw/lm32/Makefile | 23 ++ hw/m68k/Makefile | 4 + hw/microblaze/Makefile | 14 ++ hw/mips/Makefile | 6 + hw/ppc/Makefile | 32 +++ hw/s390x/Makefile | 3 + hw/sh4/Makefile | 5 + hw/sparc/Makefile | 8 + hw/sparc64/Makefile | 4 + hw/usb/Makefile | 13 ++ hw/xtensa/Makefile | 5 + libcacard/Makefile | 17 +- linux-user/Makefile | 7 + linux-user/arm/nwfpe/Makefile | 3 + net/Makefile | 13 ++ qapi/Makefile | 3 + qga/Makefile | 4 + qom/Makefile | 6 +- rules.mak | 21 ++ slirp/Makefile | 4 + target-alpha/Makefile | 3 + target-arm/Makefile | 4 + arm-semi.c => target-arm/arm-semi.c | 0 target-cris/Makefile | 2 + target-i386/Makefile | 6 + ioport-user.c => target-i386/ioport-user.c | 0 target-lm32/Makefile | 2 + target-m68k/Makefile | 3 + m68k-semi.c => target-m68k/m68k-semi.c | 0 target-microblaze/Makefile | 2 + target-mips/Makefile | 2 + target-ppc/Makefile | 3 + target-s390x/Makefile | 3 + target-sh4/Makefile | 2 + target-sparc/Makefile | 6 + target-unicore32/Makefile | 2 + target-xtensa/Makefile | 6 + xtensa-semi.c => target-xtensa/xtensa-semi.c | 0 tests/Makefile | 1 - ui/Makefile | 18 ++ 56 files changed, 674 insertions(+), 620 deletions(-) create mode 100644 audio/Makefile create mode 100644 block/Makefile create mode 100644 bsd-user/Makefile create mode 100644 fsdev/Makefile create mode 100644 hw/9pfs/Makefile create mode 100644 hw/Makefile create mode 100644 hw/alpha/Makefile create mode 100644 hw/arm/Makefile create mode 100644 hw/cris/Makefile create mode 100644 hw/i386/Makefile create mode 100644 hw/ide/Makefile create mode 100644 hw/lm32/Makefile create mode 100644 hw/m68k/Makefile create mode 100644 hw/microblaze/Makefile create mode 100644 hw/mips/Makefile create mode 100644 hw/ppc/Makefile create mode 100644 hw/s390x/Makefile create mode 100644 hw/sh4/Makefile create mode 100644 hw/sparc/Makefile create mode 100644 hw/sparc64/Makefile create mode 100644 hw/usb/Makefile create mode 100644 hw/xtensa/Makefile create mode 100644 linux-user/Makefile create mode 100644 linux-user/arm/nwfpe/Makefile create mode 100644 net/Makefile create mode 100644 qapi/Makefile create mode 100644 qga/Makefile create mode 100644 slirp/Makefile create mode 100644 target-alpha/Makefile create mode 100644 target-arm/Makefile rename arm-semi.c => target-arm/arm-semi.c (100%) create mode 100644 target-cris/Makefile create mode 100644 target-i386/Makefile rename ioport-user.c => target-i386/ioport-user.c (100%) create mode 100644 target-lm32/Makefile create mode 100644 target-m68k/Makefile rename m68k-semi.c => target-m68k/m68k-semi.c (100%) create mode 100644 target-microblaze/Makefile create mode 100644 target-mips/Makefile create mode 100644 target-ppc/Makefile create mode 100644 target-s390x/Makefile create mode 100644 target-sh4/Makefile create mode 100644 target-sparc/Makefile create mode 100644 target-unicore32/Makefile create mode 100644 target-xtensa/Makefile rename xtensa-semi.c => target-xtensa/xtensa-semi.c (100%) create mode 100644 ui/Makefile -- 1.7.10.1