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

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

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

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

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

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

27 28
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
DOCS+=docs/qemu-block-drivers.7
213
ifdef CONFIG_VIRTFS
214
DOCS+=fsdev/virtfs-proxy-helper.1
215
endif
216 217 218
else
DOCS=
endif
B
bellard 已提交
219

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 $@

P
Paolo Bonzini 已提交
339
$(SUBDIR_RULES): libqemuutil.a $(common-obj-y) $(chardev-obj-y) \
340
	$(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY))
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

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

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

P
Paolo Bonzini 已提交
364
COMMON_LDADDS = libqemuutil.a
365

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

P
Paolo Bonzini 已提交
377
scsi/qemu-pr-helper$(EXESUF): scsi/qemu-pr-helper.o scsi/utils.o $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
378 379 380
ifdef CONFIG_MPATH
scsi/qemu-pr-helper$(EXESUF): LIBS += -ludev -lmultipath -lmpathpersist
endif
P
Paolo Bonzini 已提交
381

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

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

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

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

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/char.json \
411
               $(SRC_PATH)/qapi/crypto.json \
412
               $(SRC_PATH)/qapi/introspect.json \
413
               $(SRC_PATH)/qapi/migration.json \
414
               $(SRC_PATH)/qapi/net.json \
415
               $(SRC_PATH)/qapi/rocker.json \
416
               $(SRC_PATH)/qapi/run-state.json \
417
               $(SRC_PATH)/qapi/sockets.json \
418
               $(SRC_PATH)/qapi/tpm.json \
419
               $(SRC_PATH)/qapi/trace.json \
420
               $(SRC_PATH)/qapi/transaction.json \
421
               $(SRC_PATH)/qapi/ui.json
422

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

449
QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
450
$(qga-obj-y): $(QGALIB_GEN)
451

452
qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
453
	$(call LINK, $^)
M
Michael Roth 已提交
454

455 456 457
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

458
msi: $(QEMU_GA_MSI)
459

460
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
461 462 463

$(QEMU_GA_MSI): config-host.mak

464 465
$(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)" \
466
	wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
467 468
else
msi:
469
	@echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
470 471
endif

472 473 474 475 476
ifneq ($(EXESUF),)
.PHONY: qemu-ga
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
endif

477
ifdef CONFIG_IVSHMEM
478
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
479
	$(call LINK, $^)
480
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
481
	$(call LINK, $^)
482
endif
483 484
vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y)
	$(call LINK, $^)
485

486 487 488
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))), \
489
	"GEN","$@")
490

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

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

B
bellard 已提交
544 545
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 \
546
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
547
bepo    cz
B
bellard 已提交
548

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

571
install-doc: $(DOCS)
572
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
573
	$(INSTALL_DATA) qemu-doc.html "$(DESTDIR)$(qemu_docdir)"
574
	$(INSTALL_DATA) qemu-doc.txt "$(DESTDIR)$(qemu_docdir)"
575 576
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
577
ifdef CONFIG_POSIX
578
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
579
	$(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
580
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
581
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
582
	$(INSTALL_DATA) docs/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
583 584
ifneq ($(TOOLS),)
	$(INSTALL_DATA) qemu-img.1 "$(DESTDIR)$(mandir)/man1"
585 586
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
	$(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
587
endif
M
Marc-André Lureau 已提交
588 589
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
590 591 592
	$(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 已提交
593
endif
594
endif
595 596 597 598
ifdef CONFIG_VIRTFS
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
	$(INSTALL_DATA) fsdev/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
endif
599 600 601 602

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

603 604 605 606 607 608 609
install-localstatedir:
ifdef CONFIG_POSIX
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
endif
endif

610

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

B
bellard 已提交
643
# various test targets
B
bellard 已提交
644
test speed: all
A
Anthony Liguori 已提交
645
	$(MAKE) -C tests/tcg $@
646

F
Fam Zheng 已提交
647 648
.PHONY: ctags
ctags:
649
	rm -f tags
F
Fam Zheng 已提交
650 651
	find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +

A
Alexandre Bique 已提交
652
.PHONY: TAGS
653
TAGS:
654
	rm -f TAGS
D
David Gibson 已提交
655
	find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
656

B
bellard 已提交
657
cscope:
F
Fam Zheng 已提交
658 659 660
	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 已提交
661

662 663 664 665 666
# 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 $< > $@,\
667
		"VERT","$@")
668 669 670 671 672

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 $< > $@,\
673
		"FRAG","$@")
674

675 676 677
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
	ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h

B
bellard 已提交
678
# documentation
679
MAKEINFO=makeinfo
680 681
MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
P
Paolo Bonzini 已提交
682
TEXI2PODFLAGS=$(MAKEINFOINCLUDES) "-DVERSION=$(VERSION)"
683
TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
684

685
docs/version.texi: $(SRC_PATH)/VERSION
686 687
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

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

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

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

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

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

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

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

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

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

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

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

722
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
723
qemu.1: qemu-option-trace.texi
724
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
725
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
726
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
727
qemu-ga.8: qemu-ga.texi
728
docs/qemu-block-drivers.7: docs/qemu-block-drivers.texi
M
Marc-André Lureau 已提交
729

730 731 732 733
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
734

735
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
736
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
737
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
738
	qemu-monitor-info.texi docs/qemu-block-drivers.texi
739

740 741 742 743
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
744

745 746 747 748
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
749 750


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

807 808
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
809
ifneq ($(wildcard config-host.mak),)
F
Fam Zheng 已提交
810
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
811
Makefile: $(GENERATED_FILES)
812
endif
813
endif
814

815 816 817 818
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
819
# Include automatically generated dependency files
820 821
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
822 823

include $(SRC_PATH)/tests/docker/Makefile.include
F
Fam Zheng 已提交
824
include $(SRC_PATH)/tests/vm/Makefile.include
825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847

.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'
F
Fam Zheng 已提交
848
	@echo  '  vm-test         - Help about targets running tests inside VM'
849 850
	@echo  ''
	@echo  'Documentation targets:'
851
	@echo  '  html info pdf txt'
852 853 854 855
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
856
	@echo  '  installer       - Build NSIS-based installer for QEMU'
857 858 859 860 861 862
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'