Makefile 29.1 KB
Newer Older
1 2
# Makefile for QEMU.

S
Stefan Weil 已提交
3 4
# Always point to the root of the build tree (needs GNU make).
BUILD_DIR=$(CURDIR)
5

F
Fam Zheng 已提交
6 7 8
# Before including a proper config-host.mak, assume we are in the source tree
SRC_PATH=.

F
Fam Zheng 已提交
9
UNCHECKED_GOALS := %clean TAGS cscope ctags docker docker-%
F
Fam Zheng 已提交
10

11
# All following code might depend on configuration variables
12
ifneq ($(wildcard config-host.mak),)
P
Paul Brook 已提交
13
# Put the all: rule here so that config-host.mak can contain dependencies.
S
Stefan Weil 已提交
14
all:
P
pbrook 已提交
15
include config-host.mak
16 17 18 19 20 21 22 23 24 25 26

# Check that we're not trying to do an out-of-tree build from
# a tree that's been used for an in-tree build.
ifneq ($(realpath $(SRC_PATH)),$(realpath .))
ifneq ($(wildcard $(SRC_PATH)/config-host.mak),)
$(error This is an out of tree build but your source tree ($(SRC_PATH)) \
seems to have been used for an in-tree build. You can fix this by running \
"make distclean && rm -rf *-linux-user *-softmmu" in your source tree)
endif
endif

27 28 29 30 31 32
CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
CONFIG_ALL=y
-include config-all-devices.mak
-include config-all-disas.mak

33
config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios
34
	@echo $@ is out-of-date, running configure
35 36 37 38 39 40 41 42
	@# TODO: The next lines include code which supports a smooth
	@# transition from old configurations without config.status.
	@# This code can be removed after QEMU 1.7.
	@if test -x config.status; then \
	    ./config.status; \
        else \
	    sed -n "/.*Configured with/s/[^:]*: //p" $@ | sh; \
	fi
43 44
else
config-host.mak:
F
Fam Zheng 已提交
45
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
46 47 48
	@echo "Please call configure before running make!"
	@exit 1
endif
49
endif
B
bellard 已提交
50

F
Fam Zheng 已提交
51 52
include $(SRC_PATH)/rules.mak

53 54 55 56 57
GENERATED_FILES = qemu-version.h config-host.h qemu-options.def
GENERATED_FILES += qmp-commands.h qapi-types.h qapi-visit.h qapi-event.h
GENERATED_FILES += qmp-marshal.c qapi-types.c qapi-visit.c qapi-event.c
GENERATED_FILES += qmp-introspect.h
GENERATED_FILES += qmp-introspect.c
58

59
GENERATED_FILES += trace/generated-tcg-tracers.h
60

61 62 63
GENERATED_FILES += trace/generated-helpers-wrappers.h
GENERATED_FILES += trace/generated-helpers.h
GENERATED_FILES += trace/generated-helpers.c
64

65
ifdef CONFIG_TRACE_UST
66 67
GENERATED_FILES += trace-ust-all.h
GENERATED_FILES += trace-ust-all.c
68 69
endif

70
GENERATED_FILES += module_block.h
71

72 73 74 75 76 77 78 79 80 81 82
TRACE_HEADERS = trace-root.h $(trace-events-subdirs:%=%/trace.h)
TRACE_SOURCES = trace-root.c $(trace-events-subdirs:%=%/trace.c)
TRACE_DTRACE =
ifdef CONFIG_TRACE_DTRACE
TRACE_HEADERS += trace-dtrace-root.h $(trace-events-subdirs:%=%/trace-dtrace.h)
TRACE_DTRACE += trace-dtrace-root.dtrace $(trace-events-subdirs:%=%/trace-dtrace.dtrace)
endif
ifdef CONFIG_TRACE_UST
TRACE_HEADERS += trace-ust-root.h $(trace-events-subdirs:%=%/trace-ust.h)
endif

83 84
GENERATED_FILES += $(TRACE_HEADERS)
GENERATED_FILES += $(TRACE_SOURCES)
85
GENERATED_FILES += $(BUILD_DIR)/trace-events-all
86 87 88

trace-group-name = $(shell dirname $1 | sed -e 's/[^a-zA-Z0-9]/_/g')

89 90 91
tracetool-y = $(SRC_PATH)/scripts/tracetool.py
tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py")

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
%/trace.h: %/trace.h-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
%/trace.h-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=$(call trace-group-name,$@) \
		--format=h \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

%/trace.c: %/trace.c-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
%/trace.c-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=$(call trace-group-name,$@) \
		--format=c \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

%/trace-ust.h: %/trace-ust.h-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
%/trace-ust.h-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=$(call trace-group-name,$@) \
		--format=ust-events-h \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

%/trace-dtrace.dtrace: %/trace-dtrace.dtrace-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
%/trace-dtrace.dtrace-timestamp: $(SRC_PATH)/%/trace-events $(BUILD_DIR)/config-host.mak $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=$(call trace-group-name,$@) \
		--format=d \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

%/trace-dtrace.h: %/trace-dtrace.dtrace $(tracetool-y)
	$(call quiet-command,dtrace -o $@ -h -s $<, "GEN","$@")

%/trace-dtrace.o: %/trace-dtrace.dtrace $(tracetool-y)


trace-root.h: trace-root.h-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
trace-root.h-timestamp: $(SRC_PATH)/trace-events $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=root \
		--format=h \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

trace-root.c: trace-root.c-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
trace-root.c-timestamp: $(SRC_PATH)/trace-events $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=root \
		--format=c \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

trace-ust-root.h: trace-ust-root.h-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
trace-ust-root.h-timestamp: $(SRC_PATH)/trace-events $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=root \
		--format=ust-events-h \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

trace-ust-all.h: trace-ust-all.h-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
trace-ust-all.h-timestamp: $(trace-events-files) $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=all \
		--format=ust-events-h \
		--backends=$(TRACE_BACKENDS) \
		$(trace-events-files) > $@,"GEN","$(@:%-timestamp=%)")

trace-ust-all.c: trace-ust-all.c-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
trace-ust-all.c-timestamp: $(trace-events-files) $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=all \
		--format=ust-events-c \
		--backends=$(TRACE_BACKENDS) \
		$(trace-events-files) > $@,"GEN","$(@:%-timestamp=%)")

trace-dtrace-root.dtrace: trace-dtrace-root.dtrace-timestamp
	@cmp $< $@ >/dev/null 2>&1 || cp $< $@
trace-dtrace-root.dtrace-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak $(tracetool-y)
	$(call quiet-command,$(TRACETOOL) \
		--group=root \
		--format=d \
		--backends=$(TRACE_BACKENDS) \
		$< > $@,"GEN","$(@:%-timestamp=%)")

trace-dtrace-root.h: trace-dtrace-root.dtrace
	$(call quiet-command,dtrace -o $@ -h -s $<, "GEN","$@")

trace-dtrace-root.o: trace-dtrace-root.dtrace

193 194 195 196 197
# Don't try to regenerate Makefile or configure
# We don't generate any of them
Makefile: ;
configure: ;

198
.PHONY: all clean cscope distclean html info install install-doc \
199
	pdf txt recurse-all speed test dist msi FORCE
200

P
Paolo Bonzini 已提交
201
$(call set-vpath, $(SRC_PATH))
P
pbrook 已提交
202

J
Juan Quintela 已提交
203
LIBS+=-lz $(LIBS_TOOLS)
204

205 206
HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF)

207
ifdef BUILD_DOCS
208
DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8
209 210
DOCS+=docs/qemu-qmp-ref.html docs/qemu-qmp-ref.txt docs/qemu-qmp-ref.7
DOCS+=docs/qemu-ga-ref.html docs/qemu-ga-ref.txt docs/qemu-ga-ref.7
211
ifdef CONFIG_VIRTFS
212
DOCS+=fsdev/virtfs-proxy-helper.1
213
endif
214 215 216
else
DOCS=
endif
B
bellard 已提交
217

218
SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory) BUILD_DIR=$(BUILD_DIR)
219
SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS))
220
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_DIRS))
221

222 223
ifeq ($(SUBDIR_DEVICES_MAK),)
config-all-devices.mak:
224
	$(call quiet-command,echo '# no devices' > $@,"GEN","$@")
225
else
226
config-all-devices.mak: $(SUBDIR_DEVICES_MAK)
227 228 229
	$(call quiet-command, sed -n \
             's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
             $(SUBDIR_DEVICES_MAK) | sort -u > $@, \
230
             "GEN","$@")
231
endif
232

P
Paul Brook 已提交
233 234
-include $(SUBDIR_DEVICES_MAK_DEP)

235
%/config-devices.mak: default-configs/%.mak $(SRC_PATH)/scripts/make_device_config.sh
236
	$(call quiet-command, \
237
            $(SHELL) $(SRC_PATH)/scripts/make_device_config.sh $< $*-config-devices.mak.d $@ > $@.tmp,"GEN","$@.tmp")
238
	$(call quiet-command, if test -f $@; then \
239
	  if cmp -s $@.old $@; then \
P
Paul Brook 已提交
240 241
	    mv $@.tmp $@; \
	    cp -p $@ $@.old; \
242 243 244 245 246 247 248 249 250
	  else \
	    if test -f $@.old; then \
	      echo "WARNING: $@ (user modified) out of date.";\
	    else \
	      echo "WARNING: $@ out of date.";\
	    fi; \
	    echo "Run \"make defconfig\" to regenerate."; \
	    rm $@.tmp; \
	  fi; \
251
	 else \
252 253
	  mv $@.tmp $@; \
	  cp -p $@ $@.old; \
254
	 fi,"GEN","$@");
255 256 257 258

defconfig:
	rm -f config-all-devices.mak $(SUBDIR_DEVICES_MAK)

259 260
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/Makefile.objs
261 262 263 264
endif

dummy := $(call unnest-vars,, \
                stub-obj-y \
M
Marc-André Lureau 已提交
265
                chardev-obj-y \
266 267
                util-obj-y \
                qga-obj-y \
268 269
                ivshmem-client-obj-y \
                ivshmem-server-obj-y \
M
Marc-André Lureau 已提交
270
                libvhost-user-obj-y \
271
                qga-vss-dll-obj-y \
272
                block-obj-y \
273
                block-obj-m \
274 275
                crypto-obj-y \
                crypto-aes-obj-y \
276
                qom-obj-y \
277
                io-obj-y \
278
                common-obj-y \
279 280
                common-obj-m \
                trace-obj-y)
281 282

ifneq ($(wildcard config-host.mak),)
283
include $(SRC_PATH)/tests/Makefile.include
284 285
endif

F
Fam Zheng 已提交
286
all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
P
pbrook 已提交
287

288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
qemu-version.h: FORCE
	$(call quiet-command, \
		(cd $(SRC_PATH); \
		printf '#define QEMU_PKGVERSION '; \
		if test -n "$(PKGVERSION)"; then \
			printf '"$(PKGVERSION)"\n'; \
		else \
			if test -d .git; then \
				printf '" ('; \
				git describe --match 'v*' 2>/dev/null | tr -d '\n'; \
				if ! git diff-index --quiet HEAD &>/dev/null; then \
					printf -- '-dirty'; \
				fi; \
				printf ')"\n'; \
			else \
				printf '""\n'; \
			fi; \
		fi) > $@.tmp)
306 307 308 309 310
	$(call quiet-command, if ! cmp -s $@ $@.tmp; then \
	  mv $@.tmp $@; \
	 else \
	  rm $@.tmp; \
	 fi)
311

312 313
config-host.h: config-host.h-timestamp
config-host.h-timestamp: config-host.mak
314
qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
315
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
316

317
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
318 319
SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))

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

325
subdir-%:
P
Paul Brook 已提交
326
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
P
pbrook 已提交
327

328 329 330 331
subdir-pixman: pixman/Makefile
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pixman V="$(V)" all,)

pixman/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 335 336

$(SRC_PATH)/pixman/configure:
	(cd $(SRC_PATH)/pixman; autoreconf -v --install)

337
DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
338 339
DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
340 341

subdir-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 344 345 346

dtc/%:
	mkdir -p $@

M
Marc-André Lureau 已提交
347
$(SUBDIR_RULES): libqemuutil.a libqemustub.a $(common-obj-y) $(chardev-obj-y) \
348
	$(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY)) $(trace-obj-y)
349

P
Paul Brook 已提交
350
ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
351
# Only keep -O and -g cflags
P
Paul Brook 已提交
352
romsubdir-%:
353
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/" CFLAGS="$(filter -O% -g%,$(CFLAGS))",)
P
Paul Brook 已提交
354 355 356 357

ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))

recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
B
bellard 已提交
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

362
Makefile: $(version-obj-y)
363 364

######################################################################
365
# Build libraries
366 367

libqemustub.a: $(stub-obj-y)
368
libqemuutil.a: $(util-obj-y)
369

A
Alon Levy 已提交
370
######################################################################
B
bellard 已提交
371

372 373
COMMON_LDADDS = $(trace-obj-y) libqemuutil.a libqemustub.a

J
Juan Quintela 已提交
374
qemu-img.o: qemu-img-cmds.h
375

376 377 378
qemu-img$(EXESUF): qemu-img.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
qemu-io$(EXESUF): qemu-io.o $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
379

380
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
381

382
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
383 384
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

385
qemu-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

388
qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
389
qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
390

A
Avi Kivity 已提交
391
gen-out-type = $(subst .,-,$(suffix $@))
392

393
qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py
394
qapi-py += $(SRC_PATH)/scripts/qapi2texi.py
395

396
qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h :\
397
$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
398
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
399
		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
400
		"GEN","$@")
401
qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h :\
402
$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
403
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
404
		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
405
		"GEN","$@")
406
qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c :\
407
$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
408
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
409
		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
410
		"GEN","$@")
411

412
qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
413
               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
414
               $(SRC_PATH)/qapi/event.json $(SRC_PATH)/qapi/introspect.json \
415 416
               $(SRC_PATH)/qapi/crypto.json $(SRC_PATH)/qapi/rocker.json \
               $(SRC_PATH)/qapi/trace.json
417

418
qapi-types.c qapi-types.h :\
419
$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
420
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
421
		$(gen-out-type) -o "." -b $<, \
422
		"GEN","$@")
423
qapi-visit.c qapi-visit.h :\
424
$(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
425
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
426
		$(gen-out-type) -o "." -b $<, \
427
		"GEN","$@")
W
Wenchao Xia 已提交
428 429 430
qapi-event.c qapi-event.h :\
$(qapi-modules) $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py \
431
		$(gen-out-type) -o "." $<, \
432
		"GEN","$@")
433
qmp-commands.h qmp-marshal.c :\
434
$(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
435
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
436
		$(gen-out-type) -o "." $<, \
437
		"GEN","$@")
438 439 440 441
qmp-introspect.h qmp-introspect.c :\
$(qapi-modules) $(SRC_PATH)/scripts/qapi-introspect.py $(qapi-py)
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-introspect.py \
		$(gen-out-type) -o "." $<, \
442
		"GEN","$@")
443

444
QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
445
$(qga-obj-y) qemu-ga.o: $(QGALIB_GEN)
446

447
qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
448
	$(call LINK, $^)
M
Michael Roth 已提交
449

450 451 452
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

453
msi: $(QEMU_GA_MSI)
454

455
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
456 457 458

$(QEMU_GA_MSI): config-host.mak

459 460
$(QEMU_GA_MSI):  $(SRC_PATH)/qga/installer/qemu-ga.wxs
	$(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)" \
461
	wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
462 463
else
msi:
464
	@echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
465 466
endif

467 468 469 470 471
ifneq ($(EXESUF),)
.PHONY: qemu-ga
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
endif

472
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
473
	$(call LINK, $^)
474
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
475 476
	$(call LINK, $^)

477 478 479
module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak
	$(call quiet-command,$(PYTHON) $< $@ \
	$(addprefix $(SRC_PATH)/,$(patsubst %.mo,%.c,$(block-obj-m))), \
480
	"GEN","$@")
481

482
clean:
483
# avoid old build problems by removing potentially incorrect old files
484
	rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
485
	rm -f qemu-options.def
486
	rm -f *.msi
487
	find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} +
488
	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
489
	rm -f fsdev/*.pod
B
Blue Swirl 已提交
490
	rm -f qemu-img-cmds.h
491
	rm -f ui/shader/*-vert.h ui/shader/*-frag.h
492
	@# May not be present in GENERATED_FILES
493 494
	rm -f trace/generated-tracers-dtrace.dtrace*
	rm -f trace/generated-tracers-dtrace.h*
495
	rm -f $(foreach f,$(GENERATED_FILES),$(f) $(f)-timestamp)
S
Stefan Weil 已提交
496
	rm -rf qapi-generated
497
	rm -rf qga/qapi-generated
498
	for d in $(ALL_SUBDIRS); do \
M
Magnus Damm 已提交
499
	if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \
500
	rm -f $$d/qemu-options.def; \
B
bellard 已提交
501
        done
502
	rm -f $(SUBDIR_DEVICES_MAK) config-all-devices.mak
503

504 505 506 507 508 509 510
VERSION ?= $(shell cat VERSION)

dist: qemu-$(VERSION).tar.bz2

qemu-%.tar.bz2:
	$(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)"

B
bellard 已提交
511
distclean: clean
512
	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
513 514
	rm -f config-all-devices.mak config-all-disas.mak config.status
	rm -f po/*.mo tests/qemu-iotests/common.env
M
Magnus Damm 已提交
515
	rm -f roms/seabios/config.mak roms/vgabios/config.mak
516
	rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps
B
Brad Hards 已提交
517 518
	rm -f qemu-doc.fn qemu-doc.fns qemu-doc.info qemu-doc.ky qemu-doc.kys
	rm -f qemu-doc.log qemu-doc.pdf qemu-doc.pg qemu-doc.toc qemu-doc.tp
519
	rm -f qemu-doc.vr qemu-doc.txt
520
	rm -f config.log
521
	rm -f linux-headers/asm
522
	rm -f docs/qemu-ga-qapi.texi docs/qemu-qmp-qapi.texi docs/version.texi
523 524 525 526
	rm -f docs/qemu-qmp-ref.7 docs/qemu-ga-ref.7
	rm -f docs/qemu-qmp-ref.txt docs/qemu-ga-ref.txt
	rm -f docs/qemu-qmp-ref.pdf docs/qemu-ga-ref.pdf
	rm -f docs/qemu-qmp-ref.html docs/qemu-ga-ref.html
P
Paolo Bonzini 已提交
527
	for d in $(TARGET_DIRS); do \
B
bellard 已提交
528
	rm -rf $$d || exit 1 ; \
B
updated  
bellard 已提交
529
        done
530
	rm -Rf .sdk
E
Ed Maste 已提交
531 532
	if test -f pixman/config.log; then $(MAKE) -C pixman distclean; fi
	if test -f dtc/version_gen.h; then $(MAKE) $(DTC_MAKE_ARGS) clean; fi
B
bellard 已提交
533

B
bellard 已提交
534 535
KEYMAPS=da     en-gb  et  fr     fr-ch  is  lt  modifiers  no  pt-br  sv \
ar      de     en-us  fi  fr-be  hr     it  lv  nl         pl  ru     th \
536
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
537
bepo    cz
B
bellard 已提交
538

T
ths 已提交
539
ifdef INSTALL_BLOBS
540
BLOBS=bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \
541
vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin \
542
acpi-dsdt.aml \
543
ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin \
544 545
pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
546 547
efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
G
Gerd Hoffmann 已提交
548
efi-e1000e.rom efi-vmxnet3.rom \
A
Anthony Liguori 已提交
549
qemu-icon.bmp qemu_logo_no_text.svg \
550
bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
551
multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
552
s390-ccw.img \
553
spapr-rtas.bin slof.bin skiboot.lid \
554 555
palcode-clipper \
u-boot.e500
T
ths 已提交
556 557 558 559
else
BLOBS=
endif

560
install-doc: $(DOCS)
561
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
562
	$(INSTALL_DATA) qemu-doc.html "$(DESTDIR)$(qemu_docdir)"
563
	$(INSTALL_DATA) qemu-doc.txt "$(DESTDIR)$(qemu_docdir)"
564 565
	$(INSTALL_DATA) docs/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
566
ifdef CONFIG_POSIX
567
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
568
	$(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
569 570
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
	$(INSTALL_DATA) docs/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
571 572
ifneq ($(TOOLS),)
	$(INSTALL_DATA) qemu-img.1 "$(DESTDIR)$(mandir)/man1"
573 574
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
	$(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
575
endif
M
Marc-André Lureau 已提交
576 577
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
578 579 580
	$(INSTALL_DATA) docs/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7"
M
Marc-André Lureau 已提交
581
endif
582
endif
583 584 585 586
ifdef CONFIG_VIRTFS
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
	$(INSTALL_DATA) fsdev/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
endif
587 588 589 590

install-datadir:
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)"

591 592 593 594 595 596 597
install-localstatedir:
ifdef CONFIG_POSIX
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
endif
endif

598

599
install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstatedir
600
ifneq ($(TOOLS),)
601
	$(call install-prog,$(subst qemu-ga,qemu-ga$(EXESUF),$(TOOLS)),$(DESTDIR)$(bindir))
602
endif
603 604
ifneq ($(CONFIG_MODULES),)
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
605 606
	for s in $(modules-m:.mo=$(DSOSUF)); do \
		t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
607
		$(INSTALL_LIB) $$s "$$t"; \
608
		test -z "$(STRIP)" || $(STRIP) "$$t"; \
609 610
	done
endif
611
ifneq ($(HELPERS-y),)
612
	$(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
613
endif
T
ths 已提交
614 615
ifneq ($(BLOBS),)
	set -e; for x in $(BLOBS); do \
616
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
P
pbrook 已提交
617
	done
618 619 620
endif
ifeq ($(CONFIG_GTK),y)
	$(MAKE) -C po $@
T
ths 已提交
621
endif
622
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
623
	set -e; for x in $(KEYMAPS); do \
624
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
P
pbrook 已提交
625
	done
626
	$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
B
bellard 已提交
627
	for d in $(TARGET_DIRS); do \
628
	$(MAKE) $(SUBDIR_MAKEFLAGS) TARGET_DIR=$$d/ -C $$d $@ || exit 1 ; \
B
bellard 已提交
629
        done
B
bellard 已提交
630

B
bellard 已提交
631
# various test targets
B
bellard 已提交
632
test speed: all
A
Anthony Liguori 已提交
633
	$(MAKE) -C tests/tcg $@
634

F
Fam Zheng 已提交
635 636
.PHONY: ctags
ctags:
637
	rm -f tags
F
Fam Zheng 已提交
638 639
	find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +

A
Alexandre Bique 已提交
640
.PHONY: TAGS
641
TAGS:
642
	rm -f TAGS
D
David Gibson 已提交
643
	find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
644

B
bellard 已提交
645
cscope:
F
Fam Zheng 已提交
646 647 648
	rm -f "$(SRC_PATH)"/cscope.*
	find "$(SRC_PATH)/" -name "*.[chsS]" -print | sed 's,^\./,,' > "$(SRC_PATH)/cscope.files"
	cscope -b -i"$(SRC_PATH)/cscope.files"
B
bellard 已提交
649

650 651 652 653 654
# opengl shader programs
ui/shader/%-vert.h: $(SRC_PATH)/ui/shader/%.vert $(SRC_PATH)/scripts/shaderinclude.pl
	@mkdir -p $(dir $@)
	$(call quiet-command,\
		perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
655
		"VERT","$@")
656 657 658 659 660

ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclude.pl
	@mkdir -p $(dir $@)
	$(call quiet-command,\
		perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
661
		"FRAG","$@")
662

663 664 665
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
	ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h

B
bellard 已提交
666
# documentation
667
MAKEINFO=makeinfo
668
MAKEINFOFLAGS=--no-split --number-sections -I docs
669
TEXIFLAG=$(if $(V),,--quiet)
670

671
docs/version.texi: $(SRC_PATH)/VERSION
672 673
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

674
%.html: %.texi
675 676
	$(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
	--html $< -o $@,"GEN","$@")
B
bellard 已提交
677

678
%.info: %.texi
679
	$(call quiet-command,$(MAKEINFO) $(MAKEINFOFLAGS) $< -o $@,"GEN","$@")
B
bellard 已提交
680

681
%.txt: %.texi
682 683 684
	$(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
	--plaintext $< -o $@,"GEN","$@")

685 686 687 688 689
%.pdf: %.texi
	$(call quiet-command,texi2pdf $(TEXIFLAG) -I $(SRC_PATH) -I docs $< -o $@,"GEN","$@")

docs/qemu-ga-ref.html docs/qemu-ga-ref.info docs/qemu-ga-ref.txt docs/qemu-ga-ref.pdf docs/qemu-ga-ref.7.pod: docs/version.texi
docs/qemu-qmp-ref.html docs/qemu-qmp-ref.info docs/qemu-qmp-ref.txt docs/qemu-qmp-ref.pdf docs/qemu-qmp-ref.pod: docs/version.texi
690

691
qemu-options.texi: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
692
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
B
bellard 已提交
693

694
qemu-monitor.texi: $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/scripts/hxtool
695
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
696

697
qemu-monitor-info.texi: $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/scripts/hxtool
698
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
699

700
qemu-img-cmds.texi: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
701
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
702

703
docs/qemu-qmp-qapi.texi: $(qapi-modules) $(qapi-py)
704
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")
705

706
docs/qemu-ga-qapi.texi: $(SRC_PATH)/qga/qapi-schema.json $(qapi-py)
707 708
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")

709
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
710
qemu.1: qemu-option-trace.texi
711
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
712
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
713
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
714 715
qemu-ga.8: qemu-ga.texi

716 717 718 719
html: qemu-doc.html docs/qemu-qmp-ref.html docs/qemu-ga-ref.html
info: qemu-doc.info docs/qemu-qmp-ref.info docs/qemu-ga-ref.info
pdf: qemu-doc.pdf docs/qemu-qmp-ref.pdf docs/qemu-ga-ref.pdf
txt: qemu-doc.txt docs/qemu-qmp-ref.txt docs/qemu-ga-ref.txt
720

721
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
722
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
723 724
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
	qemu-monitor-info.texi
725

726
docs/qemu-ga-ref.dvi docs/qemu-ga-ref.html docs/qemu-ga-ref.info docs/qemu-ga-ref.pdf docs/qemu-ga-ref.txt docs/qemu-ga-ref.7: \
727
docs/qemu-ga-ref.texi docs/qemu-ga-qapi.texi
728 729

docs/qemu-qmp-ref.dvi docs/qemu-qmp-ref.html docs/qemu-qmp-ref.info docs/qemu-qmp-ref.pdf docs/qemu-qmp-ref.txt docs/qemu-qmp-ref.7: \
730
docs/qemu-qmp-ref.texi docs/qemu-qmp-qapi.texi
731 732


733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
ifdef CONFIG_WIN32

INSTALLER = qemu-setup-$(VERSION)$(EXESUF)

nsisflags = -V2 -NOCD

ifneq ($(wildcard $(SRC_PATH)/dll),)
ifeq ($(ARCH),x86_64)
# 64 bit executables
DLL_PATH = $(SRC_PATH)/dll/w64
nsisflags += -DW64
else
# 32 bit executables
DLL_PATH = $(SRC_PATH)/dll/w32
endif
endif

.PHONY: installer
installer: $(INSTALLER)

INSTDIR=/tmp/qemu-nsis

$(INSTALLER): $(SRC_PATH)/qemu.nsi
E
Ed Maste 已提交
756
	$(MAKE) install prefix=${INSTDIR}
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
ifdef SIGNCODE
	(cd ${INSTDIR}; \
         for i in *.exe; do \
           $(SIGNCODE) $${i}; \
         done \
        )
endif # SIGNCODE
	(cd ${INSTDIR}; \
         for i in qemu-system-*.exe; do \
           arch=$${i%.exe}; \
           arch=$${arch#qemu-system-}; \
           echo Section \"$$arch\" Section_$$arch; \
           echo SetOutPath \"\$$INSTDIR\"; \
           echo File \"\$${BINDIR}\\$$i\"; \
           echo SectionEnd; \
         done \
        ) >${INSTDIR}/system-emulations.nsh
	makensis $(nsisflags) \
                $(if $(BUILD_DOCS),-DCONFIG_DOCUMENTATION="y") \
                $(if $(CONFIG_GTK),-DCONFIG_GTK="y") \
                -DBINDIR="${INSTDIR}" \
                $(if $(DLL_PATH),-DDLLDIR="$(DLL_PATH)") \
                -DSRCDIR="$(SRC_PATH)" \
                -DOUTFILE="$(INSTALLER)" \
781
                -DDISPLAYVERSION="$(VERSION)" \
782 783 784 785 786 787 788
                $(SRC_PATH)/qemu.nsi
	rm -r ${INSTDIR}
ifdef SIGNCODE
	$(SIGNCODE) $(INSTALLER)
endif # SIGNCODE
endif # CONFIG_WIN

789 790
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
F
Fam Zheng 已提交
791
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
792
Makefile: $(GENERATED_FILES)
793
endif
794

795 796 797 798
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
799
# Include automatically generated dependency files
800 801
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
802 803

include $(SRC_PATH)/tests/docker/Makefile.include
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828

.PHONY: help
help:
	@echo  'Generic targets:'
	@echo  '  all             - Build all'
	@echo  '  dir/file.o      - Build specified target only'
	@echo  '  install         - Install QEMU, documentation and tools'
	@echo  '  ctags/TAGS      - Generate tags file for editors'
	@echo  '  cscope          - Generate cscope index'
	@echo  ''
	@$(if $(TARGET_DIRS), \
		echo 'Architecture specific targets:'; \
		$(foreach t, $(TARGET_DIRS), \
		printf "  %-30s - Build for %s\\n" $(patsubst %,subdir-%,$(t)) $(t);) \
		echo '')
	@echo  'Cleaning targets:'
	@echo  '  clean           - Remove most generated files but keep the config'
	@echo  '  distclean       - Remove all generated files'
	@echo  '  dist            - Build a distributable tarball'
	@echo  ''
	@echo  'Test targets:'
	@echo  '  check           - Run all tests (check-help for details)'
	@echo  '  docker          - Help about targets running tests inside Docker containers'
	@echo  ''
	@echo  'Documentation targets:'
829
	@echo  '  html info pdf txt'
830 831 832 833
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
834
	@echo  '  installer       - Build NSIS-based installer for QEMU'
835 836 837 838 839 840
ifdef QEMU_GA_MSI_ENABLED
	@echo  '  msi             - Build MSI-based installer for qemu-ga'
endif
	@echo  ''
endif
	@echo  '  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'