Makefile 28.8 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 303 304 305 306
	$(call quiet-command, if ! cmp -s $@ $@.tmp; then \
	  mv $@.tmp $@; \
	 else \
	  rm $@.tmp; \
	 fi)
307

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

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

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

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

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

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

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

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

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

dtc/%:
	mkdir -p $@

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

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

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

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

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

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

######################################################################
361
# Build libraries
362 363

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

449
msi: $(QEMU_GA_MSI)
450

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

$(QEMU_GA_MSI): config-host.mak

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

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

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

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

478
clean:
479
# avoid old build problems by removing potentially incorrect old files
480
	rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
481
	rm -f qemu-options.def
482
	rm -f *.msi
483
	find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} +
484
	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
485
	rm -f fsdev/*.pod
B
Blue Swirl 已提交
486
	rm -f qemu-img-cmds.h
487
	rm -f ui/shader/*-vert.h ui/shader/*-frag.h
488
	@# May not be present in GENERATED_HEADERS
489 490
	rm -f trace/generated-tracers-dtrace.dtrace*
	rm -f trace/generated-tracers-dtrace.h*
491 492
	rm -f $(foreach f,$(GENERATED_HEADERS),$(f) $(f)-timestamp)
	rm -f $(foreach f,$(GENERATED_SOURCES),$(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) $(BUILD_DIR)/trace-events-all \
597
install-datadir install-localstatedir
598
ifneq ($(TOOLS),)
599
	$(call install-prog,$(subst qemu-ga,qemu-ga$(EXESUF),$(TOOLS)),$(DESTDIR)$(bindir))
600
endif
601 602
ifneq ($(CONFIG_MODULES),)
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
603 604
	for s in $(modules-m:.mo=$(DSOSUF)); do \
		t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
605
		$(INSTALL_LIB) $$s "$$t"; \
606
		test -z "$(STRIP)" || $(STRIP) "$$t"; \
607 608
	done
endif
609
ifneq ($(HELPERS-y),)
610
	$(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
611
endif
T
ths 已提交
612 613
ifneq ($(BLOBS),)
	set -e; for x in $(BLOBS); do \
614
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
P
pbrook 已提交
615
	done
616 617 618
endif
ifeq ($(CONFIG_GTK),y)
	$(MAKE) -C po $@
T
ths 已提交
619
endif
620
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
621
	set -e; for x in $(KEYMAPS); do \
622
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
P
pbrook 已提交
623
	done
624
	$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
B
bellard 已提交
625
	for d in $(TARGET_DIRS); do \
626
	$(MAKE) $(SUBDIR_MAKEFLAGS) TARGET_DIR=$$d/ -C $$d $@ || exit 1 ; \
B
bellard 已提交
627
        done
B
bellard 已提交
628

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

721 722 723 724 725 726 727
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


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

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

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

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

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

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