This shows how to do some "computations" in meson.build using its array and dictionary data structures, and also a basic usage of the sourceset module for conditional compilation. Notice the new "if have_system" part of util/meson.build, which fixes a bug in the old build system was buggy: util/dbus.c was built even for non-softmmu builds, but the dependency on -lgio was lost when the linking was done through libqemuutil.a. Because all of its users required gio otherwise, the bug was hidden. Meson instead propagates libqemuutil's dependencies down to its users, and shows the problem. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
272 lines
7.9 KiB
Makefile
272 lines
7.9 KiB
Makefile
# -*- Mode: makefile -*-
|
|
|
|
BUILD_DIR?=$(CURDIR)/..
|
|
|
|
include ../config-host.mak
|
|
include config-target.mak
|
|
include $(SRC_PATH)/rules.mak
|
|
|
|
ifdef CONFIG_SOFTMMU
|
|
include config-devices.mak
|
|
endif
|
|
|
|
$(call set-vpath, $(SRC_PATH):$(BUILD_DIR))
|
|
ifdef CONFIG_LINUX
|
|
QEMU_CFLAGS += -isystem ../linux-headers
|
|
endif
|
|
QEMU_CFLAGS += -iquote .. -iquote $(SRC_PATH)/target/$(TARGET_BASE_ARCH) -DNEED_CPU_H
|
|
|
|
QEMU_CFLAGS+=-iquote $(SRC_PATH)/include
|
|
|
|
ifdef CONFIG_USER_ONLY
|
|
# user emulator name
|
|
QEMU_PROG=qemu-$(TARGET_NAME)
|
|
QEMU_PROG_BUILD = $(QEMU_PROG)
|
|
else
|
|
# system emulator name
|
|
QEMU_PROG=qemu-system-$(TARGET_NAME)$(EXESUF)
|
|
ifneq (,$(findstring -mwindows,$(SDL_LIBS)))
|
|
# Terminate program name with a 'w' because the linker builds a windows executable.
|
|
QEMU_PROGW=qemu-system-$(TARGET_NAME)w$(EXESUF)
|
|
$(QEMU_PROG): $(QEMU_PROGW)
|
|
$(call quiet-command,$(OBJCOPY) --subsystem console $(QEMU_PROGW) $(QEMU_PROG),"GEN","$(TARGET_DIR)$(QEMU_PROG)")
|
|
QEMU_PROG_BUILD = $(QEMU_PROGW)
|
|
else
|
|
QEMU_PROG_BUILD = $(QEMU_PROG)
|
|
endif
|
|
endif
|
|
|
|
PROGS=$(QEMU_PROG) $(QEMU_PROGW)
|
|
STPFILES=
|
|
|
|
config-target.h: config-target.h-timestamp
|
|
config-target.h-timestamp: config-target.mak
|
|
|
|
config-devices.h: config-devices.h-timestamp
|
|
config-devices.h-timestamp: config-devices.mak
|
|
|
|
ifdef CONFIG_TRACE_SYSTEMTAP
|
|
stap: $(QEMU_PROG).stp-installed $(QEMU_PROG).stp $(QEMU_PROG)-simpletrace.stp $(QEMU_PROG)-log.stp
|
|
|
|
ifdef CONFIG_USER_ONLY
|
|
TARGET_TYPE=user
|
|
else
|
|
TARGET_TYPE=system
|
|
endif
|
|
|
|
tracetool-y = $(SRC_PATH)/scripts/tracetool.py
|
|
tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py")
|
|
|
|
$(QEMU_PROG).stp-installed: $(BUILD_DIR)/trace/trace-events-all $(tracetool-y)
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--group=all \
|
|
--format=stap \
|
|
--backends=$(TRACE_BACKENDS) \
|
|
--binary=$(bindir)/$(QEMU_PROG) \
|
|
--target-name=$(TARGET_NAME) \
|
|
--target-type=$(TARGET_TYPE) \
|
|
$< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG).stp-installed")
|
|
|
|
$(QEMU_PROG).stp: $(BUILD_DIR)/trace/trace-events-all $(tracetool-y)
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--group=all \
|
|
--format=stap \
|
|
--backends=$(TRACE_BACKENDS) \
|
|
--binary=$(realpath .)/$(QEMU_PROG) \
|
|
--target-name=$(TARGET_NAME) \
|
|
--target-type=$(TARGET_TYPE) \
|
|
$< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG).stp")
|
|
|
|
$(QEMU_PROG)-simpletrace.stp: $(BUILD_DIR)/trace/trace-events-all $(tracetool-y)
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--group=all \
|
|
--format=simpletrace-stap \
|
|
--backends=$(TRACE_BACKENDS) \
|
|
--probe-prefix=qemu.$(TARGET_TYPE).$(TARGET_NAME) \
|
|
$< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG)-simpletrace.stp")
|
|
|
|
$(QEMU_PROG)-log.stp: $(BUILD_DIR)/trace/trace-events-all $(tracetool-y)
|
|
$(call quiet-command,$(TRACETOOL) \
|
|
--group=all \
|
|
--format=log-stap \
|
|
--backends=$(TRACE_BACKENDS) \
|
|
--probe-prefix=qemu.$(TARGET_TYPE).$(TARGET_NAME) \
|
|
$< > $@,"GEN","$(TARGET_DIR)$(QEMU_PROG)-log.stp")
|
|
|
|
else
|
|
stap:
|
|
endif
|
|
.PHONY: stap
|
|
|
|
all: $(PROGS) stap
|
|
|
|
# Dummy command so that make thinks it has done something
|
|
@true
|
|
|
|
obj-y += trace/
|
|
|
|
#########################################################
|
|
# cpu emulator library
|
|
obj-y += exec.o exec-vary.o
|
|
obj-y += accel/
|
|
obj-$(CONFIG_TCG) += tcg/tcg.o tcg/tcg-op.o tcg/tcg-op-vec.o tcg/tcg-op-gvec.o
|
|
obj-$(CONFIG_TCG) += tcg/tcg-common.o tcg/optimize.o
|
|
obj-$(CONFIG_TCG_INTERPRETER) += tcg/tci.o
|
|
obj-$(CONFIG_TCG_INTERPRETER) += disas/tci.o
|
|
obj-$(CONFIG_TCG) += fpu/softfloat.o
|
|
obj-y += target/$(TARGET_BASE_ARCH)/
|
|
obj-y += disas.o
|
|
obj-$(call notempty,$(TARGET_XML_FILES)) += gdbstub-xml.o
|
|
LIBS := $(libs_cpu) $(LIBS)
|
|
|
|
obj-$(CONFIG_PLUGIN) += plugins/
|
|
|
|
#########################################################
|
|
# Linux user emulator target
|
|
|
|
ifdef CONFIG_LINUX_USER
|
|
|
|
QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) \
|
|
-I$(SRC_PATH)/linux-user/host/$(ARCH) \
|
|
-I$(SRC_PATH)/linux-user \
|
|
-Ilinux-user/$(TARGET_ABI_DIR)
|
|
|
|
obj-y += linux-user/
|
|
obj-y += gdbstub.o thunk.o
|
|
|
|
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_ABI_DIR) \
|
|
-I$(SRC_PATH)/bsd-user/$(HOST_VARIANT_DIR)
|
|
|
|
obj-y += bsd-user/
|
|
obj-y += gdbstub.o
|
|
|
|
endif #CONFIG_BSD_USER
|
|
|
|
#########################################################
|
|
# System emulator target
|
|
ifdef CONFIG_SOFTMMU
|
|
obj-y += softmmu/
|
|
obj-y += gdbstub.o
|
|
obj-y += dump/
|
|
obj-y += hw/
|
|
obj-y += monitor/
|
|
obj-y += qapi/
|
|
obj-y += migration/ram.o
|
|
LIBS := $(libs_softmmu) $(LIBS)
|
|
|
|
# Hardware support
|
|
ifeq ($(TARGET_NAME), sparc64)
|
|
obj-y += hw/sparc64/
|
|
else
|
|
obj-y += hw/$(TARGET_BASE_ARCH)/
|
|
endif
|
|
|
|
generated-files-y += hmp-commands.h hmp-commands-info.h
|
|
generated-files-y += config-devices.h
|
|
|
|
endif # CONFIG_SOFTMMU
|
|
|
|
dummy := $(call unnest-vars,,obj-y)
|
|
all-obj-y := $(obj-y)
|
|
|
|
#
|
|
# common-obj-m has some crap here, probably as side effect from
|
|
# unnest-vars recursing into target directories to fill obj-y and not
|
|
# properly handling the -m case.
|
|
#
|
|
# Clear common-obj-m as workaround. Fixes suspious dependency errors
|
|
# when building devices as modules. A bit hackish, but should be ok
|
|
# as long as we do not have any target-specific modules.
|
|
#
|
|
# The meson-based build system currently in development doesn't need
|
|
# unnest-vars and will obsolete this workaround.
|
|
#
|
|
common-obj-m :=
|
|
|
|
include $(SRC_PATH)/Makefile.objs
|
|
dummy := $(call unnest-vars,.., \
|
|
authz-obj-y \
|
|
block-obj-y \
|
|
block-obj-m \
|
|
chardev-obj-y \
|
|
crypto-obj-y \
|
|
qom-obj-y \
|
|
io-obj-y \
|
|
common-obj-y \
|
|
common-obj-m)
|
|
all-obj-y += $(common-obj-y)
|
|
all-obj-y += $(qom-obj-y)
|
|
all-obj-$(CONFIG_SOFTMMU) += $(authz-obj-y)
|
|
all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y) $(chardev-obj-y)
|
|
all-obj-$(CONFIG_SOFTMMU) += $(crypto-obj-y)
|
|
all-obj-$(CONFIG_SOFTMMU) += $(io-obj-y)
|
|
|
|
ifdef CONFIG_SOFTMMU
|
|
$(QEMU_PROG_BUILD): config-devices.mak
|
|
endif
|
|
|
|
COMMON_LDADDS = ../libqemuutil.a
|
|
|
|
# build either PROG or PROGW
|
|
$(QEMU_PROG_BUILD): $(all-obj-y) $(COMMON_LDADDS) $(softmmu-main-y)
|
|
$(call LINK, $(filter-out %.mak, $^))
|
|
ifdef CONFIG_DARWIN
|
|
$(call quiet-command,Rez -append $(SRC_PATH)/pc-bios/qemu.rsrc -o $@,"REZ","$(TARGET_DIR)$@")
|
|
$(call quiet-command,SetFile -a C $@,"SETFILE","$(TARGET_DIR)$@")
|
|
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 $(SRC_PATH)/scripts/hxtool
|
|
$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$(TARGET_DIR)$@")
|
|
|
|
hmp-commands-info.h: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool
|
|
$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$(TARGET_DIR)$@")
|
|
|
|
clean: clean-target
|
|
rm -f *.a *~ $(PROGS)
|
|
rm -f $(shell find . -name '*.[od]')
|
|
rm -f hmp-commands.h gdbstub-xml.c
|
|
rm -f trace/generated-helpers.c trace/generated-helpers.c-timestamp
|
|
ifdef CONFIG_TRACE_SYSTEMTAP
|
|
rm -f *.stp
|
|
endif
|
|
|
|
ifdef CONFIG_FUZZ
|
|
include $(SRC_PATH)/tests/qtest/fuzz/Makefile.include
|
|
include $(SRC_PATH)/tests/qtest/Makefile.include
|
|
|
|
fuzz: fuzz-vars
|
|
fuzz-vars: QEMU_CFLAGS := $(FUZZ_CFLAGS) $(QEMU_CFLAGS)
|
|
fuzz-vars: QEMU_LDFLAGS := $(FUZZ_LDFLAGS) $(QEMU_LDFLAGS)
|
|
fuzz-vars: $(QEMU_PROG_FUZZ)
|
|
dummy := $(call unnest-vars,, fuzz-obj-y)
|
|
|
|
|
|
$(QEMU_PROG_FUZZ): config-devices.mak $(all-obj-y) $(COMMON_LDADDS) $(fuzz-obj-y)
|
|
$(call LINK, $(filter-out %.mak, $^))
|
|
|
|
endif
|
|
|
|
install: all
|
|
ifneq ($(PROGS),)
|
|
$(call install-prog,$(PROGS),$(DESTDIR)$(bindir))
|
|
endif
|
|
ifdef CONFIG_TRACE_SYSTEMTAP
|
|
$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset"
|
|
$(INSTALL_DATA) $(QEMU_PROG).stp-installed "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG).stp"
|
|
$(INSTALL_DATA) $(QEMU_PROG)-simpletrace.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-simpletrace.stp"
|
|
$(INSTALL_DATA) $(QEMU_PROG)-log.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-log.stp"
|
|
endif
|
|
|
|
generated-files-y += config-target.h
|
|
Makefile: $(generated-files-y)
|