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