qemu/Makefile
<<
>>
Prefs
   1# Makefile for QEMU.
   2
   3# Always point to the root of the build tree (needs GNU make).
   4BUILD_DIR=$(CURDIR)
   5
   6# Before including a proper config-host.mak, assume we are in the source tree
   7SRC_PATH=.
   8
   9UNCHECKED_GOALS := %clean TAGS cscope ctags docker docker-%
  10
  11# All following code might depend on configuration variables
  12ifneq ($(wildcard config-host.mak),)
  13# Put the all: rule here so that config-host.mak can contain dependencies.
  14all:
  15include config-host.mak
  16
  17# Check that we're not trying to do an out-of-tree build from
  18# a tree that's been used for an in-tree build.
  19ifneq ($(realpath $(SRC_PATH)),$(realpath .))
  20ifneq ($(wildcard $(SRC_PATH)/config-host.mak),)
  21$(error This is an out of tree build but your source tree ($(SRC_PATH)) \
  22seems to have been used for an in-tree build. You can fix this by running \
  23"make distclean && rm -rf *-linux-user *-softmmu" in your source tree)
  24endif
  25endif
  26
  27CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
  28CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
  29CONFIG_XEN := $(CONFIG_XEN_BACKEND)
  30CONFIG_ALL=y
  31-include config-all-devices.mak
  32-include config-all-disas.mak
  33
  34config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios
  35        @echo $@ is out-of-date, running configure
  36        @# TODO: The next lines include code which supports a smooth
  37        @# transition from old configurations without config.status.
  38        @# This code can be removed after QEMU 1.7.
  39        @if test -x config.status; then \
  40            ./config.status; \
  41        else \
  42            sed -n "/.*Configured with/s/[^:]*: //p" $@ | sh; \
  43        fi
  44else
  45config-host.mak:
  46ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
  47        @echo "Please call configure before running make!"
  48        @exit 1
  49endif
  50endif
  51
  52include $(SRC_PATH)/rules.mak
  53
  54GENERATED_FILES = qemu-version.h config-host.h qemu-options.def
  55GENERATED_FILES += qmp-commands.h qapi-types.h qapi-visit.h qapi-event.h
  56GENERATED_FILES += qmp-marshal.c qapi-types.c qapi-visit.c qapi-event.c
  57GENERATED_FILES += qmp-introspect.h
  58GENERATED_FILES += qmp-introspect.c
  59
  60GENERATED_FILES += trace/generated-tcg-tracers.h
  61
  62GENERATED_FILES += trace/generated-helpers-wrappers.h
  63GENERATED_FILES += trace/generated-helpers.h
  64GENERATED_FILES += trace/generated-helpers.c
  65
  66ifdef CONFIG_TRACE_UST
  67GENERATED_FILES += trace-ust-all.h
  68GENERATED_FILES += trace-ust-all.c
  69endif
  70
  71GENERATED_FILES += module_block.h
  72
  73TRACE_HEADERS = trace-root.h $(trace-events-subdirs:%=%/trace.h)
  74TRACE_SOURCES = trace-root.c $(trace-events-subdirs:%=%/trace.c)
  75TRACE_DTRACE =
  76ifdef CONFIG_TRACE_DTRACE
  77TRACE_HEADERS += trace-dtrace-root.h $(trace-events-subdirs:%=%/trace-dtrace.h)
  78TRACE_DTRACE += trace-dtrace-root.dtrace $(trace-events-subdirs:%=%/trace-dtrace.dtrace)
  79endif
  80ifdef CONFIG_TRACE_UST
  81TRACE_HEADERS += trace-ust-root.h $(trace-events-subdirs:%=%/trace-ust.h)
  82endif
  83
  84GENERATED_FILES += $(TRACE_HEADERS)
  85GENERATED_FILES += $(TRACE_SOURCES)
  86GENERATED_FILES += $(BUILD_DIR)/trace-events-all
  87
  88trace-group-name = $(shell dirname $1 | sed -e 's/[^a-zA-Z0-9]/_/g')
  89
  90tracetool-y = $(SRC_PATH)/scripts/tracetool.py
  91tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py")
  92
  93%/trace.h: %/trace.h-timestamp
  94        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
  95%/trace.h-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y)
  96        $(call quiet-command,$(TRACETOOL) \
  97                --group=$(call trace-group-name,$@) \
  98                --format=h \
  99                --backends=$(TRACE_BACKENDS) \
 100                $< > $@,"GEN","$(@:%-timestamp=%)")
 101
 102%/trace.c: %/trace.c-timestamp
 103        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 104%/trace.c-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y)
 105        $(call quiet-command,$(TRACETOOL) \
 106                --group=$(call trace-group-name,$@) \
 107                --format=c \
 108                --backends=$(TRACE_BACKENDS) \
 109                $< > $@,"GEN","$(@:%-timestamp=%)")
 110
 111%/trace-ust.h: %/trace-ust.h-timestamp
 112        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 113%/trace-ust.h-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y)
 114        $(call quiet-command,$(TRACETOOL) \
 115                --group=$(call trace-group-name,$@) \
 116                --format=ust-events-h \
 117                --backends=$(TRACE_BACKENDS) \
 118                $< > $@,"GEN","$(@:%-timestamp=%)")
 119
 120%/trace-dtrace.dtrace: %/trace-dtrace.dtrace-timestamp
 121        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 122%/trace-dtrace.dtrace-timestamp: $(SRC_PATH)/%/trace-events $(BUILD_DIR)/config-host.mak $(tracetool-y)
 123        $(call quiet-command,$(TRACETOOL) \
 124                --group=$(call trace-group-name,$@) \
 125                --format=d \
 126                --backends=$(TRACE_BACKENDS) \
 127                $< > $@,"GEN","$(@:%-timestamp=%)")
 128
 129%/trace-dtrace.h: %/trace-dtrace.dtrace $(tracetool-y)
 130        $(call quiet-command,dtrace -o $@ -h -s $<, "GEN","$@")
 131
 132%/trace-dtrace.o: %/trace-dtrace.dtrace $(tracetool-y)
 133
 134
 135trace-root.h: trace-root.h-timestamp
 136        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 137trace-root.h-timestamp: $(SRC_PATH)/trace-events $(tracetool-y)
 138        $(call quiet-command,$(TRACETOOL) \
 139                --group=root \
 140                --format=h \
 141                --backends=$(TRACE_BACKENDS) \
 142                $< > $@,"GEN","$(@:%-timestamp=%)")
 143
 144trace-root.c: trace-root.c-timestamp
 145        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 146trace-root.c-timestamp: $(SRC_PATH)/trace-events $(tracetool-y)
 147        $(call quiet-command,$(TRACETOOL) \
 148                --group=root \
 149                --format=c \
 150                --backends=$(TRACE_BACKENDS) \
 151                $< > $@,"GEN","$(@:%-timestamp=%)")
 152
 153trace-ust-root.h: trace-ust-root.h-timestamp
 154        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 155trace-ust-root.h-timestamp: $(SRC_PATH)/trace-events $(tracetool-y)
 156        $(call quiet-command,$(TRACETOOL) \
 157                --group=root \
 158                --format=ust-events-h \
 159                --backends=$(TRACE_BACKENDS) \
 160                $< > $@,"GEN","$(@:%-timestamp=%)")
 161
 162trace-ust-all.h: trace-ust-all.h-timestamp
 163        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 164trace-ust-all.h-timestamp: $(trace-events-files) $(tracetool-y)
 165        $(call quiet-command,$(TRACETOOL) \
 166                --group=all \
 167                --format=ust-events-h \
 168                --backends=$(TRACE_BACKENDS) \
 169                $(trace-events-files) > $@,"GEN","$(@:%-timestamp=%)")
 170
 171trace-ust-all.c: trace-ust-all.c-timestamp
 172        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 173trace-ust-all.c-timestamp: $(trace-events-files) $(tracetool-y)
 174        $(call quiet-command,$(TRACETOOL) \
 175                --group=all \
 176                --format=ust-events-c \
 177                --backends=$(TRACE_BACKENDS) \
 178                $(trace-events-files) > $@,"GEN","$(@:%-timestamp=%)")
 179
 180trace-dtrace-root.dtrace: trace-dtrace-root.dtrace-timestamp
 181        @cmp $< $@ >/dev/null 2>&1 || cp $< $@
 182trace-dtrace-root.dtrace-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak $(tracetool-y)
 183        $(call quiet-command,$(TRACETOOL) \
 184                --group=root \
 185                --format=d \
 186                --backends=$(TRACE_BACKENDS) \
 187                $< > $@,"GEN","$(@:%-timestamp=%)")
 188
 189trace-dtrace-root.h: trace-dtrace-root.dtrace
 190        $(call quiet-command,dtrace -o $@ -h -s $<, "GEN","$@")
 191
 192trace-dtrace-root.o: trace-dtrace-root.dtrace
 193
 194# Don't try to regenerate Makefile or configure
 195# We don't generate any of them
 196Makefile: ;
 197configure: ;
 198
 199.PHONY: all clean cscope distclean html info install install-doc \
 200        pdf txt recurse-all speed test dist msi FORCE
 201
 202$(call set-vpath, $(SRC_PATH))
 203
 204LIBS+=-lz $(LIBS_TOOLS)
 205
 206HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF)
 207
 208ifdef BUILD_DOCS
 209DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8
 210DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7
 211DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7
 212ifdef CONFIG_VIRTFS
 213DOCS+=fsdev/virtfs-proxy-helper.1
 214endif
 215else
 216DOCS=
 217endif
 218
 219SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory) BUILD_DIR=$(BUILD_DIR)
 220SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS))
 221SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_DIRS))
 222
 223ifeq ($(SUBDIR_DEVICES_MAK),)
 224config-all-devices.mak:
 225        $(call quiet-command,echo '# no devices' > $@,"GEN","$@")
 226else
 227config-all-devices.mak: $(SUBDIR_DEVICES_MAK)
 228        $(call quiet-command, sed -n \
 229             's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
 230             $(SUBDIR_DEVICES_MAK) | sort -u > $@, \
 231             "GEN","$@")
 232endif
 233
 234-include $(SUBDIR_DEVICES_MAK_DEP)
 235
 236%/config-devices.mak: default-configs/%.mak $(SRC_PATH)/scripts/make_device_config.sh
 237        $(call quiet-command, \
 238            $(SHELL) $(SRC_PATH)/scripts/make_device_config.sh $< $*-config-devices.mak.d $@ > $@.tmp,"GEN","$@.tmp")
 239        $(call quiet-command, if test -f $@; then \
 240          if cmp -s $@.old $@; then \
 241            mv $@.tmp $@; \
 242            cp -p $@ $@.old; \
 243          else \
 244            if test -f $@.old; then \
 245              echo "WARNING: $@ (user modified) out of date.";\
 246            else \
 247              echo "WARNING: $@ out of date.";\
 248            fi; \
 249            echo "Run \"make defconfig\" to regenerate."; \
 250            rm $@.tmp; \
 251          fi; \
 252         else \
 253          mv $@.tmp $@; \
 254          cp -p $@ $@.old; \
 255         fi,"GEN","$@");
 256
 257defconfig:
 258        rm -f config-all-devices.mak $(SUBDIR_DEVICES_MAK)
 259
 260ifneq ($(wildcard config-host.mak),)
 261include $(SRC_PATH)/Makefile.objs
 262endif
 263
 264dummy := $(call unnest-vars,, \
 265                stub-obj-y \
 266                chardev-obj-y \
 267                util-obj-y \
 268                qga-obj-y \
 269                ivshmem-client-obj-y \
 270                ivshmem-server-obj-y \
 271                libvhost-user-obj-y \
 272                vhost-user-scsi-obj-y \
 273                qga-vss-dll-obj-y \
 274                block-obj-y \
 275                block-obj-m \
 276                crypto-obj-y \
 277                crypto-aes-obj-y \
 278                qom-obj-y \
 279                io-obj-y \
 280                common-obj-y \
 281                common-obj-m \
 282                trace-obj-y)
 283
 284include $(SRC_PATH)/tests/Makefile.include
 285
 286all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
 287
 288qemu-version.h: FORCE
 289        $(call quiet-command, \
 290                (cd $(SRC_PATH); \
 291                printf '#define QEMU_PKGVERSION '; \
 292                if test -n "$(PKGVERSION)"; then \
 293                        printf '"$(PKGVERSION)"\n'; \
 294                else \
 295                        if test -d .git; then \
 296                                printf '" ('; \
 297                                git describe --match 'v*' 2>/dev/null | tr -d '\n'; \
 298                                if ! git diff-index --quiet HEAD &>/dev/null; then \
 299                                        printf -- '-dirty'; \
 300                                fi; \
 301                                printf ')"\n'; \
 302                        else \
 303                                printf '""\n'; \
 304                        fi; \
 305                fi) > $@.tmp)
 306        $(call quiet-command, if ! cmp -s $@ $@.tmp; then \
 307          mv $@.tmp $@; \
 308         else \
 309          rm $@.tmp; \
 310         fi)
 311
 312config-host.h: config-host.h-timestamp
 313config-host.h-timestamp: config-host.mak
 314qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
 315        $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
 316
 317SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
 318SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))
 319
 320$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
 321$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
 322$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
 323$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
 324
 325subdir-%:
 326        $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
 327
 328subdir-pixman: pixman/Makefile
 329        $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pixman V="$(V)" all,)
 330
 331pixman/Makefile: $(SRC_PATH)/pixman/configure
 332        (cd pixman; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) --disable-gtk --disable-shared --enable-static)
 333
 334$(SRC_PATH)/pixman/configure:
 335        (cd $(SRC_PATH)/pixman; autoreconf -v --install)
 336
 337DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
 338DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
 339DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
 340
 341subdir-dtc:dtc/libfdt dtc/tests
 342        $(call quiet-command,$(MAKE) $(DTC_MAKE_ARGS) CPPFLAGS="$(DTC_CPPFLAGS)" CFLAGS="$(DTC_CFLAGS)" LDFLAGS="$(LDFLAGS)" ARFLAGS="$(ARFLAGS)" CC="$(CC)" AR="$(AR)" LD="$(LD)" $(SUBDIR_MAKEFLAGS) libfdt/libfdt.a,)
 343
 344dtc/%:
 345        mkdir -p $@
 346
 347$(SUBDIR_RULES): libqemuutil.a libqemustub.a $(common-obj-y) $(chardev-obj-y) \
 348        $(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY))
 349
 350ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
 351# Only keep -O and -g cflags
 352romsubdir-%:
 353        $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/" CFLAGS="$(filter -O% -g%,$(CFLAGS))",)
 354
 355ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
 356
 357recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
 358
 359$(BUILD_DIR)/version.o: $(SRC_PATH)/version.rc config-host.h
 360        $(call quiet-command,$(WINDRES) -I$(BUILD_DIR) -o $@ $<,"RC","version.o")
 361
 362Makefile: $(version-obj-y)
 363
 364######################################################################
 365# Build libraries
 366
 367libqemustub.a: $(stub-obj-y)
 368libqemuutil.a: $(util-obj-y) $(trace-obj-y)
 369
 370######################################################################
 371
 372COMMON_LDADDS = libqemuutil.a libqemustub.a
 373
 374qemu-img.o: qemu-img-cmds.h
 375
 376qemu-img$(EXESUF): qemu-img.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
 377qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
 378qemu-io$(EXESUF): qemu-io.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
 379
 380qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
 381
 382fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
 383fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap
 384
 385qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
 386        $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
 387
 388qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
 389qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
 390
 391gen-out-type = $(subst .,-,$(suffix $@))
 392
 393qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py
 394
 395qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h :\
 396$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
 397        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
 398                $(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
 399                "GEN","$@")
 400qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h :\
 401$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
 402        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
 403                $(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
 404                "GEN","$@")
 405qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c :\
 406$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
 407        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
 408                $(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
 409                "GEN","$@")
 410
 411qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
 412               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
 413               $(SRC_PATH)/qapi/event.json $(SRC_PATH)/qapi/introspect.json \
 414               $(SRC_PATH)/qapi/crypto.json $(SRC_PATH)/qapi/rocker.json \
 415               $(SRC_PATH)/qapi/trace.json
 416
 417qapi-types.c qapi-types.h :\
 418$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
 419        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
 420                $(gen-out-type) -o "." -b $<, \
 421                "GEN","$@")
 422qapi-visit.c qapi-visit.h :\
 423$(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
 424        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
 425                $(gen-out-type) -o "." -b $<, \
 426                "GEN","$@")
 427qapi-event.c qapi-event.h :\
 428$(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
 429        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py \
 430                $(gen-out-type) -o "." $<, \
 431                "GEN","$@")
 432qmp-commands.h qmp-marshal.c :\
 433$(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
 434        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
 435                $(gen-out-type) -o "." $<, \
 436                "GEN","$@")
 437qmp-introspect.h qmp-introspect.c :\
 438$(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
 439        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-introspect.py \
 440                $(gen-out-type) -o "." $<, \
 441                "GEN","$@")
 442
 443QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
 444$(qga-obj-y): $(QGALIB_GEN)
 445
 446qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
 447        $(call LINK, $^)
 448
 449ifdef QEMU_GA_MSI_ENABLED
 450QEMU_GA_MSI=qemu-ga-$(ARCH).msi
 451
 452msi: $(QEMU_GA_MSI)
 453
 454$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
 455
 456$(QEMU_GA_MSI): config-host.mak
 457
 458$(QEMU_GA_MSI):  $(SRC_PATH)/qga/installer/qemu-ga.wxs
 459        $(call quiet-command,QEMU_GA_VERSION="$(QEMU_GA_VERSION)" QEMU_GA_MANUFACTURER="$(QEMU_GA_MANUFACTURER)" QEMU_GA_DISTRO="$(QEMU_GA_DISTRO)" BUILD_DIR="$(BUILD_DIR)" \
 460        wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
 461else
 462msi:
 463        @echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
 464endif
 465
 466ifneq ($(EXESUF),)
 467.PHONY: qemu-ga
 468qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
 469endif
 470
 471ifdef CONFIG_IVSHMEM
 472ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
 473        $(call LINK, $^)
 474ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
 475        $(call LINK, $^)
 476endif
 477vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y)
 478        $(call LINK, $^)
 479
 480module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak
 481        $(call quiet-command,$(PYTHON) $< $@ \
 482        $(addprefix $(SRC_PATH)/,$(patsubst %.mo,%.c,$(block-obj-m))), \
 483        "GEN","$@")
 484
 485clean:
 486# avoid old build problems by removing potentially incorrect old files
 487        rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
 488        rm -f qemu-options.def
 489        rm -f *.msi
 490        find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} +
 491        rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
 492        rm -f fsdev/*.pod
 493        rm -f qemu-img-cmds.h
 494        rm -f ui/shader/*-vert.h ui/shader/*-frag.h
 495        @# May not be present in GENERATED_FILES
 496        rm -f trace/generated-tracers-dtrace.dtrace*
 497        rm -f trace/generated-tracers-dtrace.h*
 498        rm -f $(foreach f,$(GENERATED_FILES),$(f) $(f)-timestamp)
 499        rm -rf qapi-generated
 500        rm -rf qga/qapi-generated
 501        for d in $(ALL_SUBDIRS); do \
 502        if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \
 503        rm -f $$d/qemu-options.def; \
 504        done
 505        rm -f $(SUBDIR_DEVICES_MAK) config-all-devices.mak
 506
 507VERSION ?= $(shell cat VERSION)
 508
 509dist: qemu-$(VERSION).tar.bz2
 510
 511qemu-%.tar.bz2:
 512        $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)"
 513
 514distclean: clean
 515        rm -f config-host.mak config-host.h* config-host.ld $(DOCS) qemu-options.texi qemu-img-cmds.texi qemu-monitor.texi qemu-monitor-info.texi
 516        rm -f config-all-devices.mak config-all-disas.mak config.status
 517        rm -f po/*.mo tests/qemu-iotests/common.env
 518        rm -f roms/seabios/config.mak roms/vgabios/config.mak
 519        rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps
 520        rm -f qemu-doc.fn qemu-doc.fns qemu-doc.info qemu-doc.ky qemu-doc.kys
 521        rm -f qemu-doc.log qemu-doc.pdf qemu-doc.pg qemu-doc.toc qemu-doc.tp
 522        rm -f qemu-doc.vr qemu-doc.txt
 523        rm -f config.log
 524        rm -f linux-headers/asm
 525        rm -f docs/version.texi
 526        rm -f docs/interop/qemu-ga-qapi.texi docs/interop/qemu-qmp-qapi.texi
 527        rm -f docs/interop/qemu-qmp-ref.7 docs/interop/qemu-ga-ref.7
 528        rm -f docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt
 529        rm -f docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf
 530        rm -f docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html
 531        for d in $(TARGET_DIRS); do \
 532        rm -rf $$d || exit 1 ; \
 533        done
 534        rm -Rf .sdk
 535        if test -f pixman/config.log; then $(MAKE) -C pixman distclean; fi
 536        if test -f dtc/version_gen.h; then $(MAKE) $(DTC_MAKE_ARGS) clean; fi
 537
 538KEYMAPS=da     en-gb  et  fr     fr-ch  is  lt  modifiers  no  pt-br  sv \
 539ar      de     en-us  fi  fr-be  hr     it  lv  nl         pl  ru     th \
 540common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
 541bepo    cz
 542
 543ifdef INSTALL_BLOBS
 544BLOBS=bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \
 545vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin \
 546acpi-dsdt.aml \
 547ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin \
 548pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
 549pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
 550efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
 551efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
 552efi-e1000e.rom efi-vmxnet3.rom \
 553qemu-icon.bmp qemu_logo_no_text.svg \
 554bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
 555multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
 556s390-ccw.img s390-netboot.img \
 557spapr-rtas.bin slof.bin skiboot.lid \
 558palcode-clipper \
 559u-boot.e500 \
 560qemu_vga.ndrv
 561else
 562BLOBS=
 563endif
 564
 565install-doc: $(DOCS)
 566        $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
 567        $(INSTALL_DATA) qemu-doc.html "$(DESTDIR)$(qemu_docdir)"
 568        $(INSTALL_DATA) qemu-doc.txt "$(DESTDIR)$(qemu_docdir)"
 569        $(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
 570        $(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
 571ifdef CONFIG_POSIX
 572        $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
 573        $(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
 574        $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
 575        $(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
 576ifneq ($(TOOLS),)
 577        $(INSTALL_DATA) qemu-img.1 "$(DESTDIR)$(mandir)/man1"
 578        $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
 579        $(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
 580endif
 581ifneq (,$(findstring qemu-ga,$(TOOLS)))
 582        $(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
 583        $(INSTALL_DATA) docs/interop/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)"
 584        $(INSTALL_DATA) docs/interop/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)"
 585        $(INSTALL_DATA) docs/interop/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7"
 586endif
 587endif
 588ifdef CONFIG_VIRTFS
 589        $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
 590        $(INSTALL_DATA) fsdev/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
 591endif
 592
 593install-datadir:
 594        $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)"
 595
 596install-localstatedir:
 597ifdef CONFIG_POSIX
 598ifneq (,$(findstring qemu-ga,$(TOOLS)))
 599        $(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
 600endif
 601endif
 602
 603
 604install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstatedir
 605ifneq ($(TOOLS),)
 606        $(call install-prog,$(subst qemu-ga,qemu-ga$(EXESUF),$(TOOLS)),$(DESTDIR)$(bindir))
 607endif
 608ifneq ($(CONFIG_MODULES),)
 609        $(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
 610        for s in $(modules-m:.mo=$(DSOSUF)); do \
 611                t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
 612                $(INSTALL_LIB) $$s "$$t"; \
 613                test -z "$(STRIP)" || $(STRIP) "$$t"; \
 614        done
 615endif
 616ifneq ($(HELPERS-y),)
 617        $(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
 618endif
 619ifneq ($(BLOBS),)
 620        set -e; for x in $(BLOBS); do \
 621                $(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
 622        done
 623endif
 624ifeq ($(CONFIG_GTK),y)
 625        $(MAKE) -C po $@
 626endif
 627        $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
 628        set -e; for x in $(KEYMAPS); do \
 629                $(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
 630        done
 631        $(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
 632        for d in $(TARGET_DIRS); do \
 633        $(MAKE) $(SUBDIR_MAKEFLAGS) TARGET_DIR=$$d/ -C $$d $@ || exit 1 ; \
 634        done
 635
 636# various test targets
 637test speed: all
 638        $(MAKE) -C tests/tcg $@
 639
 640.PHONY: ctags
 641ctags:
 642        rm -f tags
 643        find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +
 644
 645.PHONY: TAGS
 646TAGS:
 647        rm -f TAGS
 648        find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
 649
 650cscope:
 651        rm -f "$(SRC_PATH)"/cscope.*
 652        find "$(SRC_PATH)/" -name "*.[chsS]" -print | sed 's,^\./,,' > "$(SRC_PATH)/cscope.files"
 653        cscope -b -i"$(SRC_PATH)/cscope.files"
 654
 655# opengl shader programs
 656ui/shader/%-vert.h: $(SRC_PATH)/ui/shader/%.vert $(SRC_PATH)/scripts/shaderinclude.pl
 657        @mkdir -p $(dir $@)
 658        $(call quiet-command,\
 659                perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
 660                "VERT","$@")
 661
 662ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclude.pl
 663        @mkdir -p $(dir $@)
 664        $(call quiet-command,\
 665                perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
 666                "FRAG","$@")
 667
 668ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
 669        ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h
 670
 671# documentation
 672MAKEINFO=makeinfo
 673MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
 674MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
 675TEXI2PODFLAGS=$(MAKEINFOINCLUDES) "-DVERSION=$(VERSION)"
 676TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
 677
 678docs/version.texi: $(SRC_PATH)/VERSION
 679        $(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")
 680
 681%.html: %.texi docs/version.texi
 682        $(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
 683        --html $< -o $@,"GEN","$@")
 684
 685%.info: %.texi docs/version.texi
 686        $(call quiet-command,$(MAKEINFO) $(MAKEINFOFLAGS) $< -o $@,"GEN","$@")
 687
 688%.txt: %.texi docs/version.texi
 689        $(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
 690        --plaintext $< -o $@,"GEN","$@")
 691
 692%.pdf: %.texi docs/version.texi
 693        $(call quiet-command,texi2pdf $(TEXI2PDFFLAGS) $< -o $@,"GEN","$@")
 694
 695qemu-options.texi: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
 696        $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
 697
 698qemu-monitor.texi: $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/scripts/hxtool
 699        $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
 700
 701qemu-monitor-info.texi: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool
 702        $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
 703
 704qemu-img-cmds.texi: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
 705        $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
 706
 707docs/interop/qemu-qmp-qapi.texi docs/interop/qemu-ga-qapi.texi: $(SRC_PATH)/scripts/qapi2texi.py $(qapi-py)
 708
 709docs/interop/qemu-qmp-qapi.texi: $(qapi-modules)
 710        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")
 711
 712docs/interop/qemu-ga-qapi.texi: $(SRC_PATH)/qga/qapi-schema.json
 713        $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")
 714
 715qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
 716qemu.1: qemu-option-trace.texi
 717qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
 718fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
 719qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
 720qemu-ga.8: qemu-ga.texi
 721
 722html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html
 723info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info
 724pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf
 725txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt
 726
 727qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
 728        qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
 729        qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
 730        qemu-monitor-info.texi
 731
 732docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \
 733    docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \
 734    docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \
 735        docs/interop/qemu-ga-ref.texi docs/interop/qemu-ga-qapi.texi
 736
 737docs/interop/qemu-qmp-ref.dvi docs/interop/qemu-qmp-ref.html \
 738    docs/interop/qemu-qmp-ref.info docs/interop/qemu-qmp-ref.pdf \
 739    docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7: \
 740        docs/interop/qemu-qmp-ref.texi docs/interop/qemu-qmp-qapi.texi
 741
 742
 743ifdef CONFIG_WIN32
 744
 745INSTALLER = qemu-setup-$(VERSION)$(EXESUF)
 746
 747nsisflags = -V2 -NOCD
 748
 749ifneq ($(wildcard $(SRC_PATH)/dll),)
 750ifeq ($(ARCH),x86_64)
 751# 64 bit executables
 752DLL_PATH = $(SRC_PATH)/dll/w64
 753nsisflags += -DW64
 754else
 755# 32 bit executables
 756DLL_PATH = $(SRC_PATH)/dll/w32
 757endif
 758endif
 759
 760.PHONY: installer
 761installer: $(INSTALLER)
 762
 763INSTDIR=/tmp/qemu-nsis
 764
 765$(INSTALLER): $(SRC_PATH)/qemu.nsi
 766        $(MAKE) install prefix=${INSTDIR}
 767ifdef SIGNCODE
 768        (cd ${INSTDIR}; \
 769         for i in *.exe; do \
 770           $(SIGNCODE) $${i}; \
 771         done \
 772        )
 773endif # SIGNCODE
 774        (cd ${INSTDIR}; \
 775         for i in qemu-system-*.exe; do \
 776           arch=$${i%.exe}; \
 777           arch=$${arch#qemu-system-}; \
 778           echo Section \"$$arch\" Section_$$arch; \
 779           echo SetOutPath \"\$$INSTDIR\"; \
 780           echo File \"\$${BINDIR}\\$$i\"; \
 781           echo SectionEnd; \
 782         done \
 783        ) >${INSTDIR}/system-emulations.nsh
 784        makensis $(nsisflags) \
 785                $(if $(BUILD_DOCS),-DCONFIG_DOCUMENTATION="y") \
 786                $(if $(CONFIG_GTK),-DCONFIG_GTK="y") \
 787                -DBINDIR="${INSTDIR}" \
 788                $(if $(DLL_PATH),-DDLLDIR="$(DLL_PATH)") \
 789                -DSRCDIR="$(SRC_PATH)" \
 790                -DOUTFILE="$(INSTALLER)" \
 791                -DDISPLAYVERSION="$(VERSION)" \
 792                $(SRC_PATH)/qemu.nsi
 793        rm -r ${INSTDIR}
 794ifdef SIGNCODE
 795        $(SIGNCODE) $(INSTALLER)
 796endif # SIGNCODE
 797endif # CONFIG_WIN
 798
 799# Add a dependency on the generated files, so that they are always
 800# rebuilt before other object files
 801ifneq ($(wildcard config-host.mak),)
 802ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
 803Makefile: $(GENERATED_FILES)
 804endif
 805endif
 806
 807.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
 808        $(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
 809        $(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)
 810
 811# Include automatically generated dependency files
 812# Dependencies in Makefile.objs files come from our recursive subdir rules
 813-include $(wildcard *.d tests/*.d)
 814
 815include $(SRC_PATH)/tests/docker/Makefile.include
 816
 817.PHONY: help
 818help:
 819        @echo  'Generic targets:'
 820        @echo  '  all             - Build all'
 821        @echo  '  dir/file.o      - Build specified target only'
 822        @echo  '  install         - Install QEMU, documentation and tools'
 823        @echo  '  ctags/TAGS      - Generate tags file for editors'
 824        @echo  '  cscope          - Generate cscope index'
 825        @echo  ''
 826        @$(if $(TARGET_DIRS), \
 827                echo 'Architecture specific targets:'; \
 828                $(foreach t, $(TARGET_DIRS), \
 829                printf "  %-30s - Build for %s\\n" $(patsubst %,subdir-%,$(t)) $(t);) \
 830                echo '')
 831        @echo  'Cleaning targets:'
 832        @echo  '  clean           - Remove most generated files but keep the config'
 833        @echo  '  distclean       - Remove all generated files'
 834        @echo  '  dist            - Build a distributable tarball'
 835        @echo  ''
 836        @echo  'Test targets:'
 837        @echo  '  check           - Run all tests (check-help for details)'
 838        @echo  '  docker          - Help about targets running tests inside Docker containers'
 839        @echo  ''
 840        @echo  'Documentation targets:'
 841        @echo  '  html info pdf txt'
 842        @echo  '                  - Build documentation in specified format'
 843        @echo  ''
 844ifdef CONFIG_WIN32
 845        @echo  'Windows targets:'
 846        @echo  '  installer       - Build NSIS-based installer for QEMU'
 847ifdef QEMU_GA_MSI_ENABLED
 848        @echo  '  msi             - Build MSI-based installer for qemu-ga'
 849endif
 850        @echo  ''
 851endif
 852        @echo  '  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
 853