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>
205 lines
5.5 KiB
Makefile
205 lines
5.5 KiB
Makefile
# -*- Mode: makefile -*-
|
|
|
|
include ../config-host.mak
|
|
include config-devices.mak
|
|
include config-target.mak
|
|
include $(SRC_PATH)/rules.mak
|
|
|
|
$(call set-vpath, $(SRC_PATH))
|
|
ifdef CONFIG_LINUX
|
|
QEMU_CFLAGS += -I../linux-headers
|
|
endif
|
|
QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) -DNEED_CPU_H
|
|
|
|
QEMU_CFLAGS+=-I$(SRC_PATH)/include
|
|
|
|
ifdef CONFIG_USER_ONLY
|
|
# user emulator name
|
|
QEMU_PROG=qemu-$(TARGET_ARCH2)
|
|
else
|
|
# system emulator name
|
|
ifneq (,$(findstring -mwindows,$(LIBS)))
|
|
# Terminate program name with a 'w' because the linker builds a windows executable.
|
|
QEMU_PROGW=qemu-system-$(TARGET_ARCH2)w$(EXESUF)
|
|
endif # windows executable
|
|
QEMU_PROG=qemu-system-$(TARGET_ARCH2)$(EXESUF)
|
|
endif
|
|
|
|
PROGS=$(QEMU_PROG)
|
|
ifdef QEMU_PROGW
|
|
PROGS+=$(QEMU_PROGW)
|
|
endif
|
|
STPFILES=
|
|
|
|
ifndef CONFIG_HAIKU
|
|
LIBS+=-lm
|
|
endif
|
|
|
|
config-target.h: config-target.h-timestamp
|
|
config-target.h-timestamp: config-target.mak
|
|
|
|
ifdef CONFIG_TRACE_SYSTEMTAP
|
|
stap: $(QEMU_PROG).stp
|
|
|
|
ifdef CONFIG_USER_ONLY
|
|
TARGET_TYPE=user
|
|
else
|
|
TARGET_TYPE=system
|
|
endif
|
|
|
|
$(QEMU_PROG).stp: $(SRC_PATH)/trace-events
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--format=stap \
|
|
--backend=$(TRACE_BACKEND) \
|
|
--binary=$(bindir)/$(QEMU_PROG) \
|
|
--target-arch=$(TARGET_ARCH) \
|
|
--target-type=$(TARGET_TYPE) \
|
|
< $< > $@," GEN $(QEMU_PROG).stp")
|
|
else
|
|
stap:
|
|
endif
|
|
|
|
all: $(PROGS) stap
|
|
|
|
# Dummy command so that make thinks it has done something
|
|
@true
|
|
|
|
#########################################################
|
|
# cpu emulator library
|
|
obj-y = exec.o translate-all.o cpu-exec.o
|
|
obj-y += tcg/tcg.o tcg/optimize.o
|
|
obj-$(CONFIG_TCG_INTERPRETER) += tci.o
|
|
obj-y += fpu/softfloat.o
|
|
obj-y += disas.o
|
|
obj-$(CONFIG_TCI_DIS) += tci-dis.o
|
|
obj-y += target-$(TARGET_BASE_ARCH)/
|
|
obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o
|
|
|
|
tci-dis.o: QEMU_CFLAGS += -I$(SRC_PATH)/tcg -I$(SRC_PATH)/tcg/tci
|
|
|
|
#########################################################
|
|
# Linux user emulator target
|
|
|
|
ifdef CONFIG_LINUX_USER
|
|
|
|
QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) -I$(SRC_PATH)/linux-user
|
|
|
|
obj-y += linux-user/
|
|
obj-y += gdbstub.o thunk.o user-exec.o $(oslib-obj-y)
|
|
|
|
endif #CONFIG_LINUX_USER
|
|
|
|
#########################################################
|
|
# BSD user emulator target
|
|
|
|
ifdef CONFIG_BSD_USER
|
|
|
|
QEMU_CFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ARCH)
|
|
|
|
obj-y += bsd-user/
|
|
obj-y += gdbstub.o user-exec.o $(oslib-obj-y)
|
|
|
|
endif #CONFIG_BSD_USER
|
|
|
|
#########################################################
|
|
# System emulator target
|
|
ifdef CONFIG_SOFTMMU
|
|
CONFIG_NO_PCI = $(if $(subst n,,$(CONFIG_PCI)),n,y)
|
|
CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)
|
|
CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y)
|
|
CONFIG_NO_GET_MEMORY_MAPPING = $(if $(subst n,,$(CONFIG_HAVE_GET_MEMORY_MAPPING)),n,y)
|
|
CONFIG_NO_CORE_DUMP = $(if $(subst n,,$(CONFIG_HAVE_CORE_DUMP)),n,y)
|
|
|
|
obj-y += arch_init.o cpus.o monitor.o gdbstub.o balloon.o ioport.o
|
|
obj-y += hw/
|
|
obj-$(CONFIG_KVM) += kvm-all.o
|
|
obj-$(CONFIG_NO_KVM) += kvm-stub.o
|
|
obj-y += memory.o savevm.o cputlb.o
|
|
obj-$(CONFIG_HAVE_GET_MEMORY_MAPPING) += memory_mapping.o
|
|
obj-$(CONFIG_HAVE_CORE_DUMP) += dump.o
|
|
obj-$(CONFIG_NO_GET_MEMORY_MAPPING) += memory_mapping-stub.o
|
|
obj-$(CONFIG_NO_CORE_DUMP) += dump-stub.o
|
|
LIBS+=-lz
|
|
|
|
QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
|
|
QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
|
|
QEMU_CFLAGS += $(VNC_JPEG_CFLAGS)
|
|
QEMU_CFLAGS += $(VNC_PNG_CFLAGS)
|
|
|
|
# xen support
|
|
obj-$(CONFIG_XEN) += xen-all.o xen-mapcache.o
|
|
obj-$(CONFIG_NO_XEN) += xen-stub.o
|
|
|
|
# Hardware support
|
|
ifeq ($(TARGET_ARCH), sparc64)
|
|
obj-y += hw/sparc64/
|
|
else
|
|
obj-y += hw/$(TARGET_BASE_ARCH)/
|
|
endif
|
|
|
|
main.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
|
|
|
|
GENERATED_HEADERS += hmp-commands.h qmp-commands-old.h
|
|
|
|
endif # CONFIG_SOFTMMU
|
|
|
|
nested-vars += obj-y
|
|
|
|
# This resolves all nested paths, so it must come last
|
|
include $(SRC_PATH)/Makefile.objs
|
|
|
|
all-obj-y = $(obj-y)
|
|
all-obj-y += $(addprefix ../, $(universal-obj-y))
|
|
|
|
ifdef CONFIG_SOFTMMU
|
|
all-obj-y += $(addprefix ../, $(common-obj-y))
|
|
all-obj-y += $(addprefix ../libdis/, $(libdis-y))
|
|
all-obj-y += $(addprefix ../, $(trace-obj-y))
|
|
else
|
|
all-obj-y += $(addprefix ../libuser/, $(user-obj-y))
|
|
all-obj-y += $(addprefix ../libdis-user/, $(libdis-y))
|
|
endif #CONFIG_LINUX_USER
|
|
|
|
ifdef QEMU_PROGW
|
|
# The linker builds a windows executable. Make also a console executable.
|
|
$(QEMU_PROGW): $(all-obj-y) ../libqemustub.a
|
|
$(call LINK,$^)
|
|
$(QEMU_PROG): $(QEMU_PROGW)
|
|
$(call quiet-command,$(OBJCOPY) --subsystem console $(QEMU_PROGW) $(QEMU_PROG)," GEN $(TARGET_DIR)$(QEMU_PROG)")
|
|
else
|
|
$(QEMU_PROG): $(all-obj-y) ../libqemustub.a
|
|
$(call LINK,$^)
|
|
endif
|
|
|
|
gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/scripts/feature_to_c.sh
|
|
$(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES)," GEN $(TARGET_DIR)$@")
|
|
|
|
hmp-commands.h: $(SRC_PATH)/hmp-commands.hx
|
|
$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $(TARGET_DIR)$@")
|
|
|
|
qmp-commands-old.h: $(SRC_PATH)/qmp-commands.hx
|
|
$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $(TARGET_DIR)$@")
|
|
|
|
clean:
|
|
rm -f *.a *~ $(PROGS)
|
|
rm -f $(shell find . -name '*.[od]')
|
|
rm -f hmp-commands.h qmp-commands-old.h gdbstub-xml.c
|
|
ifdef CONFIG_TRACE_SYSTEMTAP
|
|
rm -f *.stp
|
|
endif
|
|
|
|
install: all
|
|
ifneq ($(PROGS),)
|
|
$(INSTALL) -m 755 $(PROGS) "$(DESTDIR)$(bindir)"
|
|
ifneq ($(STRIP),)
|
|
$(STRIP) $(patsubst %,"$(DESTDIR)$(bindir)/%",$(PROGS))
|
|
endif
|
|
endif
|
|
ifdef CONFIG_TRACE_SYSTEMTAP
|
|
$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset"
|
|
$(INSTALL_DATA) $(QEMU_PROG).stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset"
|
|
endif
|
|
|
|
GENERATED_HEADERS += config-target.h
|
|
Makefile: $(GENERATED_HEADERS)
|