Patchwork [v3] Drop --whole-archive and static libraries

login
register
mail settings
Submitter Andreas Färber
Date Jan. 6, 2010, 7:24 p.m.
Message ID <1262805845-10801-1-git-send-email-andreas.faerber@web.de>
Download mbox | patch
Permalink /patch/42321/
State New
Headers show

Comments

Andreas Färber - Jan. 6, 2010, 7:24 p.m.
From: Andreas Färber <afaerber@opensolaris.org>

Juan has contributed a cool Makefile infrastructure that enables us to drop
static libraries completely:

Move shared obj-y definitions to Makefile.objs, prefixed {common-,hw-,user-},
and link those object files directly into the executables.

Replace HWLIB by HWDIR, specifying only the directory.

Drop --whole-archive and ARLIBS in Makefiles and configure.

Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
common objects after generating a target-specific header; add dependency
rules to Makefile and Makefile.target instead.

v2:
- Don't try to include /config.mak for user emulators
- Changes to user object paths ("Quickfix for libuser.a drop") were obsoleted
  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)

v3:
- Fix dependency modelling for tools
- Remove comment on GENERATED_HEADERS obsoleted by this patch

Signed-off-by: Andreas Färber <afaerber@opensolaris.org>
Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: Palle Lyckegaard <palle@lyckegaard.dk>
Cc: Ben Taylor <bentaylor.solx86@gmail.com>
Cc: Juan Quintela <quintela@trasno.org>
Cc: Kirill A. Shutemov <kirill@shutemov.name>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
 Makefile        |  138 +++++-------------------------------------------
 Makefile.hw     |   33 +-----------
 Makefile.objs   |  155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 Makefile.target |   33 +++++++++---
 Makefile.user   |    9 +---
 configure       |   34 +------------
 rules.mak       |    4 +-
 7 files changed, 202 insertions(+), 204 deletions(-)
 create mode 100644 Makefile.objs
Blue Swirl - Jan. 7, 2010, 6:10 p.m.
Thanks, applied.


On Wed, Jan 6, 2010 at 7:24 PM, Andreas Färber <andreas.faerber@web.de> wrote:
> From: Andreas Färber <afaerber@opensolaris.org>
>
> Juan has contributed a cool Makefile infrastructure that enables us to drop
> static libraries completely:
>
> Move shared obj-y definitions to Makefile.objs, prefixed {common-,hw-,user-},
> and link those object files directly into the executables.
>
> Replace HWLIB by HWDIR, specifying only the directory.
>
> Drop --whole-archive and ARLIBS in Makefiles and configure.
>
> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
> common objects after generating a target-specific header; add dependency
> rules to Makefile and Makefile.target instead.
>
> v2:
> - Don't try to include /config.mak for user emulators
> - Changes to user object paths ("Quickfix for libuser.a drop") were obsoleted
>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>
> v3:
> - Fix dependency modelling for tools
> - Remove comment on GENERATED_HEADERS obsoleted by this patch
>
> Signed-off-by: Andreas Färber <afaerber@opensolaris.org>
> Cc: Blue Swirl <blauwirbel@gmail.com>
> Cc: Palle Lyckegaard <palle@lyckegaard.dk>
> Cc: Ben Taylor <bentaylor.solx86@gmail.com>
> Cc: Juan Quintela <quintela@trasno.org>
> Cc: Kirill A. Shutemov <kirill@shutemov.name>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  Makefile        |  138 +++++-------------------------------------------
>  Makefile.hw     |   33 +-----------
>  Makefile.objs   |  155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  Makefile.target |   33 +++++++++---
>  Makefile.user   |    9 +---
>  configure       |   34 +------------
>  rules.mak       |    4 +-
>  7 files changed, 202 insertions(+), 204 deletions(-)
>  create mode 100644 Makefile.objs
>
> diff --git a/Makefile b/Makefile
> index c1fa08c..2ca341b 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1,6 +1,5 @@
>  # Makefile for QEMU.
>
> -# This needs to be defined before rules.mak
>  GENERATED_HEADERS = config-host.h
>
>  ifneq ($(wildcard config-host.mak),)
> @@ -66,7 +65,10 @@ SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
>  subdir-%: $(GENERATED_HEADERS)
>        $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
>
> -$(filter %-softmmu,$(SUBDIR_RULES)): libqemu_common.a
> +include $(SRC_PATH)/Makefile.objs
> +
> +$(common-obj-y): $(GENERATED_HEADERS)
> +$(filter %-softmmu,$(SUBDIR_RULES)): $(common-obj-y)
>
>  $(filter %-user,$(SUBDIR_RULES)): libuser.a
>
> @@ -81,124 +83,8 @@ ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
>
>  recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
>
> -#######################################################################
> -# QObject
> -qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
> -qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
> -qobject-obj-y += qerror.o
> -
> -#######################################################################
> -# block-obj-y is code used by both qemu system emulation and qemu-img
> -
> -block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o
> -block-obj-y += nbd.o block.o aio.o aes.o osdep.o
> -block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
> -block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
> -
> -block-nested-y += cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
> -block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o
> -block-nested-y += parallels.o nbd.o
> -block-nested-$(CONFIG_WIN32) += raw-win32.o
> -block-nested-$(CONFIG_POSIX) += raw-posix.o
> -block-nested-$(CONFIG_CURL) += curl.o
> -
> -block-obj-y +=  $(addprefix block/, $(block-nested-y))
> -
> -net-obj-y = net.o
> -net-nested-y = queue.o checksum.o util.o
> -net-nested-y += socket.o
> -net-nested-y += dump.o
> -net-nested-$(CONFIG_POSIX) += tap.o
> -net-nested-$(CONFIG_LINUX) += tap-linux.o
> -net-nested-$(CONFIG_WIN32) += tap-win32.o
> -net-nested-$(CONFIG_BSD) += tap-bsd.o
> -net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
> -net-nested-$(CONFIG_AIX) += tap-aix.o
> -net-nested-$(CONFIG_SLIRP) += slirp.o
> -net-nested-$(CONFIG_VDE) += vde.o
> -net-obj-y += $(addprefix net/, $(net-nested-y))
> -
> -######################################################################
> -# libqemu_common.a: Target independent part of system emulation. The
> -# long term path is to suppress *all* target specific code in case of
> -# system emulation, i.e. a single QEMU executable should support all
> -# CPUs and machines.
> -
> -obj-y = $(block-obj-y)
> -obj-y += $(net-obj-y)
> -obj-y += $(qobject-obj-y)
> -obj-y += readline.o console.o
> -
> -obj-y += tcg-runtime.o host-utils.o
> -obj-y += irq.o ioport.o
> -obj-$(CONFIG_PTIMER) += ptimer.o
> -obj-$(CONFIG_MAX7310) += max7310.o
> -obj-$(CONFIG_WM8750) += wm8750.o
> -obj-$(CONFIG_TWL92230) += twl92230.o
> -obj-$(CONFIG_TSC2005) += tsc2005.o
> -obj-$(CONFIG_LM832X) += lm832x.o
> -obj-$(CONFIG_TMP105) += tmp105.o
> -obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
> -obj-$(CONFIG_SSD0303) += ssd0303.o
> -obj-$(CONFIG_SSD0323) += ssd0323.o
> -obj-$(CONFIG_ADS7846) += ads7846.o
> -obj-$(CONFIG_MAX111X) += max111x.o
> -obj-$(CONFIG_DS1338) += ds1338.o
> -obj-y += i2c.o smbus.o smbus_eeprom.o
> -obj-y += eeprom93xx.o
> -obj-y += scsi-disk.o cdrom.o
> -obj-y += scsi-generic.o scsi-bus.o
> -obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
> -obj-y += usb-serial.o usb-net.o usb-bus.o
> -obj-$(CONFIG_SSI) += ssi.o
> -obj-$(CONFIG_SSI_SD) += ssi-sd.o
> -obj-$(CONFIG_SD) += sd.o
> -obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
> -obj-y += bt-hci-csr.o
> -obj-y += buffered_file.o migration.o migration-tcp.o qemu-sockets.o
> -obj-y += qemu-char.o aio.o savevm.o
> -obj-y += msmouse.o ps2.o
> -obj-y += qdev.o qdev-properties.o
> -obj-y += qemu-config.o block-migration.o
> -
> -obj-$(CONFIG_BRLAPI) += baum.o
> -obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
> -
>  audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS)
>
> -audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
> -audio-obj-$(CONFIG_SDL) += sdlaudio.o
> -audio-obj-$(CONFIG_OSS) += ossaudio.o
> -audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
> -audio-obj-$(CONFIG_ALSA) += alsaaudio.o
> -audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
> -audio-obj-$(CONFIG_FMOD) += fmodaudio.o
> -audio-obj-$(CONFIG_ESD) += esdaudio.o
> -audio-obj-$(CONFIG_PA) += paaudio.o
> -audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
> -audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
> -audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
> -audio-obj-y += wavcapture.o
> -obj-y += $(addprefix audio/, $(audio-obj-y))
> -
> -obj-y += keymaps.o
> -obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
> -obj-$(CONFIG_CURSES) += curses.o
> -obj-y += vnc.o acl.o d3des.o
> -obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
> -obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
> -obj-$(CONFIG_COCOA) += cocoa.o
> -obj-$(CONFIG_IOTHREAD) += qemu-thread.o
> -
> -slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
> -slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
> -slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
> -obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
> -
> -# xen backend driver support
> -obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
> -obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
> -
>  QEMU_CFLAGS+=$(CURL_CFLAGS)
>
>  cocoa.o: cocoa.m
> @@ -229,17 +115,23 @@ curses.o: curses.c keymaps.h curses_keys.h
>
>  bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
>
> -libqemu_common.a: $(obj-y)
> -
>  ######################################################################
>
>  qemu-img.o: qemu-img-cmds.h
>
> -qemu-img$(EXESUF): qemu-img.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
> +obj-y = qemu-img.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
> +
> +qemu-img$(EXESUF): $(obj-y)
> +
> +obj-y = qemu-nbd.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
> +$(obj-y): $(GENERATED_HEADERS)
> +
> +qemu-nbd$(EXESUF): $(obj-y)
>
> -qemu-nbd$(EXESUF):  qemu-nbd.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
> +obj-y = qemu-io.o qemu-tool.o cmd.o $(block-obj-y) $(qobject-obj-y)
> +$(obj-y): $(GENERATED_HEADERS)
>
> -qemu-io$(EXESUF):  qemu-io.o qemu-tool.o cmd.o $(block-obj-y) $(qobject-obj-y)
> +qemu-io$(EXESUF): $(obj-y)
>
>  qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx
>        $(call quiet-command,sh $(SRC_PATH)/hxtool -h < $< > $@,"  GEN   $@")
> diff --git a/Makefile.hw b/Makefile.hw
> index bd252f5..ff87ae4 100644
> --- a/Makefile.hw
> +++ b/Makefile.hw
> @@ -11,41 +11,12 @@ VPATH=$(SRC_PATH):$(SRC_PATH)/hw
>
>  QEMU_CFLAGS+=-I.. -I$(SRC_PATH)/fpu
>
> -obj-y =
> -obj-y += loader.o
> -obj-y += virtio.o
> -obj-y += fw_cfg.o
> -obj-y += watchdog.o
> -obj-$(CONFIG_ECC) += ecc.o
> -obj-$(CONFIG_NAND) += nand.o
> +include $(SRC_PATH)/Makefile.objs
>
> -obj-$(CONFIG_M48T59) += m48t59.o
> -obj-$(CONFIG_ESCC) += escc.o
> -
> -# PCI watchdog devices
> -obj-y += wdt_i6300esb.o
> -
> -obj-y += msix.o
> -
> -# PCI network cards
> -obj-y += ne2000.o
> -
> -obj-$(CONFIG_SMC91C111) += smc91c111.o
> -obj-$(CONFIG_LAN9118) += lan9118.o
> -
> -# SCSI layer
> -obj-y += lsi53c895a.o
> -obj-$(CONFIG_ESP) += esp.o
> -
> -obj-y += dma-helpers.o sysbus.o isa-bus.o
> -obj-$(CONFIG_QDEV_ADDR) += qdev-addr.o
> -
> -all: $(HWLIB)
> +all: $(hw-obj-y)
>  # Dummy command so that make thinks it has done something
>        @true
>
> -$(HWLIB): $(obj-y)
> -
>  clean:
>        rm -f *.o *.d *.a *~
>
> diff --git a/Makefile.objs b/Makefile.objs
> new file mode 100644
> index 0000000..e8a44d7
> --- /dev/null
> +++ b/Makefile.objs
> @@ -0,0 +1,155 @@
> +#######################################################################
> +# QObject
> +qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
> +qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
> +qobject-obj-y += qerror.o
> +
> +#######################################################################
> +# block-obj-y is code used by both qemu system emulation and qemu-img
> +
> +block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o
> +block-obj-y += nbd.o block.o aio.o aes.o osdep.o
> +block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
> +block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
> +
> +block-nested-y += cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
> +block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o
> +block-nested-y += parallels.o nbd.o
> +block-nested-$(CONFIG_WIN32) += raw-win32.o
> +block-nested-$(CONFIG_POSIX) += raw-posix.o
> +block-nested-$(CONFIG_CURL) += curl.o
> +
> +block-obj-y +=  $(addprefix block/, $(block-nested-y))
> +
> +net-obj-y = net.o
> +net-nested-y = queue.o checksum.o util.o
> +net-nested-y += socket.o
> +net-nested-y += dump.o
> +net-nested-$(CONFIG_POSIX) += tap.o
> +net-nested-$(CONFIG_LINUX) += tap-linux.o
> +net-nested-$(CONFIG_WIN32) += tap-win32.o
> +net-nested-$(CONFIG_BSD) += tap-bsd.o
> +net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
> +net-nested-$(CONFIG_AIX) += tap-aix.o
> +net-nested-$(CONFIG_SLIRP) += slirp.o
> +net-nested-$(CONFIG_VDE) += vde.o
> +net-obj-y += $(addprefix net/, $(net-nested-y))
> +
> +######################################################################
> +# libqemu_common.a: Target independent part of system emulation. The
> +# long term path is to suppress *all* target specific code in case of
> +# system emulation, i.e. a single QEMU executable should support all
> +# CPUs and machines.
> +
> +common-obj-y = $(block-obj-y)
> +common-obj-y += $(net-obj-y)
> +common-obj-y += $(qobject-obj-y)
> +common-obj-y += readline.o console.o
> +
> +common-obj-y += tcg-runtime.o host-utils.o
> +common-obj-y += irq.o ioport.o
> +common-obj-$(CONFIG_PTIMER) += ptimer.o
> +common-obj-$(CONFIG_MAX7310) += max7310.o
> +common-obj-$(CONFIG_WM8750) += wm8750.o
> +common-obj-$(CONFIG_TWL92230) += twl92230.o
> +common-obj-$(CONFIG_TSC2005) += tsc2005.o
> +common-obj-$(CONFIG_LM832X) += lm832x.o
> +common-obj-$(CONFIG_TMP105) += tmp105.o
> +common-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
> +common-obj-$(CONFIG_SSD0303) += ssd0303.o
> +common-obj-$(CONFIG_SSD0323) += ssd0323.o
> +common-obj-$(CONFIG_ADS7846) += ads7846.o
> +common-obj-$(CONFIG_MAX111X) += max111x.o
> +common-obj-$(CONFIG_DS1338) += ds1338.o
> +common-obj-y += i2c.o smbus.o smbus_eeprom.o
> +common-obj-y += eeprom93xx.o
> +common-obj-y += scsi-disk.o cdrom.o
> +common-obj-y += scsi-generic.o scsi-bus.o
> +common-obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
> +common-obj-y += usb-serial.o usb-net.o usb-bus.o
> +common-obj-$(CONFIG_SSI) += ssi.o
> +common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
> +common-obj-$(CONFIG_SD) += sd.o
> +common-obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
> +common-obj-y += bt-hci-csr.o
> +common-obj-y += buffered_file.o migration.o migration-tcp.o qemu-sockets.o
> +common-obj-y += qemu-char.o savevm.o #aio.o
> +common-obj-y += msmouse.o ps2.o
> +common-obj-y += qdev.o qdev-properties.o
> +common-obj-y += qemu-config.o block-migration.o
> +
> +common-obj-$(CONFIG_BRLAPI) += baum.o
> +common-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
> +
> +audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
> +audio-obj-$(CONFIG_SDL) += sdlaudio.o
> +audio-obj-$(CONFIG_OSS) += ossaudio.o
> +audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
> +audio-obj-$(CONFIG_ALSA) += alsaaudio.o
> +audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
> +audio-obj-$(CONFIG_FMOD) += fmodaudio.o
> +audio-obj-$(CONFIG_ESD) += esdaudio.o
> +audio-obj-$(CONFIG_PA) += paaudio.o
> +audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
> +audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
> +audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
> +audio-obj-y += wavcapture.o
> +common-obj-y += $(addprefix audio/, $(audio-obj-y))
> +
> +common-obj-y += keymaps.o
> +common-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
> +common-obj-$(CONFIG_CURSES) += curses.o
> +common-obj-y += vnc.o acl.o d3des.o
> +common-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
> +common-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
> +common-obj-$(CONFIG_COCOA) += cocoa.o
> +common-obj-$(CONFIG_IOTHREAD) += qemu-thread.o
> +
> +slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
> +slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
> +slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
> +common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
> +
> +# xen backend driver support
> +common-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
> +common-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
> +
> +######################################################################
> +# libuser
> +
> +user-obj-y =
> +user-obj-y += envlist.o path.o
> +user-obj-y += tcg-runtime.o host-utils.o
> +user-obj-y += cutils.o cache-utils.o
> +
> +######################################################################
> +# libhw
> +
> +hw-obj-y =
> +hw-obj-y += loader.o
> +hw-obj-y += virtio.o
> +hw-obj-y += fw_cfg.o
> +hw-obj-y += watchdog.o
> +hw-obj-$(CONFIG_ECC) += ecc.o
> +hw-obj-$(CONFIG_NAND) += nand.o
> +
> +hw-obj-$(CONFIG_M48T59) += m48t59.o
> +hw-obj-$(CONFIG_ESCC) += escc.o
> +
> +# PCI watchdog devices
> +hw-obj-y += wdt_i6300esb.o
> +
> +hw-obj-y += msix.o
> +
> +# PCI network cards
> +hw-obj-y += ne2000.o
> +
> +hw-obj-$(CONFIG_SMC91C111) += smc91c111.o
> +hw-obj-$(CONFIG_LAN9118) += lan9118.o
> +
> +# SCSI layer
> +hw-obj-y += lsi53c895a.o
> +hw-obj-$(CONFIG_ESP) += esp.o
> +
> +hw-obj-y += dma-helpers.o sysbus.o isa-bus.o
> +hw-obj-$(CONFIG_QDEV_ADDR) += qdev-addr.o
> diff --git a/Makefile.target b/Makefile.target
> index 7c1f30c..543e8cd 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -1,17 +1,21 @@
>  # -*- Mode: makefile -*-
>
> -# This needs to be defined before rules.mak
>  GENERATED_HEADERS = config-target.h
>
>  include ../config-host.mak
>  include config-devices.mak
>  include config-target.mak
>  include $(SRC_PATH)/rules.mak
> +ifneq ($(HWDIR),)
> +include $(HWDIR)/config.mak
> +endif
>
>  TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
>  VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw
>  QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
>
> +include $(SRC_PATH)/Makefile.objs
> +
>  ifdef CONFIG_USER_ONLY
>  # user emulator name
>  QEMU_PROG=qemu-$(TARGET_ARCH2)
> @@ -64,9 +68,9 @@ libobj-$(CONFIG_S390_DIS) += s390-dis.o
>  libobj-$(CONFIG_SH4_DIS) += sh4-dis.o
>  libobj-$(CONFIG_SPARC_DIS) += sparc-dis.o
>
> -# libqemu
> +$(libobj-y): $(GENERATED_HEADERS)
>
> -libqemu.a: $(libobj-y)
> +# libqemu
>
>  translate.o: translate.c cpu.h
>
> @@ -106,7 +110,10 @@ obj-arm-y += arm-semi.o
>
>  obj-m68k-y += m68k-sim.o m68k-semi.o
>
> -ARLIBS=../libuser/libuser.a libqemu.a
> +$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
> +
> +obj-y += $(addprefix ../libuser/, $(user-obj-y))
> +obj-y += $(libobj-y)
>
>  endif #CONFIG_LINUX_USER
>
> @@ -128,7 +135,10 @@ obj-y = main.o commpage.o machload.o mmap.o signal.o syscall.o thunk.o \
>
>  obj-i386-y += ioport-user.o
>
> -ARLIBS=../libuser/libuser.a libqemu.a
> +$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
> +
> +obj-y += $(addprefix ../libuser/, $(user-obj-y))
> +obj-y += $(libobj-y)
>
>  endif #CONFIG_DARWIN_USER
>
> @@ -145,7 +155,10 @@ obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \
>
>  obj-i386-y += ioport-user.o
>
> -ARLIBS=../libuser/libuser.a libqemu.a
> +$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
> +
> +obj-y += $(addprefix ../libuser/, $(user-obj-y))
> +obj-y += $(libobj-y)
>
>  endif #CONFIG_BSD_USER
>
> @@ -303,13 +316,17 @@ vl.o: qemu-options.h
>
>  monitor.o: qemu-monitor.h
>
> -ARLIBS=../libqemu_common.a libqemu.a $(HWLIB)
> +$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
> +
> +obj-y += $(addprefix ../, $(common-obj-y))
> +obj-y += $(libobj-y)
> +obj-y += $(addprefix $(HWDIR)/, $(hw-obj-y))
>
>  endif # CONFIG_SOFTMMU
>
>  obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o
>
> -$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(ARLIBS)
> +$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)
>        $(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y))
>
>
> diff --git a/Makefile.user b/Makefile.user
> index 7daedef..c6ac509 100644
> --- a/Makefile.user
> +++ b/Makefile.user
> @@ -14,17 +14,12 @@ vpath %.c %.h $(SRC_PATH)
>
>  QEMU_CFLAGS+=-I..
>
> -obj-y =
> -obj-y += envlist.o path.o
> -obj-y += tcg-runtime.o host-utils.o
> -obj-y += cutils.o cache-utils.o
> +include $(SRC_PATH)/Makefile.objs
>
> -all: libuser.a
> +all: $(user-obj-y)
>  # Dummy command so that make thinks it has done something
>        @true
>
> -libuser.a: $(obj-y)
> -
>  clean:
>        rm -f *.o *.d *.a *~
>
> diff --git a/configure b/configure
> index 18aed43..1e9dd04 100755
> --- a/configure
> +++ b/configure
> @@ -1707,37 +1707,6 @@ elif compile_prog "" "-lrt" ; then
>   LIBS="-lrt $LIBS"
>  fi
>
> -# Determine what linker flags to use to force archive inclusion
> -check_linker_flags()
> -{
> -    w2=
> -    if test "$2" ; then
> -       w2=-Wl,$2
> -    fi
> -    compile_prog "" "-Wl,$1 ${w2}"
> -}
> -
> -cat > $TMPC << EOF
> -int main(void) { }
> -EOF
> -if check_linker_flags --whole-archive --no-whole-archive ; then
> -    # GNU ld
> -    arlibs_begin="-Wl,--whole-archive"
> -    arlibs_end="-Wl,--no-whole-archive"
> -elif check_linker_flags -z,allextract -z,defaultextract ; then
> -    # Solaris ld
> -    arlibs_begin="-Wl,-z,allextract"
> -    arlibs_end="-Wl,-z,defaultextract"
> -elif check_linker_flags -all_load ; then
> -    # Mac OS X
> -    arlibs_begin="-all_load"
> -    arlibs_end=""
> -else
> -    echo "Error: your linker does not support --whole-archive or -z."
> -    echo "Please report to qemu-devel@nongnu.org"
> -    exit 1
> -fi
> -
>  if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
>         "$aix" != "yes" ; then
>     libs_softmmu="-lutil $libs_softmmu"
> @@ -2427,7 +2396,7 @@ fi
>  if test "$target_softmmu" = "yes" ; then
>   echo "CONFIG_SOFTMMU=y" >> $config_target_mak
>   echo "LIBS+=$libs_softmmu" >> $config_target_mak
> -  echo "HWLIB=../libhw$target_phys_bits/libqemuhw$target_phys_bits.a" >> $config_target_mak
> +  echo "HWDIR=../libhw$target_phys_bits" >> $config_target_mak
>   echo "subdir-$target: subdir-libhw$target_phys_bits" >> $config_host_mak
>  fi
>  if test "$target_user_only" = "yes" ; then
> @@ -2644,7 +2613,6 @@ for hwlib in 32 64; do
>   mkdir -p $d
>   rm -f $d/Makefile
>   ln -s $source_path/Makefile.hw $d/Makefile
> -  echo "HWLIB=libqemuhw$hwlib.a" > $d/config.mak
>   echo "QEMU_CFLAGS+=-DTARGET_PHYS_ADDR_BITS=$hwlib" >> $d/config.mak
>  done
>
> diff --git a/rules.mak b/rules.mak
> index 5d9f684..9bcf9af 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -14,7 +14,7 @@ MAKEFLAGS += -rR
>  # Flags for dependency generation
>  QEMU_DGFLAGS += -MMD -MP -MT $@
>
> -%.o: %.c $(GENERATED_HEADERS)
> +%.o: %.c
>        $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
>
>  %.o: %.S
> @@ -23,7 +23,7 @@ QEMU_DGFLAGS += -MMD -MP -MT $@
>  %.o: %.m
>        $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  OBJC  $(TARGET_DIR)$@")
>
> -LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(ARLIBS_BEGIN) $(ARLIBS) $(ARLIBS_END) $(LIBS),"  LINK  $(TARGET_DIR)$@")
> +LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS),"  LINK  $(TARGET_DIR)$@")
>
>  %$(EXESUF): %.o
>        $(call LINK,$^)
> --
> 1.6.5.3
>
>
Palle Lyckegaard - Jan. 7, 2010, 6:11 p.m.
On Wed, 6 Jan 2010, Andreas F?rber wrote:

> v3:
> - Fix dependency modelling for tools
> - Remove comment on GENERATED_HEADERS obsoleted by this patch
>

Hi,

as the previous patches this v3 version solves the linking problems on 
Solaris hosts

regards
Palle
Stefan Weil - March 6, 2010, 11:33 a.m.
Blue Swirl schrieb:
> Thanks, applied.
>
>
> On Wed, Jan 6, 2010 at 7:24 PM, Andreas Färber
> <andreas.faerber@web.de> wrote:
>> From: Andreas Färber <afaerber@opensolaris.org>
>>
>> Juan has contributed a cool Makefile infrastructure that enables us
>> to drop
>> static libraries completely:
>>
>> Move shared obj-y definitions to Makefile.objs, prefixed
>> {common-,hw-,user-},
>> and link those object files directly into the executables.
>>
>> Replace HWLIB by HWDIR, specifying only the directory.
>>
>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>
>> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
>> common objects after generating a target-specific header; add dependency
>> rules to Makefile and Makefile.target instead.
>>
>> v2:
>> - Don't try to include /config.mak for user emulators
>> - Changes to user object paths ("Quickfix for libuser.a drop") were
>> obsoleted
>>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>>
>> v3:
>> - Fix dependency modelling for tools
>> - Remove comment on GENERATED_HEADERS obsoleted by this patch
>>
>> Signed-off-by: Andreas Färber <afaerber@opensolaris.org>
>> Cc: Blue Swirl <blauwirbel@gmail.com>
>> Cc: Palle Lyckegaard <palle@lyckegaard.dk>
>> Cc: Ben Taylor <bentaylor.solx86@gmail.com>
>> Cc: Juan Quintela <quintela@trasno.org>
>> Cc: Kirill A. Shutemov <kirill@shutemov.name>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>>  Makefile        |  138 +++++-------------------------------------------
>>  Makefile.hw     |   33 +-----------
>>  Makefile.objs   |  155
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  Makefile.target |   33 +++++++++---
>>  Makefile.user   |    9 +---
>>  configure       |   34 +------------
>>  rules.mak       |    4 +-
>>  7 files changed, 202 insertions(+), 204 deletions(-)
>>  create mode 100644 Makefile.objs
>>

Removing libqemu.a was technically ok, but throws a license problem:

"In particular, the QEMU virtual CPU core library (libqemu.a) is
released under the GNU Lesser General Public License."

Without libqemu.a, this part of QEMU's license no longer works.

I think the best solution would be to add a rule for libqemu.a
which allows users to build this static library (make libqemu.a).

libqemu.a is also still needed for tests/qruncom.

Regards,
Stefan Weil
Anthony Liguori - March 7, 2010, 1:53 p.m.
On 03/06/2010 05:33 AM, Stefan Weil wrote:
> Blue Swirl schrieb:
>    
>> Thanks, applied.
>>
>>
>> On Wed, Jan 6, 2010 at 7:24 PM, Andreas Färber
>> <andreas.faerber@web.de>  wrote:
>>      
>>> From: Andreas Färber<afaerber@opensolaris.org>
>>>
>>> Juan has contributed a cool Makefile infrastructure that enables us
>>> to drop
>>> static libraries completely:
>>>
>>> Move shared obj-y definitions to Makefile.objs, prefixed
>>> {common-,hw-,user-},
>>> and link those object files directly into the executables.
>>>
>>> Replace HWLIB by HWDIR, specifying only the directory.
>>>
>>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>>
>>> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
>>> common objects after generating a target-specific header; add dependency
>>> rules to Makefile and Makefile.target instead.
>>>
>>> v2:
>>> - Don't try to include /config.mak for user emulators
>>> - Changes to user object paths ("Quickfix for libuser.a drop") were
>>> obsoleted
>>>   by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>>>
>>> v3:
>>> - Fix dependency modelling for tools
>>> - Remove comment on GENERATED_HEADERS obsoleted by this patch
>>>
>>> Signed-off-by: Andreas Färber<afaerber@opensolaris.org>
>>> Cc: Blue Swirl<blauwirbel@gmail.com>
>>> Cc: Palle Lyckegaard<palle@lyckegaard.dk>
>>> Cc: Ben Taylor<bentaylor.solx86@gmail.com>
>>> Cc: Juan Quintela<quintela@trasno.org>
>>> Cc: Kirill A. Shutemov<kirill@shutemov.name>
>>> Cc: Paolo Bonzini<pbonzini@redhat.com>
>>> ---
>>>   Makefile        |  138 +++++-------------------------------------------
>>>   Makefile.hw     |   33 +-----------
>>>   Makefile.objs   |  155
>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>   Makefile.target |   33 +++++++++---
>>>   Makefile.user   |    9 +---
>>>   configure       |   34 +------------
>>>   rules.mak       |    4 +-
>>>   7 files changed, 202 insertions(+), 204 deletions(-)
>>>   create mode 100644 Makefile.objs
>>>
>>>        
> Removing libqemu.a was technically ok, but throws a license problem:
>    

Every file contains a copyright/license.  The statement in the top level 
is just a statement of intention.  It's to make sure that people do not 
introduce GPL'd code into libqemu.a.

Regards,

Anthony Liguori
Laurent Desnogues - March 7, 2010, 3:24 p.m.
On Sun, Mar 7, 2010 at 2:53 PM, Anthony Liguori <anthony@codemonkey.ws> wrote:
[...]
>>
>> Removing libqemu.a was technically ok, but throws a license problem:
>>
>
> Every file contains a copyright/license.  The statement in the top level is
> just a statement of intention.  It's to make sure that people do not
> introduce GPL'd code into libqemu.a.

./configure --target-list=i386-linux-user,i386-softmmu
make -j7

And:

find . -name 'lib*a'

finds nothing, so how can you say what is supposed to be
in libqemu?


Laurent
Juan Quintela - March 7, 2010, 4:47 p.m.
Stefan Weil <weil@mail.berlios.de> wrote:
> Blue Swirl schrieb:
>> Thanks, applied.
>
> Removing libqemu.a was technically ok, but throws a license problem:
>
> "In particular, the QEMU virtual CPU core library (libqemu.a) is
> released under the GNU Lesser General Public License."
>
> Without libqemu.a, this part of QEMU's license no longer works.
>
> I think the best solution would be to add a rule for libqemu.a
> which allows users to build this static library (make libqemu.a).
>
> libqemu.a is also still needed for tests/qruncom.

I noticed it also.  Not sure how to go here.  Create libqemu.a even if
it is not used?


From LICENSE:
  In particular, the QEMU virtual CPU core library (libqemu.a) is
  released under the GNU Lesser General Public License.

And if GPL licencse is complicated, LGPL for a static lib makes my head explode.

Later, Juan.
Andreas Färber - March 7, 2010, 5:32 p.m.
Am 07.03.2010 um 17:47 schrieb Juan Quintela:

> Stefan Weil <weil@mail.berlios.de> wrote:
>> Removing libqemu.a was technically ok, but throws a license problem:
>>
>> "In particular, the QEMU virtual CPU core library (libqemu.a) is
>> released under the GNU Lesser General Public License."
>>
>> Without libqemu.a, this part of QEMU's license no longer works.
>>
>> I think the best solution would be to add a rule for libqemu.a
>> which allows users to build this static library (make libqemu.a).
>>
>> libqemu.a is also still needed for tests/qruncom.
>
> I noticed it also.  Not sure how to go here.  Create libqemu.a even if
> it is not used?
>
>
> From LICENSE:
>  In particular, the QEMU virtual CPU core library (libqemu.a) is
>  released under the GNU Lesser General Public License.

We've had a handful of people inquire about LGPL licensing on this  
list, getting no answer: They complained that libqemu.a contained  
GPL'ed code and none of you cared, so that would seem a moot point and  
we should rather fix the licensing passage.

If libqemu.a is still used somewhere in the Makefiles, then obviously  
we have to fix it. Sorry if I missed something there.

Not sure how to go about re-providing a library either, we could  
theoretically add a target using our new infrastructure and leave our  
own executables as they are now, but that would re-introduce the  
original problems for any user with an incompatible tool chain, not to  
mention that someone would need to test such a library target.

Andreas
Anthony Liguori - March 8, 2010, 5:26 p.m.
On 03/07/2010 11:32 AM, Andreas Färber wrote:
>
> Am 07.03.2010 um 17:47 schrieb Juan Quintela:
>
>> Stefan Weil <weil@mail.berlios.de> wrote:
>>> Removing libqemu.a was technically ok, but throws a license problem:
>>>
>>> "In particular, the QEMU virtual CPU core library (libqemu.a) is
>>> released under the GNU Lesser General Public License."
>>>
>>> Without libqemu.a, this part of QEMU's license no longer works.
>>>
>>> I think the best solution would be to add a rule for libqemu.a
>>> which allows users to build this static library (make libqemu.a).
>>>
>>> libqemu.a is also still needed for tests/qruncom.
>>
>> I noticed it also.  Not sure how to go here.  Create libqemu.a even if
>> it is not used?
>>
>>
>> From LICENSE:
>>  In particular, the QEMU virtual CPU core library (libqemu.a) is
>>  released under the GNU Lesser General Public License.
>
> We've had a handful of people inquire about LGPL licensing on this 
> list, getting no answer: They complained that libqemu.a contained 
> GPL'ed code and none of you cared, so that would seem a moot point and 
> we should rather fix the licensing passage.

What we need to do is audit the code base for any file that doesn't 
carry an explicit copyright notice, and have the author(s) add explicit 
copyright/license statements to it.  This top level file is not a valid 
copyright statement IMHO in particular because it deals with things like 
"libqemu.a" which is poorly defined.

My understanding of LICENSE is that it is purely an explanation, not a 
licensing statement.  It was added by Fabrice and it covers code in the 
tree that was there before he added it that he didn't hold the copyright 
on so it's not a very strong statement.

It was his desire that libqemu.a be LGPL, that does not mean that it 
actually is...

Regards,

Anthony Liguori

Patch

diff --git a/Makefile b/Makefile
index c1fa08c..2ca341b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,5 @@ 
 # Makefile for QEMU.
 
-# This needs to be defined before rules.mak
 GENERATED_HEADERS = config-host.h
 
 ifneq ($(wildcard config-host.mak),)
@@ -66,7 +65,10 @@  SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
 subdir-%: $(GENERATED_HEADERS)
 	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
 
-$(filter %-softmmu,$(SUBDIR_RULES)): libqemu_common.a
+include $(SRC_PATH)/Makefile.objs
+
+$(common-obj-y): $(GENERATED_HEADERS)
+$(filter %-softmmu,$(SUBDIR_RULES)): $(common-obj-y)
 
 $(filter %-user,$(SUBDIR_RULES)): libuser.a
 
@@ -81,124 +83,8 @@  ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
 
 recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
 
-#######################################################################
-# QObject
-qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
-qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
-qobject-obj-y += qerror.o
-
-#######################################################################
-# block-obj-y is code used by both qemu system emulation and qemu-img
-
-block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o
-block-obj-y += nbd.o block.o aio.o aes.o osdep.o
-block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
-block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
-
-block-nested-y += cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
-block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o
-block-nested-y += parallels.o nbd.o
-block-nested-$(CONFIG_WIN32) += raw-win32.o
-block-nested-$(CONFIG_POSIX) += raw-posix.o
-block-nested-$(CONFIG_CURL) += curl.o
-
-block-obj-y +=  $(addprefix block/, $(block-nested-y))
-
-net-obj-y = net.o
-net-nested-y = queue.o checksum.o util.o
-net-nested-y += socket.o
-net-nested-y += dump.o
-net-nested-$(CONFIG_POSIX) += tap.o
-net-nested-$(CONFIG_LINUX) += tap-linux.o
-net-nested-$(CONFIG_WIN32) += tap-win32.o
-net-nested-$(CONFIG_BSD) += tap-bsd.o
-net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
-net-nested-$(CONFIG_AIX) += tap-aix.o
-net-nested-$(CONFIG_SLIRP) += slirp.o
-net-nested-$(CONFIG_VDE) += vde.o
-net-obj-y += $(addprefix net/, $(net-nested-y))
-
-######################################################################
-# libqemu_common.a: Target independent part of system emulation. The
-# long term path is to suppress *all* target specific code in case of
-# system emulation, i.e. a single QEMU executable should support all
-# CPUs and machines.
-
-obj-y = $(block-obj-y)
-obj-y += $(net-obj-y)
-obj-y += $(qobject-obj-y)
-obj-y += readline.o console.o
-
-obj-y += tcg-runtime.o host-utils.o
-obj-y += irq.o ioport.o
-obj-$(CONFIG_PTIMER) += ptimer.o
-obj-$(CONFIG_MAX7310) += max7310.o
-obj-$(CONFIG_WM8750) += wm8750.o
-obj-$(CONFIG_TWL92230) += twl92230.o
-obj-$(CONFIG_TSC2005) += tsc2005.o
-obj-$(CONFIG_LM832X) += lm832x.o
-obj-$(CONFIG_TMP105) += tmp105.o
-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
-obj-$(CONFIG_SSD0303) += ssd0303.o
-obj-$(CONFIG_SSD0323) += ssd0323.o
-obj-$(CONFIG_ADS7846) += ads7846.o
-obj-$(CONFIG_MAX111X) += max111x.o
-obj-$(CONFIG_DS1338) += ds1338.o
-obj-y += i2c.o smbus.o smbus_eeprom.o
-obj-y += eeprom93xx.o
-obj-y += scsi-disk.o cdrom.o
-obj-y += scsi-generic.o scsi-bus.o
-obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
-obj-y += usb-serial.o usb-net.o usb-bus.o
-obj-$(CONFIG_SSI) += ssi.o
-obj-$(CONFIG_SSI_SD) += ssi-sd.o
-obj-$(CONFIG_SD) += sd.o
-obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
-obj-y += bt-hci-csr.o
-obj-y += buffered_file.o migration.o migration-tcp.o qemu-sockets.o
-obj-y += qemu-char.o aio.o savevm.o
-obj-y += msmouse.o ps2.o
-obj-y += qdev.o qdev-properties.o
-obj-y += qemu-config.o block-migration.o
-
-obj-$(CONFIG_BRLAPI) += baum.o
-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
-
 audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS)
 
-audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
-audio-obj-$(CONFIG_SDL) += sdlaudio.o
-audio-obj-$(CONFIG_OSS) += ossaudio.o
-audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
-audio-obj-$(CONFIG_ALSA) += alsaaudio.o
-audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
-audio-obj-$(CONFIG_FMOD) += fmodaudio.o
-audio-obj-$(CONFIG_ESD) += esdaudio.o
-audio-obj-$(CONFIG_PA) += paaudio.o
-audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
-audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
-audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
-audio-obj-y += wavcapture.o
-obj-y += $(addprefix audio/, $(audio-obj-y))
-
-obj-y += keymaps.o
-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
-obj-$(CONFIG_CURSES) += curses.o
-obj-y += vnc.o acl.o d3des.o
-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
-obj-$(CONFIG_COCOA) += cocoa.o
-obj-$(CONFIG_IOTHREAD) += qemu-thread.o
-
-slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
-slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
-slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
-
-# xen backend driver support
-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
-
 QEMU_CFLAGS+=$(CURL_CFLAGS)
 
 cocoa.o: cocoa.m
@@ -229,17 +115,23 @@  curses.o: curses.c keymaps.h curses_keys.h
 
 bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
 
-libqemu_common.a: $(obj-y)
-
 ######################################################################
 
 qemu-img.o: qemu-img-cmds.h
 
-qemu-img$(EXESUF): qemu-img.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
+obj-y = qemu-img.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
+
+qemu-img$(EXESUF): $(obj-y)
+
+obj-y = qemu-nbd.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
+$(obj-y): $(GENERATED_HEADERS)
+
+qemu-nbd$(EXESUF): $(obj-y)
 
-qemu-nbd$(EXESUF):  qemu-nbd.o qemu-tool.o $(block-obj-y) $(qobject-obj-y)
+obj-y = qemu-io.o qemu-tool.o cmd.o $(block-obj-y) $(qobject-obj-y)
+$(obj-y): $(GENERATED_HEADERS)
 
-qemu-io$(EXESUF):  qemu-io.o qemu-tool.o cmd.o $(block-obj-y) $(qobject-obj-y)
+qemu-io$(EXESUF): $(obj-y)
 
 qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx
 	$(call quiet-command,sh $(SRC_PATH)/hxtool -h < $< > $@,"  GEN   $@")
diff --git a/Makefile.hw b/Makefile.hw
index bd252f5..ff87ae4 100644
--- a/Makefile.hw
+++ b/Makefile.hw
@@ -11,41 +11,12 @@  VPATH=$(SRC_PATH):$(SRC_PATH)/hw
 
 QEMU_CFLAGS+=-I.. -I$(SRC_PATH)/fpu
 
-obj-y =
-obj-y += loader.o
-obj-y += virtio.o
-obj-y += fw_cfg.o
-obj-y += watchdog.o
-obj-$(CONFIG_ECC) += ecc.o
-obj-$(CONFIG_NAND) += nand.o
+include $(SRC_PATH)/Makefile.objs
 
-obj-$(CONFIG_M48T59) += m48t59.o
-obj-$(CONFIG_ESCC) += escc.o
-
-# PCI watchdog devices
-obj-y += wdt_i6300esb.o
-
-obj-y += msix.o
-
-# PCI network cards
-obj-y += ne2000.o
-
-obj-$(CONFIG_SMC91C111) += smc91c111.o
-obj-$(CONFIG_LAN9118) += lan9118.o
-
-# SCSI layer
-obj-y += lsi53c895a.o
-obj-$(CONFIG_ESP) += esp.o
-
-obj-y += dma-helpers.o sysbus.o isa-bus.o
-obj-$(CONFIG_QDEV_ADDR) += qdev-addr.o
-
-all: $(HWLIB)
+all: $(hw-obj-y)
 # Dummy command so that make thinks it has done something
 	@true
 
-$(HWLIB): $(obj-y)
-
 clean:
 	rm -f *.o *.d *.a *~
 
diff --git a/Makefile.objs b/Makefile.objs
new file mode 100644
index 0000000..e8a44d7
--- /dev/null
+++ b/Makefile.objs
@@ -0,0 +1,155 @@ 
+#######################################################################
+# QObject
+qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
+qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
+qobject-obj-y += qerror.o
+
+#######################################################################
+# block-obj-y is code used by both qemu system emulation and qemu-img
+
+block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o
+block-obj-y += nbd.o block.o aio.o aes.o osdep.o
+block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
+block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
+
+block-nested-y += cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
+block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o
+block-nested-y += parallels.o nbd.o
+block-nested-$(CONFIG_WIN32) += raw-win32.o
+block-nested-$(CONFIG_POSIX) += raw-posix.o
+block-nested-$(CONFIG_CURL) += curl.o
+
+block-obj-y +=  $(addprefix block/, $(block-nested-y))
+
+net-obj-y = net.o
+net-nested-y = queue.o checksum.o util.o
+net-nested-y += socket.o
+net-nested-y += dump.o
+net-nested-$(CONFIG_POSIX) += tap.o
+net-nested-$(CONFIG_LINUX) += tap-linux.o
+net-nested-$(CONFIG_WIN32) += tap-win32.o
+net-nested-$(CONFIG_BSD) += tap-bsd.o
+net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
+net-nested-$(CONFIG_AIX) += tap-aix.o
+net-nested-$(CONFIG_SLIRP) += slirp.o
+net-nested-$(CONFIG_VDE) += vde.o
+net-obj-y += $(addprefix net/, $(net-nested-y))
+
+######################################################################
+# libqemu_common.a: Target independent part of system emulation. The
+# long term path is to suppress *all* target specific code in case of
+# system emulation, i.e. a single QEMU executable should support all
+# CPUs and machines.
+
+common-obj-y = $(block-obj-y)
+common-obj-y += $(net-obj-y)
+common-obj-y += $(qobject-obj-y)
+common-obj-y += readline.o console.o
+
+common-obj-y += tcg-runtime.o host-utils.o
+common-obj-y += irq.o ioport.o
+common-obj-$(CONFIG_PTIMER) += ptimer.o
+common-obj-$(CONFIG_MAX7310) += max7310.o
+common-obj-$(CONFIG_WM8750) += wm8750.o
+common-obj-$(CONFIG_TWL92230) += twl92230.o
+common-obj-$(CONFIG_TSC2005) += tsc2005.o
+common-obj-$(CONFIG_LM832X) += lm832x.o
+common-obj-$(CONFIG_TMP105) += tmp105.o
+common-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
+common-obj-$(CONFIG_SSD0303) += ssd0303.o
+common-obj-$(CONFIG_SSD0323) += ssd0323.o
+common-obj-$(CONFIG_ADS7846) += ads7846.o
+common-obj-$(CONFIG_MAX111X) += max111x.o
+common-obj-$(CONFIG_DS1338) += ds1338.o
+common-obj-y += i2c.o smbus.o smbus_eeprom.o
+common-obj-y += eeprom93xx.o
+common-obj-y += scsi-disk.o cdrom.o
+common-obj-y += scsi-generic.o scsi-bus.o
+common-obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
+common-obj-y += usb-serial.o usb-net.o usb-bus.o
+common-obj-$(CONFIG_SSI) += ssi.o
+common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
+common-obj-$(CONFIG_SD) += sd.o
+common-obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
+common-obj-y += bt-hci-csr.o
+common-obj-y += buffered_file.o migration.o migration-tcp.o qemu-sockets.o
+common-obj-y += qemu-char.o savevm.o #aio.o
+common-obj-y += msmouse.o ps2.o
+common-obj-y += qdev.o qdev-properties.o
+common-obj-y += qemu-config.o block-migration.o
+
+common-obj-$(CONFIG_BRLAPI) += baum.o
+common-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
+
+audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
+audio-obj-$(CONFIG_SDL) += sdlaudio.o
+audio-obj-$(CONFIG_OSS) += ossaudio.o
+audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
+audio-obj-$(CONFIG_ALSA) += alsaaudio.o
+audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
+audio-obj-$(CONFIG_FMOD) += fmodaudio.o
+audio-obj-$(CONFIG_ESD) += esdaudio.o
+audio-obj-$(CONFIG_PA) += paaudio.o
+audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
+audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
+audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
+audio-obj-y += wavcapture.o
+common-obj-y += $(addprefix audio/, $(audio-obj-y))
+
+common-obj-y += keymaps.o
+common-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
+common-obj-$(CONFIG_CURSES) += curses.o
+common-obj-y += vnc.o acl.o d3des.o
+common-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
+common-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
+common-obj-$(CONFIG_COCOA) += cocoa.o
+common-obj-$(CONFIG_IOTHREAD) += qemu-thread.o
+
+slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
+slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
+slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
+common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
+
+# xen backend driver support
+common-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
+common-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
+
+######################################################################
+# libuser
+
+user-obj-y =
+user-obj-y += envlist.o path.o
+user-obj-y += tcg-runtime.o host-utils.o
+user-obj-y += cutils.o cache-utils.o
+
+######################################################################
+# libhw
+
+hw-obj-y =
+hw-obj-y += loader.o
+hw-obj-y += virtio.o
+hw-obj-y += fw_cfg.o
+hw-obj-y += watchdog.o
+hw-obj-$(CONFIG_ECC) += ecc.o
+hw-obj-$(CONFIG_NAND) += nand.o
+
+hw-obj-$(CONFIG_M48T59) += m48t59.o
+hw-obj-$(CONFIG_ESCC) += escc.o
+
+# PCI watchdog devices
+hw-obj-y += wdt_i6300esb.o
+
+hw-obj-y += msix.o
+
+# PCI network cards
+hw-obj-y += ne2000.o
+
+hw-obj-$(CONFIG_SMC91C111) += smc91c111.o
+hw-obj-$(CONFIG_LAN9118) += lan9118.o
+
+# SCSI layer
+hw-obj-y += lsi53c895a.o
+hw-obj-$(CONFIG_ESP) += esp.o
+
+hw-obj-y += dma-helpers.o sysbus.o isa-bus.o
+hw-obj-$(CONFIG_QDEV_ADDR) += qdev-addr.o
diff --git a/Makefile.target b/Makefile.target
index 7c1f30c..543e8cd 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -1,17 +1,21 @@ 
 # -*- Mode: makefile -*-
 
-# This needs to be defined before rules.mak
 GENERATED_HEADERS = config-target.h
 
 include ../config-host.mak
 include config-devices.mak
 include config-target.mak
 include $(SRC_PATH)/rules.mak
+ifneq ($(HWDIR),)
+include $(HWDIR)/config.mak
+endif
 
 TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
 VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw
 QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
 
+include $(SRC_PATH)/Makefile.objs
+
 ifdef CONFIG_USER_ONLY
 # user emulator name
 QEMU_PROG=qemu-$(TARGET_ARCH2)
@@ -64,9 +68,9 @@  libobj-$(CONFIG_S390_DIS) += s390-dis.o
 libobj-$(CONFIG_SH4_DIS) += sh4-dis.o
 libobj-$(CONFIG_SPARC_DIS) += sparc-dis.o
 
-# libqemu
+$(libobj-y): $(GENERATED_HEADERS)
 
-libqemu.a: $(libobj-y)
+# libqemu
 
 translate.o: translate.c cpu.h
 
@@ -106,7 +110,10 @@  obj-arm-y += arm-semi.o
 
 obj-m68k-y += m68k-sim.o m68k-semi.o
 
-ARLIBS=../libuser/libuser.a libqemu.a
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(libobj-y)
 
 endif #CONFIG_LINUX_USER
 
@@ -128,7 +135,10 @@  obj-y = main.o commpage.o machload.o mmap.o signal.o syscall.o thunk.o \
 
 obj-i386-y += ioport-user.o
 
-ARLIBS=../libuser/libuser.a libqemu.a
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(libobj-y)
 
 endif #CONFIG_DARWIN_USER
 
@@ -145,7 +155,10 @@  obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \
 
 obj-i386-y += ioport-user.o
 
-ARLIBS=../libuser/libuser.a libqemu.a
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(libobj-y)
 
 endif #CONFIG_BSD_USER
 
@@ -303,13 +316,17 @@  vl.o: qemu-options.h
 
 monitor.o: qemu-monitor.h
 
-ARLIBS=../libqemu_common.a libqemu.a $(HWLIB)
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../, $(common-obj-y))
+obj-y += $(libobj-y)
+obj-y += $(addprefix $(HWDIR)/, $(hw-obj-y))
 
 endif # CONFIG_SOFTMMU
 
 obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o
 
-$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(ARLIBS)
+$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)
 	$(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y))
 
 
diff --git a/Makefile.user b/Makefile.user
index 7daedef..c6ac509 100644
--- a/Makefile.user
+++ b/Makefile.user
@@ -14,17 +14,12 @@  vpath %.c %.h $(SRC_PATH)
 
 QEMU_CFLAGS+=-I..
 
-obj-y =
-obj-y += envlist.o path.o
-obj-y += tcg-runtime.o host-utils.o
-obj-y += cutils.o cache-utils.o
+include $(SRC_PATH)/Makefile.objs
 
-all: libuser.a
+all: $(user-obj-y)
 # Dummy command so that make thinks it has done something
 	@true
 
-libuser.a: $(obj-y)
-
 clean:
 	rm -f *.o *.d *.a *~
 
diff --git a/configure b/configure
index 18aed43..1e9dd04 100755
--- a/configure
+++ b/configure
@@ -1707,37 +1707,6 @@  elif compile_prog "" "-lrt" ; then
   LIBS="-lrt $LIBS"
 fi
 
-# Determine what linker flags to use to force archive inclusion
-check_linker_flags()
-{
-    w2=
-    if test "$2" ; then
-	w2=-Wl,$2
-    fi
-    compile_prog "" "-Wl,$1 ${w2}"
-}
-
-cat > $TMPC << EOF
-int main(void) { }
-EOF
-if check_linker_flags --whole-archive --no-whole-archive ; then
-    # GNU ld
-    arlibs_begin="-Wl,--whole-archive"
-    arlibs_end="-Wl,--no-whole-archive"
-elif check_linker_flags -z,allextract -z,defaultextract ; then
-    # Solaris ld
-    arlibs_begin="-Wl,-z,allextract"
-    arlibs_end="-Wl,-z,defaultextract"
-elif check_linker_flags -all_load ; then
-    # Mac OS X
-    arlibs_begin="-all_load"
-    arlibs_end=""
-else
-    echo "Error: your linker does not support --whole-archive or -z."
-    echo "Please report to qemu-devel@nongnu.org"
-    exit 1
-fi
-
 if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
         "$aix" != "yes" ; then
     libs_softmmu="-lutil $libs_softmmu"
@@ -2427,7 +2396,7 @@  fi
 if test "$target_softmmu" = "yes" ; then
   echo "CONFIG_SOFTMMU=y" >> $config_target_mak
   echo "LIBS+=$libs_softmmu" >> $config_target_mak
-  echo "HWLIB=../libhw$target_phys_bits/libqemuhw$target_phys_bits.a" >> $config_target_mak
+  echo "HWDIR=../libhw$target_phys_bits" >> $config_target_mak
   echo "subdir-$target: subdir-libhw$target_phys_bits" >> $config_host_mak
 fi
 if test "$target_user_only" = "yes" ; then
@@ -2644,7 +2613,6 @@  for hwlib in 32 64; do
   mkdir -p $d
   rm -f $d/Makefile
   ln -s $source_path/Makefile.hw $d/Makefile
-  echo "HWLIB=libqemuhw$hwlib.a" > $d/config.mak
   echo "QEMU_CFLAGS+=-DTARGET_PHYS_ADDR_BITS=$hwlib" >> $d/config.mak
 done
 
diff --git a/rules.mak b/rules.mak
index 5d9f684..9bcf9af 100644
--- a/rules.mak
+++ b/rules.mak
@@ -14,7 +14,7 @@  MAKEFLAGS += -rR
 # Flags for dependency generation
 QEMU_DGFLAGS += -MMD -MP -MT $@
 
-%.o: %.c $(GENERATED_HEADERS)
+%.o: %.c
 	$(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
 
 %.o: %.S
@@ -23,7 +23,7 @@  QEMU_DGFLAGS += -MMD -MP -MT $@
 %.o: %.m
 	$(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  OBJC  $(TARGET_DIR)$@")
 
-LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(ARLIBS_BEGIN) $(ARLIBS) $(ARLIBS_END) $(LIBS),"  LINK  $(TARGET_DIR)$@")
+LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS),"  LINK  $(TARGET_DIR)$@")
 
 %$(EXESUF): %.o
 	$(call LINK,$^)