Makefile 28.7 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 89 90 91 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

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

%/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

190 191 192 193 194
# Don't try to regenerate Makefile or configure
# We don't generate any of them
Makefile: ;
configure: ;

195
.PHONY: all clean cscope distclean html info install install-doc \
196
	pdf txt recurse-all speed test dist msi FORCE
197

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

J
Juan Quintela 已提交
200
LIBS+=-lz $(LIBS_TOOLS)
201

202 203
HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF)

204
ifdef BUILD_DOCS
205
DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8
206 207
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
208
ifdef CONFIG_VIRTFS
209
DOCS+=fsdev/virtfs-proxy-helper.1
210
endif
211 212 213
else
DOCS=
endif
B
bellard 已提交
214

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

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

P
Paul Brook 已提交
230 231
-include $(SUBDIR_DEVICES_MAK_DEP)

232
%/config-devices.mak: default-configs/%.mak $(SRC_PATH)/scripts/make_device_config.sh
233
	$(call quiet-command, \
234
            $(SHELL) $(SRC_PATH)/scripts/make_device_config.sh $< $*-config-devices.mak.d $@ > $@.tmp,"GEN","$@.tmp")
235
	$(call quiet-command, if test -f $@; then \
236
	  if cmp -s $@.old $@; then \
P
Paul Brook 已提交
237 238
	    mv $@.tmp $@; \
	    cp -p $@ $@.old; \
239 240 241 242 243 244 245 246 247
	  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; \
248
	 else \
249 250
	  mv $@.tmp $@; \
	  cp -p $@ $@.old; \
251
	 fi,"GEN","$@");
252 253 254 255

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

256 257
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/Makefile.objs
258 259 260 261
endif

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

ifneq ($(wildcard config-host.mak),)
280
include $(SRC_PATH)/tests/Makefile.include
281 282
endif

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

285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
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)
303 304 305 306 307
	$(call quiet-command, if ! cmp -s $@ $@.tmp; then \
	  mv $@.tmp $@; \
	 else \
	  rm $@.tmp; \
	 fi)
308

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

314
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
315 316
SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))

317
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
318
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
319
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
320
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
321

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

325 326 327 328
subdir-pixman: pixman/Makefile
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pixman V="$(V)" all,)

pixman/Makefile: $(SRC_PATH)/pixman/configure
329
	(cd pixman; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) --disable-gtk --disable-shared --enable-static)
330 331 332 333

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

334
DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
335 336
DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
337 338

subdir-dtc:dtc/libfdt dtc/tests
339
	$(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,)
340 341 342 343

dtc/%:
	mkdir -p $@

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

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

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

recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
B
bellard 已提交
355

356
$(BUILD_DIR)/version.o: $(SRC_PATH)/version.rc config-host.h
357
	$(call quiet-command,$(WINDRES) -I$(BUILD_DIR) -o $@ $<,"RC","version.o")
358

359
Makefile: $(version-obj-y)
360 361

######################################################################
362
# Build libraries
363 364

libqemustub.a: $(stub-obj-y)
365
libqemuutil.a: $(util-obj-y)
366

A
Alon Levy 已提交
367
######################################################################
B
bellard 已提交
368

369 370
COMMON_LDADDS = $(trace-obj-y) libqemuutil.a libqemustub.a

J
Juan Quintela 已提交
371
qemu-img.o: qemu-img-cmds.h
372

373 374 375
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)
376

377
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
378

379
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
380 381
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

382
qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
383
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
384

385
qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
386
qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
387

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

390
qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py
391
qapi-py += $(SRC_PATH)/scripts/qapi2texi.py
392

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

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

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

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

444
qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
445
	$(call LINK, $^)
M
Michael Roth 已提交
446

447 448 449
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

450
msi: $(QEMU_GA_MSI)
451

452
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
453 454 455

$(QEMU_GA_MSI): config-host.mak

456 457
$(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)" \
458
	wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
459 460
else
msi:
461
	@echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
462 463
endif

464 465 466 467 468
ifneq ($(EXESUF),)
.PHONY: qemu-ga
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
endif

469
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
470
	$(call LINK, $^)
471
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
472 473
	$(call LINK, $^)

474 475 476
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))), \
477
	"GEN","$@")
478

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

501 502 503 504 505 506 507
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 已提交
508
distclean: clean
509
	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
510 511
	rm -f config-all-devices.mak config-all-disas.mak config.status
	rm -f po/*.mo tests/qemu-iotests/common.env
M
Magnus Damm 已提交
512
	rm -f roms/seabios/config.mak roms/vgabios/config.mak
513
	rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps
B
Brad Hards 已提交
514 515
	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
516
	rm -f qemu-doc.vr qemu-doc.txt
517
	rm -f config.log
518
	rm -f linux-headers/asm
519
	rm -f qemu-ga-qapi.texi qemu-qapi.texi version.texi
520 521 522 523
	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 已提交
524
	for d in $(TARGET_DIRS); do \
B
bellard 已提交
525
	rm -rf $$d || exit 1 ; \
B
updated  
bellard 已提交
526
        done
527
	rm -Rf .sdk
E
Ed Maste 已提交
528 529
	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 已提交
530

B
bellard 已提交
531 532
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 \
533
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
534
bepo    cz
B
bellard 已提交
535

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

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

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

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

595

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

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

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

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

B
bellard 已提交
642
cscope:
F
Fam Zheng 已提交
643 644 645
	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 已提交
646

647 648 649 650 651
# 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 $< > $@,\
652
		"VERT","$@")
653 654 655 656 657

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 $< > $@,\
658
		"FRAG","$@")
659

660 661 662
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
	ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h

B
bellard 已提交
663
# documentation
664
MAKEINFO=makeinfo
665 666
MAKEINFOFLAGS=--no-split --number-sections
TEXIFLAG=$(if $(V),,--quiet)
667

668 669 670 671
version.texi: $(SRC_PATH)/VERSION
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

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

675
%.info: %.texi version.texi
676
	$(call quiet-command,$(MAKEINFO) $(MAKEINFOFLAGS) $< -o $@,"GEN","$@")
B
bellard 已提交
677

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

682
%.pdf: %.texi version.texi
683
	$(call quiet-command,texi2pdf $(TEXIFLAG) -I $(SRC_PATH) -I . $< -o $@,"GEN","$@")
684

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

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

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

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

697
qemu-qapi.texi: $(qapi-modules) $(qapi-py)
698
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")
699 700 701 702

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

703
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
704
qemu.1: qemu-option-trace.texi
705
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
706
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
707
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
708 709
qemu-ga.8: qemu-ga.texi

710 711 712 713
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
714

715
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
716
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
717 718
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
	qemu-monitor-info.texi
719

720 721 722 723 724 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: \
docs/qemu-ga-ref.texi qemu-ga-qapi.texi

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: \
docs/qemu-qmp-ref.texi qemu-qapi.texi


727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749
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 已提交
750
	$(MAKE) install prefix=${INSTDIR}
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
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)" \
775
                -DDISPLAYVERSION="$(VERSION)" \
776 777 778 779 780 781 782
                $(SRC_PATH)/qemu.nsi
	rm -r ${INSTDIR}
ifdef SIGNCODE
	$(SIGNCODE) $(INSTALLER)
endif # SIGNCODE
endif # CONFIG_WIN

783 784
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
F
Fam Zheng 已提交
785
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
786
Makefile: $(GENERATED_FILES)
787
endif
788

789 790 791 792
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
793
# Include automatically generated dependency files
794 795
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
796 797

include $(SRC_PATH)/tests/docker/Makefile.include
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822

.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:'
823
	@echo  '  html info pdf txt'
824 825 826 827
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
828
	@echo  '  installer       - Build NSIS-based installer for QEMU'
829 830 831 832 833 834
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'