On Sun, Jun 3, 2012 at 12:25 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > 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?
Neat. Could we (eventually) eliminate Makefile.dis, Makefile.hw, Makefile.target and Makefile.user completely? > > 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 > >