Makefile 29.5 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
CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
29
CONFIG_XEN := $(CONFIG_XEN_BACKEND)
30 31 32 33
CONFIG_ALL=y
-include config-all-devices.mak
-include config-all-disas.mak

34
config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios
35
	@echo $@ is out-of-date, running configure
36 37 38 39 40 41 42 43
	@# 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
44 45
else
config-host.mak:
F
Fam Zheng 已提交
46
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
47 48 49
	@echo "Please call configure before running make!"
	@exit 1
endif
50
endif
B
bellard 已提交
51

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

54 55 56 57 58
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
59

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

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

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

71
GENERATED_FILES += module_block.h
72

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

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

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

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

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
%/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

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

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

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

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

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

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

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

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

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

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

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

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

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

284
include $(SRC_PATH)/tests/Makefile.include
285

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

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

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

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

320
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
321
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
322
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
323
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
324

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

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

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

dtc/%:
	mkdir -p $@

P
Paolo Bonzini 已提交
338
$(SUBDIR_RULES): libqemuutil.a $(common-obj-y) $(chardev-obj-y) \
339
	$(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY))
340

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

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

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

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

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

######################################################################
356
# Build libraries
357

P
Paolo Bonzini 已提交
358
libqemuutil.a: $(util-obj-y) $(trace-obj-y) $(stub-obj-y)
359

A
Alon Levy 已提交
360
######################################################################
B
bellard 已提交
361

P
Paolo Bonzini 已提交
362
COMMON_LDADDS = libqemuutil.a
363

J
Juan Quintela 已提交
364
qemu-img.o: qemu-img-cmds.h
365

366 367 368
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)
369

370
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
371

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

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

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

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

383 384
qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py

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

401
qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
402
               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
403
               $(SRC_PATH)/qapi/char.json \
404
               $(SRC_PATH)/qapi/crypto.json \
405
               $(SRC_PATH)/qapi/introspect.json \
406
               $(SRC_PATH)/qapi/migration.json \
407
               $(SRC_PATH)/qapi/net.json \
408
               $(SRC_PATH)/qapi/rocker.json \
409
               $(SRC_PATH)/qapi/run-state.json \
410
               $(SRC_PATH)/qapi/sockets.json \
411
               $(SRC_PATH)/qapi/tpm.json \
412
               $(SRC_PATH)/qapi/trace.json \
413
               $(SRC_PATH)/qapi/transaction.json \
414
               $(SRC_PATH)/qapi/ui.json
415

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

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

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

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

451
msi: $(QEMU_GA_MSI)
452

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

$(QEMU_GA_MSI): config-host.mak

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

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

470
ifdef CONFIG_IVSHMEM
471
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
472
	$(call LINK, $^)
473
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
474
	$(call LINK, $^)
475
endif
476 477
vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y)
	$(call LINK, $^)
478

479 480 481
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))), \
482
	"GEN","$@")
483

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

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

B
bellard 已提交
536 537
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 \
538
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
539
bepo    cz
B
bellard 已提交
540

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

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

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

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

601

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

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

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

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

B
bellard 已提交
648
cscope:
F
Fam Zheng 已提交
649 650 651
	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 已提交
652

653 654 655 656 657
# 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 $< > $@,\
658
		"VERT","$@")
659 660 661 662 663

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 $< > $@,\
664
		"FRAG","$@")
665

666 667 668
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
	ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h

B
bellard 已提交
669
# documentation
670
MAKEINFO=makeinfo
671 672
MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
P
Paolo Bonzini 已提交
673
TEXI2PODFLAGS=$(MAKEINFOINCLUDES) "-DVERSION=$(VERSION)"
674
TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
675

676
docs/version.texi: $(SRC_PATH)/VERSION
677 678
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

P
Paolo Bonzini 已提交
679
%.html: %.texi docs/version.texi
680 681
	$(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
	--html $< -o $@,"GEN","$@")
B
bellard 已提交
682

P
Paolo Bonzini 已提交
683
%.info: %.texi docs/version.texi
684
	$(call quiet-command,$(MAKEINFO) $(MAKEINFOFLAGS) $< -o $@,"GEN","$@")
B
bellard 已提交
685

P
Paolo Bonzini 已提交
686
%.txt: %.texi docs/version.texi
687 688 689
	$(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
	--plaintext $< -o $@,"GEN","$@")

P
Paolo Bonzini 已提交
690
%.pdf: %.texi docs/version.texi
691
	$(call quiet-command,texi2pdf $(TEXI2PDFFLAGS) $< -o $@,"GEN","$@")
692

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

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

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

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

705
docs/interop/qemu-qmp-qapi.texi docs/interop/qemu-ga-qapi.texi: $(SRC_PATH)/scripts/qapi2texi.py $(qapi-py)
706

707
docs/interop/qemu-qmp-qapi.texi: $(qapi-modules)
708
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi2texi.py $< > $@,"GEN","$@")
709

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

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

720 721 722 723
html: qemu-doc.html docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html
info: qemu-doc.info docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info
pdf: qemu-doc.pdf docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf
txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt
724

725
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
726
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
727 728
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
	qemu-monitor-info.texi
729

730 731 732 733
docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \
    docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \
    docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \
	docs/interop/qemu-ga-ref.texi docs/interop/qemu-ga-qapi.texi
734

735 736 737 738
docs/interop/qemu-qmp-ref.dvi docs/interop/qemu-qmp-ref.html \
    docs/interop/qemu-qmp-ref.info docs/interop/qemu-qmp-ref.pdf \
    docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7: \
	docs/interop/qemu-qmp-ref.texi docs/interop/qemu-qmp-qapi.texi
739 740


741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
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 已提交
764
	$(MAKE) install prefix=${INSTDIR}
765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
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)" \
789
                -DDISPLAYVERSION="$(VERSION)" \
790 791 792 793 794 795 796
                $(SRC_PATH)/qemu.nsi
	rm -r ${INSTDIR}
ifdef SIGNCODE
	$(SIGNCODE) $(INSTALLER)
endif # SIGNCODE
endif # CONFIG_WIN

797 798
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
799
ifneq ($(wildcard config-host.mak),)
F
Fam Zheng 已提交
800
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
801
Makefile: $(GENERATED_FILES)
802
endif
803
endif
804

805 806 807 808
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
809
# Include automatically generated dependency files
810 811
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
812 813

include $(SRC_PATH)/tests/docker/Makefile.include
814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838

.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:'
839
	@echo  '  html info pdf txt'
840 841 842 843
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
844
	@echo  '  installer       - Build NSIS-based installer for QEMU'
845 846 847 848 849 850
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'