Makefile 28.6 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
GENERATED_HEADERS = qemu-version.h config-host.h qemu-options.def
W
Wenchao Xia 已提交
54 55
GENERATED_HEADERS += qmp-commands.h qapi-types.h qapi-visit.h qapi-event.h
GENERATED_SOURCES += qmp-marshal.c qapi-types.c qapi-visit.c qapi-event.c
56 57
GENERATED_HEADERS += qmp-introspect.h
GENERATED_SOURCES += qmp-introspect.c
58

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

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

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

70 71
GENERATED_HEADERS += module_block.h

72 73 74 75 76 77 78 79 80 81 82 83 84 85 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
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

GENERATED_HEADERS += $(TRACE_HEADERS)
GENERATED_SOURCES += $(TRACE_SOURCES)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
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)
302
	$(call quiet-command, cmp -s $@ $@.tmp || mv $@.tmp $@)
303

304 305
config-host.h: config-host.h-timestamp
config-host.h-timestamp: config-host.mak
306
qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
307
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
308

309
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
310 311
SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))

312
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
313
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
314
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
315
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
316

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

320 321 322 323
subdir-pixman: pixman/Makefile
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pixman V="$(V)" all,)

pixman/Makefile: $(SRC_PATH)/pixman/configure
324
	(cd pixman; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) --disable-gtk --disable-shared --enable-static)
325 326 327 328

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

329
DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
330 331
DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
332 333

subdir-dtc:dtc/libfdt dtc/tests
334
	$(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,)
335 336 337 338

dtc/%:
	mkdir -p $@

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

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

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

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

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

354
Makefile: $(version-obj-y)
355 356

######################################################################
357
# Build libraries
358 359

libqemustub.a: $(stub-obj-y)
360
libqemuutil.a: $(util-obj-y)
361

A
Alon Levy 已提交
362
######################################################################
B
bellard 已提交
363

364 365
COMMON_LDADDS = $(trace-obj-y) libqemuutil.a libqemustub.a

J
Juan Quintela 已提交
366
qemu-img.o: qemu-img-cmds.h
367

368 369 370
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)
371

372
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
373

374
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
375 376
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

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

380
qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
381
qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
382

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

385
qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py
386
qapi-py += $(SRC_PATH)/scripts/qapi2texi.py
387

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

404
qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
405
               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
406
               $(SRC_PATH)/qapi/event.json $(SRC_PATH)/qapi/introspect.json \
407 408
               $(SRC_PATH)/qapi/crypto.json $(SRC_PATH)/qapi/rocker.json \
               $(SRC_PATH)/qapi/trace.json
409

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

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

439
qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
440
	$(call LINK, $^)
M
Michael Roth 已提交
441

442 443 444
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

445
msi: $(QEMU_GA_MSI)
446

447
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
448 449 450

$(QEMU_GA_MSI): config-host.mak

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

459 460 461 462 463
ifneq ($(EXESUF),)
.PHONY: qemu-ga
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
endif

464
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
465
	$(call LINK, $^)
466
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
467 468
	$(call LINK, $^)

469 470 471
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))), \
472
	"GEN","$@")
473

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

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

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

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

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

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

584 585 586 587 588 589 590
install-localstatedir:
ifdef CONFIG_POSIX
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
endif
endif

591

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

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

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

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

B
bellard 已提交
639
cscope:
F
Fam Zheng 已提交
640 641 642
	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 已提交
643

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

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 $< > $@,\
655
		"FRAG","$@")
656

657 658 659
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
	ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h

B
bellard 已提交
660
# documentation
661 662
MAKEINFO=makeinfo
MAKEINFOFLAGS=--no-split --number-sections -D 'VERSION $(VERSION)'
663 664
TEXIFLAG=$(if $(V),,--quiet) --command='@set VERSION $(VERSION)'

B
bellard 已提交
665
%.html: %.texi
666 667
	$(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
	--html $< -o $@,"GEN","$@")
B
bellard 已提交
668

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

672 673 674 675
%.txt: %.texi
	$(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
	--plaintext $< -o $@,"GEN","$@")

676
%.pdf: %.texi
677
	$(call quiet-command,texi2pdf $(TEXIFLAG) -I $(SRC_PATH) -I . $< -o $@,"GEN","$@")
678

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

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

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

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

691
qemu-qapi.texi: $(qapi-modules) $(qapi-py)
692
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")
693 694 695 696

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

697
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
698
qemu.1: qemu-option-trace.texi
699
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
700
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
701
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
702 703
qemu-ga.8: qemu-ga.texi

704 705 706 707
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
708

709
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
710
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
711 712
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
	qemu-monitor-info.texi
713

714 715 716 717 718 719 720
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


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

777 778
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
F
Fam Zheng 已提交
779
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
780
Makefile: $(GENERATED_HEADERS)
781
endif
782

783 784 785 786
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
787
# Include automatically generated dependency files
788 789
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
790 791

include $(SRC_PATH)/tests/docker/Makefile.include
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816

.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:'
817
	@echo  '  html info pdf txt'
818 819 820 821
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
822
	@echo  '  installer       - Build NSIS-based installer for QEMU'
823 824 825 826 827 828
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'