1# -*- Mode: makefile -*- 2 3BUILD_DIR?=$(CURDIR)/.. 4 5include ../config-host.mak 6include config-target.mak 7include $(SRC_PATH)/rules.mak 8 9ifdef CONFIG_SOFTMMU 10include config-devices.mak 11endif 12 13$(call set-vpath, $(SRC_PATH):$(BUILD_DIR)) 14ifdef CONFIG_LINUX 15QEMU_CFLAGS += -I../linux-headers 16endif 17QEMU_CFLAGS += -iquote .. -iquote $(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H 18 19QEMU_CFLAGS+=-iquote $(SRC_PATH)/include 20 21ifdef CONFIG_USER_ONLY 22# user emulator name 23QEMU_PROG=qemu-$(TARGET_NAME) 24QEMU_PROG_BUILD = $(QEMU_PROG) 25else 26# system emulator name 27QEMU_PROG=qemu-system-$(TARGET_NAME)$(EXESUF) 28ifneq (,$(findstring -mwindows,$(SDL_LIBS))) 29# Terminate program name with a 'w' because the linker builds a windows executable. 30QEMU_PROGW=qemu-system-$(TARGET_NAME)w$(EXESUF) 31$(QEMU_PROG): $(QEMU_PROGW) 32 $(call quiet-command,$(OBJCOPY) --subsystem console $(QEMU_PROGW) $(QEMU_PROG),"GEN","$(TARGET_DIR)$(QEMU_PROG)") 33QEMU_PROG_BUILD = $(QEMU_PROGW) 34else 35QEMU_PROG_BUILD = $(QEMU_PROG) 36endif 37endif 38 39PROGS=$(QEMU_PROG) $(QEMU_PROGW) 40STPFILES= 41 42config-target.h: config-target.h-timestamp 43config-target.h-timestamp: config-target.mak 44 45config-devices.h: config-devices.h-timestamp 46config-devices.h-timestamp: config-devices.mak 47 48ifdef CONFIG_TRACE_SYSTEMTAP 49stap: $(QEMU_PROG).stp-installed $(QEMU_PROG).stp $(QEMU_PROG)-simpletrace.stp $(QEMU_PROG)-log.stp 50 51ifdef CONFIG_USER_ONLY 52TARGET_TYPE=user 53else 54TARGET_TYPE=system 55endif 56 57tracetool-y = $(SRC_PATH)/scripts/tracetool.py 58tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py") 59 60$(QEMU_PROG).stp-installed: $(BUILD_DIR)/trace-events-all $(tracetool-y) 61 $(call quiet-command,$(TRACETOOL) \ 62 --group=all \ 63 --format=stap \ 64 --backends=$(TRACE_BACKENDS) \ 65 --binary=$(bindir)/$(QEMU_PROG) \ 66 --target-name=$(TARGET_NAME) \ 67 --target-type=$(TARGET_TYPE) \ 68 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG).stp-installed") 69 70$(QEMU_PROG).stp: $(BUILD_DIR)/trace-events-all $(tracetool-y) 71 $(call quiet-command,$(TRACETOOL) \ 72 --group=all \ 73 --format=stap \ 74 --backends=$(TRACE_BACKENDS) \ 75 --binary=$(realpath .)/$(QEMU_PROG) \ 76 --target-name=$(TARGET_NAME) \ 77 --target-type=$(TARGET_TYPE) \ 78 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG).stp") 79 80$(QEMU_PROG)-simpletrace.stp: $(BUILD_DIR)/trace-events-all $(tracetool-y) 81 $(call quiet-command,$(TRACETOOL) \ 82 --group=all \ 83 --format=simpletrace-stap \ 84 --backends=$(TRACE_BACKENDS) \ 85 --probe-prefix=qemu.$(TARGET_TYPE).$(TARGET_NAME) \ 86 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG)-simpletrace.stp") 87 88$(QEMU_PROG)-log.stp: $(BUILD_DIR)/trace-events-all $(tracetool-y) 89 $(call quiet-command,$(TRACETOOL) \ 90 --group=all \ 91 --format=log-stap \ 92 --backends=$(TRACE_BACKENDS) \ 93 --probe-prefix=qemu.$(TARGET_TYPE).$(TARGET_NAME) \ 94 $< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG)-log.stp") 95 96else 97stap: 98endif 99.PHONY: stap 100 101all: $(PROGS) stap 102 103# Dummy command so that make thinks it has done something 104 @true 105 106obj-y += trace/ 107 108######################################################### 109# cpu emulator library 110obj-y += exec.o exec-vary.o 111obj-y += accel/ 112obj-$(CONFIG_TCG) += tcg/tcg.o tcg/tcg-op.o tcg/tcg-op-vec.o tcg/tcg-op-gvec.o 113obj-$(CONFIG_TCG) += tcg/tcg-common.o tcg/optimize.o 114obj-$(CONFIG_TCG_INTERPRETER) += tcg/tci.o 115obj-$(CONFIG_TCG_INTERPRETER) += disas/tci.o 116obj-$(CONFIG_TCG) += fpu/softfloat.o 117obj-y += target/$(TARGET_BASE_ARCH)/ 118obj-y += disas.o 119obj-$(call notempty,$(TARGET_XML_FILES)) += gdbstub-xml.o 120LIBS := $(libs_cpu) $(LIBS) 121 122obj-$(CONFIG_PLUGIN) += plugins/ 123 124######################################################### 125# Linux user emulator target 126 127ifdef CONFIG_LINUX_USER 128 129QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) \ 130 -I$(SRC_PATH)/linux-user/host/$(ARCH) \ 131 -I$(SRC_PATH)/linux-user 132 133obj-y += linux-user/ 134obj-y += gdbstub.o thunk.o 135 136endif #CONFIG_LINUX_USER 137 138######################################################### 139# BSD user emulator target 140 141ifdef CONFIG_BSD_USER 142 143QEMU_CFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ABI_DIR) \ 144 -I$(SRC_PATH)/bsd-user/$(HOST_VARIANT_DIR) 145 146obj-y += bsd-user/ 147obj-y += gdbstub.o 148 149endif #CONFIG_BSD_USER 150 151######################################################### 152# System emulator target 153ifdef CONFIG_SOFTMMU 154obj-y += arch_init.o cpus.o gdbstub.o balloon.o ioport.o 155obj-y += qtest.o 156obj-y += dump/ 157obj-y += hw/ 158obj-y += monitor/ 159obj-y += qapi/ 160obj-y += memory.o 161obj-y += memory_mapping.o 162obj-y += migration/ram.o 163LIBS := $(libs_softmmu) $(LIBS) 164 165# Hardware support 166ifeq ($(TARGET_NAME), sparc64) 167obj-y += hw/sparc64/ 168else 169obj-y += hw/$(TARGET_BASE_ARCH)/ 170endif 171 172generated-files-y += hmp-commands.h hmp-commands-info.h 173generated-files-y += config-devices.h 174 175endif # CONFIG_SOFTMMU 176 177dummy := $(call unnest-vars,,obj-y) 178all-obj-y := $(obj-y) 179 180include $(SRC_PATH)/Makefile.objs 181dummy := $(call unnest-vars,.., \ 182 authz-obj-y \ 183 block-obj-y \ 184 block-obj-m \ 185 chardev-obj-y \ 186 crypto-obj-y \ 187 crypto-user-obj-y \ 188 qom-obj-y \ 189 io-obj-y \ 190 common-obj-y \ 191 common-obj-m) 192all-obj-y += $(common-obj-y) 193all-obj-y += $(qom-obj-y) 194all-obj-$(CONFIG_SOFTMMU) += $(authz-obj-y) 195all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y) $(chardev-obj-y) 196all-obj-$(CONFIG_USER_ONLY) += $(crypto-user-obj-y) 197all-obj-$(CONFIG_SOFTMMU) += $(crypto-obj-y) 198all-obj-$(CONFIG_SOFTMMU) += $(io-obj-y) 199 200ifdef CONFIG_SOFTMMU 201$(QEMU_PROG_BUILD): config-devices.mak 202endif 203 204COMMON_LDADDS = ../libqemuutil.a 205 206# build either PROG or PROGW 207$(QEMU_PROG_BUILD): $(all-obj-y) $(COMMON_LDADDS) 208 $(call LINK, $(filter-out %.mak, $^)) 209ifdef CONFIG_DARWIN 210 $(call quiet-command,Rez -append $(SRC_PATH)/pc-bios/qemu.rsrc -o $@,"REZ","$(TARGET_DIR)$@") 211 $(call quiet-command,SetFile -a C $@,"SETFILE","$(TARGET_DIR)$@") 212endif 213 214gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/scripts/feature_to_c.sh 215 $(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES),"GEN","$(TARGET_DIR)$@") 216 217hmp-commands.h: $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/scripts/hxtool 218 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$(TARGET_DIR)$@") 219 220hmp-commands-info.h: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool 221 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$(TARGET_DIR)$@") 222 223clean: clean-target 224 rm -f *.a *~ $(PROGS) 225 rm -f $(shell find . -name '*.[od]') 226 rm -f hmp-commands.h gdbstub-xml.c 227 rm -f trace/generated-helpers.c trace/generated-helpers.c-timestamp 228ifdef CONFIG_TRACE_SYSTEMTAP 229 rm -f *.stp 230endif 231 232install: all 233ifneq ($(PROGS),) 234 $(call install-prog,$(PROGS),$(DESTDIR)$(bindir)) 235endif 236ifdef CONFIG_TRACE_SYSTEMTAP 237 $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset" 238 $(INSTALL_DATA) $(QEMU_PROG).stp-installed "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG).stp" 239 $(INSTALL_DATA) $(QEMU_PROG)-simpletrace.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-simpletrace.stp" 240 $(INSTALL_DATA) $(QEMU_PROG)-log.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-log.stp" 241endif 242 243generated-files-y += config-target.h 244Makefile: $(generated-files-y) 245 246# Reports/Analysis 247# 248# The target specific coverage report only cares about target specific 249# blobs and not the shared code. 250# 251 252%/coverage-report.html: 253 @mkdir -p $* 254 $(call quiet-command,\ 255 gcovr -r $(SRC_PATH) --object-directory $(CURDIR) \ 256 -p --html --html-details -o $@, \ 257 "GEN", "coverage-report.html") 258 259.PHONY: coverage-report 260coverage-report: $(CURDIR)/reports/coverage/coverage-report.html 261