3bc2f570ec
Weak symbols were a nice idea, but they turned out not to be a good one. Toolchain support is just too sparse, in particular llvm-gcc is totally broken. This patch uses a surprisingly low-tech approach: a static library. Symbols in a static library are always overridden by symbols in an object file. Furthermore, if you place each function in a separate source file, object files for unused functions will not be taken in. This means that each function can use all the dependencies that it needs (especially QAPI stuff such as error_setg). Thus, all stubs are placed in separate object files and put together in a static library. The library then is linked to all programs. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Tested-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Tested-by: Stefan Weil <sw@weilnetz.de> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
255 lines
8.1 KiB
Makefile
255 lines
8.1 KiB
Makefile
#######################################################################
|
|
# Stub library, linked in tools
|
|
stub-obj-y = stubs/
|
|
|
|
#######################################################################
|
|
# Target-independent parts used in system and user emulation
|
|
universal-obj-y =
|
|
universal-obj-y += qemu-log.o
|
|
|
|
#######################################################################
|
|
# 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 error.o qemu-error.o
|
|
|
|
universal-obj-y += $(qobject-obj-y)
|
|
|
|
#######################################################################
|
|
# QOM
|
|
qom-obj-y = qom/
|
|
|
|
universal-obj-y += $(qom-obj-y)
|
|
|
|
#######################################################################
|
|
# oslib-obj-y is code depending on the OS (win32 vs posix)
|
|
oslib-obj-y = osdep.o cutils.o qemu-timer-common.o
|
|
oslib-obj-$(CONFIG_WIN32) += oslib-win32.o qemu-thread-win32.o
|
|
oslib-obj-$(CONFIG_POSIX) += oslib-posix.o qemu-thread-posix.o
|
|
|
|
#######################################################################
|
|
# coroutines
|
|
coroutine-obj-y = qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
|
|
coroutine-obj-y += qemu-coroutine-sleep.o
|
|
ifeq ($(CONFIG_UCONTEXT_COROUTINE),y)
|
|
coroutine-obj-$(CONFIG_POSIX) += coroutine-ucontext.o
|
|
else
|
|
ifeq ($(CONFIG_SIGALTSTACK_COROUTINE),y)
|
|
coroutine-obj-$(CONFIG_POSIX) += coroutine-sigaltstack.o
|
|
else
|
|
coroutine-obj-$(CONFIG_POSIX) += coroutine-gthread.o
|
|
endif
|
|
endif
|
|
coroutine-obj-$(CONFIG_WIN32) += coroutine-win32.o
|
|
|
|
#######################################################################
|
|
# block-obj-y is code used by both qemu system emulation and qemu-img
|
|
|
|
block-obj-y = iov.o cache-utils.o qemu-option.o module.o async.o
|
|
block-obj-y += nbd.o block.o blockjob.o aes.o qemu-config.o
|
|
block-obj-y += thread-pool.o qemu-progress.o qemu-sockets.o uri.o notify.o
|
|
block-obj-y += $(coroutine-obj-y) $(qobject-obj-y) $(version-obj-y)
|
|
block-obj-$(CONFIG_POSIX) += event_notifier-posix.o aio-posix.o
|
|
block-obj-$(CONFIG_WIN32) += event_notifier-win32.o aio-win32.o
|
|
block-obj-y += block/
|
|
block-obj-y += $(qapi-obj-y) qapi-types.o qapi-visit.o
|
|
|
|
ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
|
|
# Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
|
|
# only pull in the actual virtio-9p device if we also enabled virtio.
|
|
CONFIG_REALLY_VIRTFS=y
|
|
endif
|
|
|
|
######################################################################
|
|
# 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) blockdev.o blockdev-nbd.o block/
|
|
common-obj-y += net.o net/
|
|
common-obj-y += qom/
|
|
common-obj-y += readline.o console.o cursor.o
|
|
common-obj-y += qemu-pixman.o
|
|
common-obj-y += $(oslib-obj-y)
|
|
common-obj-$(CONFIG_WIN32) += os-win32.o
|
|
common-obj-$(CONFIG_POSIX) += os-posix.o
|
|
|
|
common-obj-$(CONFIG_LINUX) += fsdev/
|
|
extra-obj-$(CONFIG_LINUX) += fsdev/
|
|
|
|
common-obj-y += tcg-runtime.o host-utils.o main-loop.o
|
|
common-obj-y += input.o
|
|
common-obj-y += buffered_file.o migration.o migration-tcp.o
|
|
common-obj-y += qemu-char.o #aio.o
|
|
common-obj-y += block-migration.o iohandler.o
|
|
common-obj-y += bitmap.o bitops.o
|
|
common-obj-y += page_cache.o
|
|
|
|
common-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
|
|
common-obj-$(CONFIG_WIN32) += version.o
|
|
|
|
common-obj-$(CONFIG_SPICE) += spice-qemu-char.o
|
|
|
|
common-obj-y += audio/
|
|
common-obj-y += hw/
|
|
common-obj-y += ui/
|
|
common-obj-y += bt-host.o bt-vhci.o
|
|
|
|
common-obj-y += dma-helpers.o
|
|
common-obj-y += acl.o
|
|
common-obj-$(CONFIG_POSIX) += compatfd.o
|
|
common-obj-y += qemu-timer.o qemu-timer-common.o
|
|
common-obj-y += qtest.o
|
|
common-obj-y += vl.o
|
|
|
|
common-obj-$(CONFIG_SLIRP) += slirp/
|
|
|
|
common-obj-y += backends/
|
|
|
|
######################################################################
|
|
# libseccomp
|
|
ifeq ($(CONFIG_SECCOMP),y)
|
|
common-obj-y += qemu-seccomp.o
|
|
endif
|
|
|
|
######################################################################
|
|
# libuser
|
|
|
|
user-obj-y =
|
|
user-obj-y += envlist.o path.o
|
|
user-obj-y += tcg-runtime.o host-utils.o
|
|
user-obj-y += cache-utils.o
|
|
user-obj-y += module.o
|
|
user-obj-y += qemu-user.o
|
|
user-obj-y += $(trace-obj-y)
|
|
user-obj-y += qom/
|
|
|
|
######################################################################
|
|
# libdis
|
|
# NOTE: the disassembler code is only needed for debugging
|
|
|
|
libdis-y =
|
|
libdis-$(CONFIG_ALPHA_DIS) += alpha-dis.o
|
|
libdis-$(CONFIG_ARM_DIS) += arm-dis.o
|
|
libdis-$(CONFIG_CRIS_DIS) += cris-dis.o
|
|
libdis-$(CONFIG_HPPA_DIS) += hppa-dis.o
|
|
libdis-$(CONFIG_I386_DIS) += i386-dis.o
|
|
libdis-$(CONFIG_IA64_DIS) += ia64-dis.o
|
|
libdis-$(CONFIG_M68K_DIS) += m68k-dis.o
|
|
libdis-$(CONFIG_MICROBLAZE_DIS) += microblaze-dis.o
|
|
libdis-$(CONFIG_MIPS_DIS) += mips-dis.o
|
|
libdis-$(CONFIG_PPC_DIS) += ppc-dis.o
|
|
libdis-$(CONFIG_S390_DIS) += s390-dis.o
|
|
libdis-$(CONFIG_SH4_DIS) += sh4-dis.o
|
|
libdis-$(CONFIG_SPARC_DIS) += sparc-dis.o
|
|
libdis-$(CONFIG_LM32_DIS) += lm32-dis.o
|
|
|
|
######################################################################
|
|
# trace
|
|
|
|
ifeq ($(TRACE_BACKEND),dtrace)
|
|
TRACE_H_EXTRA_DEPS=trace-dtrace.h
|
|
endif
|
|
trace.h: trace.h-timestamp $(TRACE_H_EXTRA_DEPS)
|
|
trace.h-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--format=h \
|
|
--backend=$(TRACE_BACKEND) \
|
|
< $< > $@," GEN trace.h")
|
|
@cmp -s $@ trace.h || cp $@ trace.h
|
|
|
|
trace.c: trace.c-timestamp
|
|
trace.c-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--format=c \
|
|
--backend=$(TRACE_BACKEND) \
|
|
< $< > $@," GEN trace.c")
|
|
@cmp -s $@ trace.c || cp $@ trace.c
|
|
|
|
trace.o: trace.c $(GENERATED_HEADERS)
|
|
|
|
trace-dtrace.h: trace-dtrace.dtrace
|
|
$(call quiet-command,dtrace -o $@ -h -s $<, " GEN trace-dtrace.h")
|
|
|
|
# Normal practice is to name DTrace probe file with a '.d' extension
|
|
# but that gets picked up by QEMU's Makefile as an external dependency
|
|
# rule file. So we use '.dtrace' instead
|
|
trace-dtrace.dtrace: trace-dtrace.dtrace-timestamp
|
|
trace-dtrace.dtrace-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--format=d \
|
|
--backend=$(TRACE_BACKEND) \
|
|
< $< > $@," GEN trace-dtrace.dtrace")
|
|
@cmp -s $@ trace-dtrace.dtrace || cp $@ trace-dtrace.dtrace
|
|
|
|
trace-dtrace.o: trace-dtrace.dtrace $(GENERATED_HEADERS)
|
|
$(call quiet-command,dtrace -o $@ -G -s $<, " GEN trace-dtrace.o")
|
|
|
|
ifeq ($(LIBTOOL),)
|
|
trace-dtrace.lo: trace-dtrace.dtrace
|
|
@echo "missing libtool. please install and rerun configure."; exit 1
|
|
else
|
|
trace-dtrace.lo: trace-dtrace.dtrace
|
|
$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN trace-dtrace.o")
|
|
endif
|
|
|
|
trace/simple.o: trace/simple.c $(GENERATED_HEADERS)
|
|
|
|
trace-obj-$(CONFIG_TRACE_DTRACE) += trace-dtrace.o
|
|
ifneq ($(TRACE_BACKEND),dtrace)
|
|
trace-obj-y = trace.o
|
|
endif
|
|
|
|
trace-obj-$(CONFIG_TRACE_DEFAULT) += trace/default.o
|
|
trace-obj-$(CONFIG_TRACE_SIMPLE) += trace/simple.o
|
|
trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o
|
|
trace-obj-$(CONFIG_TRACE_STDERR) += trace/stderr.o
|
|
trace-obj-y += trace/control.o
|
|
|
|
$(trace-obj-y): $(GENERATED_HEADERS)
|
|
|
|
######################################################################
|
|
# smartcard
|
|
|
|
libcacard-y += libcacard/cac.o libcacard/event.o
|
|
libcacard-y += libcacard/vcard.o libcacard/vreader.o
|
|
libcacard-y += libcacard/vcard_emul_nss.o
|
|
libcacard-y += libcacard/vcard_emul_type.o
|
|
libcacard-y += libcacard/card_7816.o
|
|
|
|
common-obj-$(CONFIG_SMARTCARD_NSS) += $(libcacard-y)
|
|
|
|
######################################################################
|
|
# qapi
|
|
|
|
qapi-obj-y = qapi/
|
|
qapi-obj-y += qapi-types.o qapi-visit.o
|
|
|
|
common-obj-y += qmp-marshal.o qapi-visit.o qapi-types.o
|
|
common-obj-y += qmp.o hmp.o
|
|
|
|
universal-obj-y += $(qapi-obj-y)
|
|
|
|
######################################################################
|
|
# guest agent
|
|
|
|
qga-obj-y = qga/ qemu-ga.o module.o qemu-tool.o
|
|
qga-obj-$(CONFIG_POSIX) += qemu-sockets.o qemu-option.o
|
|
|
|
vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
|
|
|
|
vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
|
|
|
|
QEMU_CFLAGS+=$(GLIB_CFLAGS)
|
|
|
|
nested-vars += \
|
|
stub-obj-y \
|
|
qga-obj-y \
|
|
qom-obj-y \
|
|
qapi-obj-y \
|
|
block-obj-y \
|
|
user-obj-y \
|
|
common-obj-y \
|
|
extra-obj-y
|
|
dummy := $(call unnest-vars)
|