Makefile 31.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 27 28 29 30 31 32 33 34 35
git-submodule-update:

.PHONY: git-submodule-update

ifeq (0,$(MAKELEVEL))
  git_module_status := $(shell \
    cd '$(SRC_PATH)' && \
    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
    echo $$?; \
  )

ifeq (1,$(git_module_status))
git-submodule-update:
	$(call quiet-command, \
          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
          "GIT","$(GIT_SUBMODULES)")
endif
endif

36
.git-submodule-status: git-submodule-update config-host.mak
37

38 39 40 41 42 43 44 45 46 47
# 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

48 49
CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
50
CONFIG_XEN := $(CONFIG_XEN_BACKEND)
51 52 53 54
CONFIG_ALL=y
-include config-all-devices.mak
-include config-all-disas.mak

55
config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios
56
	@echo $@ is out-of-date, running configure
57 58 59 60 61 62 63 64
	@# 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
65 66
else
config-host.mak:
F
Fam Zheng 已提交
67
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
68 69 70
	@echo "Please call configure before running make!"
	@exit 1
endif
71
endif
B
bellard 已提交
72

F
Fam Zheng 已提交
73 74
include $(SRC_PATH)/rules.mak

75 76 77 78 79
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
80

81
GENERATED_FILES += trace/generated-tcg-tracers.h
82

83 84 85
GENERATED_FILES += trace/generated-helpers-wrappers.h
GENERATED_FILES += trace/generated-helpers.h
GENERATED_FILES += trace/generated-helpers.c
86

87
ifdef CONFIG_TRACE_UST
88 89
GENERATED_FILES += trace-ust-all.h
GENERATED_FILES += trace-ust-all.c
90 91
endif

92
GENERATED_FILES += module_block.h
93

94 95 96 97 98 99 100 101 102 103 104
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

105 106
GENERATED_FILES += $(TRACE_HEADERS)
GENERATED_FILES += $(TRACE_SOURCES)
107
GENERATED_FILES += $(BUILD_DIR)/trace-events-all
108
GENERATED_FILES += .git-submodule-status
109 110 111

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

112 113 114
tracetool-y = $(SRC_PATH)/scripts/tracetool.py
tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py")

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 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
%/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

216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
KEYCODEMAP_GEN = $(SRC_PATH)/ui/keycodemapdb/tools/keymap-gen
KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv

KEYCODEMAP_FILES = \
		 $(NULL)

GENERATED_FILES += $(KEYCODEMAP_FILES)

ui/input-keymap-%.c: $(KEYCODEMAP_GEN) $(KEYCODEMAP_CSV) $(SRC_PATH)/ui/Makefile.objs
	$(call quiet-command,\
	    src=$$(echo $@ | sed -E -e "s,^ui/input-keymap-(.+)-to-(.+)\.c$$,\1,") && \
	    dst=$$(echo $@ | sed -E -e "s,^ui/input-keymap-(.+)-to-(.+)\.c$$,\2,") && \
	    test -e $(KEYCODEMAP_GEN) && \
	    $(PYTHON) $(KEYCODEMAP_GEN) \
	          --lang glib2 \
	          --varname qemu_input_map_$${src}_to_$${dst} \
	          code-map $(KEYCODEMAP_CSV) $${src} $${dst} \
	        > $@ || rm -f $@, "GEN", "$@")

$(KEYCODEMAP_GEN): .git-submodule-status
$(KEYCODEMAP_CSV): .git-submodule-status

238 239 240 241 242
# Don't try to regenerate Makefile or configure
# We don't generate any of them
Makefile: ;
configure: ;

243
.PHONY: all clean cscope distclean html info install install-doc \
244
	pdf txt recurse-all speed test dist msi FORCE
245

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

J
Juan Quintela 已提交
248
LIBS+=-lz $(LIBS_TOOLS)
249

250 251
HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF)

252
ifdef BUILD_DOCS
253
DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8
254 255
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
256
DOCS+=docs/qemu-block-drivers.7
257
ifdef CONFIG_VIRTFS
258
DOCS+=fsdev/virtfs-proxy-helper.1
259
endif
260 261 262
else
DOCS=
endif
B
bellard 已提交
263

264
SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory) BUILD_DIR=$(BUILD_DIR)
265
SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS))
266
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_DIRS))
267

268 269
ifeq ($(SUBDIR_DEVICES_MAK),)
config-all-devices.mak:
270
	$(call quiet-command,echo '# no devices' > $@,"GEN","$@")
271
else
272
config-all-devices.mak: $(SUBDIR_DEVICES_MAK)
273 274 275
	$(call quiet-command, sed -n \
             's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
             $(SUBDIR_DEVICES_MAK) | sort -u > $@, \
276
             "GEN","$@")
277
endif
278

P
Paul Brook 已提交
279 280
-include $(SUBDIR_DEVICES_MAK_DEP)

281
%/config-devices.mak: default-configs/%.mak $(SRC_PATH)/scripts/make_device_config.sh
282
	$(call quiet-command, \
283
            $(SHELL) $(SRC_PATH)/scripts/make_device_config.sh $< $*-config-devices.mak.d $@ > $@.tmp,"GEN","$@.tmp")
284
	$(call quiet-command, if test -f $@; then \
285
	  if cmp -s $@.old $@; then \
P
Paul Brook 已提交
286 287
	    mv $@.tmp $@; \
	    cp -p $@ $@.old; \
288 289 290 291 292 293 294 295 296
	  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; \
297
	 else \
298 299
	  mv $@.tmp $@; \
	  cp -p $@ $@.old; \
300
	 fi,"GEN","$@");
301 302 303 304

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

305 306
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/Makefile.objs
307 308 309 310
endif

dummy := $(call unnest-vars,, \
                stub-obj-y \
M
Marc-André Lureau 已提交
311
                chardev-obj-y \
312 313
                util-obj-y \
                qga-obj-y \
314 315
                ivshmem-client-obj-y \
                ivshmem-server-obj-y \
M
Marc-André Lureau 已提交
316
                libvhost-user-obj-y \
317
                vhost-user-scsi-obj-y \
318
                qga-vss-dll-obj-y \
319
                block-obj-y \
320
                block-obj-m \
321 322
                crypto-obj-y \
                crypto-aes-obj-y \
323
                qom-obj-y \
324
                io-obj-y \
325
                common-obj-y \
326 327
                common-obj-m \
                trace-obj-y)
328

329
include $(SRC_PATH)/tests/Makefile.include
330

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

333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
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)
351 352 353 354 355
	$(call quiet-command, if ! cmp -s $@ $@.tmp; then \
	  mv $@.tmp $@; \
	 else \
	  rm $@.tmp; \
	 fi)
356

357 358
config-host.h: config-host.h-timestamp
config-host.h-timestamp: config-host.mak
359
qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
360
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
361

362
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
363 364
SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))

365
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
366
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
367
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
368
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
369

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

373
DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
374 375
DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
376

377
subdir-dtc: .git-submodule-status dtc/libfdt dtc/tests
378
	$(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,)
379 380 381 382

dtc/%:
	mkdir -p $@

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

P
Paul Brook 已提交
386
ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
387
# Only keep -O and -g cflags
P
Paul Brook 已提交
388
romsubdir-%:
389
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/" CFLAGS="$(filter -O% -g%,$(CFLAGS))",)
P
Paul Brook 已提交
390 391 392 393

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

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

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

398
Makefile: $(version-obj-y)
399 400

######################################################################
401
# Build libraries
402

P
Paolo Bonzini 已提交
403
libqemuutil.a: $(util-obj-y) $(trace-obj-y) $(stub-obj-y)
404
libvhost-user.a: $(libvhost-user-obj-y)
405

A
Alon Levy 已提交
406
######################################################################
B
bellard 已提交
407

P
Paolo Bonzini 已提交
408
COMMON_LDADDS = libqemuutil.a
409

J
Juan Quintela 已提交
410
qemu-img.o: qemu-img-cmds.h
411

412 413 414
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)
415

416
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
417

418
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
419 420
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

P
Paolo Bonzini 已提交
421
scsi/qemu-pr-helper$(EXESUF): scsi/qemu-pr-helper.o scsi/utils.o $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
422 423 424
ifdef CONFIG_MPATH
scsi/qemu-pr-helper$(EXESUF): LIBS += -ludev -lmultipath -lmpathpersist
endif
P
Paolo Bonzini 已提交
425

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

429
qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
430
qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
431

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

434 435
qapi-py = $(SRC_PATH)/scripts/qapi.py $(SRC_PATH)/scripts/ordereddict.py

436
qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h :\
437
$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
438
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
439
		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
440
		"GEN","$@")
441
qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h :\
442
$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
443
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
444
		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
445
		"GEN","$@")
446
qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c :\
447
$(SRC_PATH)/qga/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
448
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
449
		$(gen-out-type) -o qga/qapi-generated -p "qga-" $<, \
450
		"GEN","$@")
451

452
qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
453
               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
454
               $(SRC_PATH)/qapi/char.json \
455
               $(SRC_PATH)/qapi/crypto.json \
456
               $(SRC_PATH)/qapi/introspect.json \
457
               $(SRC_PATH)/qapi/migration.json \
458
               $(SRC_PATH)/qapi/net.json \
459
               $(SRC_PATH)/qapi/rocker.json \
460
               $(SRC_PATH)/qapi/run-state.json \
461
               $(SRC_PATH)/qapi/sockets.json \
462
               $(SRC_PATH)/qapi/tpm.json \
463
               $(SRC_PATH)/qapi/trace.json \
464
               $(SRC_PATH)/qapi/transaction.json \
465
               $(SRC_PATH)/qapi/ui.json
466

467
qapi-types.c qapi-types.h :\
468
$(qapi-modules) $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
469
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py \
470
		$(gen-out-type) -o "." -b $<, \
471
		"GEN","$@")
472
qapi-visit.c qapi-visit.h :\
473
$(qapi-modules) $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
474
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py \
475
		$(gen-out-type) -o "." -b $<, \
476
		"GEN","$@")
W
Wenchao Xia 已提交
477 478 479
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 \
480
		$(gen-out-type) -o "." $<, \
481
		"GEN","$@")
482
qmp-commands.h qmp-marshal.c :\
483
$(qapi-modules) $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
484
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py \
485
		$(gen-out-type) -o "." $<, \
486
		"GEN","$@")
487 488 489 490
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 "." $<, \
491
		"GEN","$@")
492

493
QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
494
$(qga-obj-y): $(QGALIB_GEN)
495

496
qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
497
	$(call LINK, $^)
M
Michael Roth 已提交
498

499 500 501
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

502
msi: $(QEMU_GA_MSI)
503

504
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
505 506 507

$(QEMU_GA_MSI): config-host.mak

508 509
$(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)" \
510
	wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
511 512
else
msi:
513
	@echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
514 515
endif

516 517 518 519 520
ifneq ($(EXESUF),)
.PHONY: qemu-ga
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
endif

521
ifdef CONFIG_IVSHMEM
522
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
523
	$(call LINK, $^)
524
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
525
	$(call LINK, $^)
526
endif
527
vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y) libvhost-user.a
528
	$(call LINK, $^)
529

530 531 532
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))), \
533
	"GEN","$@")
534

535
clean:
536
# avoid old build problems by removing potentially incorrect old files
537
	rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
538
	rm -f qemu-options.def
539
	rm -f *.msi
540
	find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} +
541
	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
P
Paolo Bonzini 已提交
542
	rm -f fsdev/*.pod scsi/*.pod
B
Blue Swirl 已提交
543
	rm -f qemu-img-cmds.h
544
	rm -f ui/shader/*-vert.h ui/shader/*-frag.h
545
	@# May not be present in GENERATED_FILES
546 547
	rm -f trace/generated-tracers-dtrace.dtrace*
	rm -f trace/generated-tracers-dtrace.h*
548
	rm -f $(foreach f,$(GENERATED_FILES),$(f) $(f)-timestamp)
S
Stefan Weil 已提交
549
	rm -rf qapi-generated
550
	rm -rf qga/qapi-generated
551
	for d in $(ALL_SUBDIRS); do \
M
Magnus Damm 已提交
552
	if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \
553
	rm -f $$d/qemu-options.def; \
B
bellard 已提交
554
        done
555
	rm -f $(SUBDIR_DEVICES_MAK) config-all-devices.mak
556

557 558 559 560 561 562 563
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 已提交
564
distclean: clean
565
	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
566 567
	rm -f config-all-devices.mak config-all-disas.mak config.status
	rm -f po/*.mo tests/qemu-iotests/common.env
M
Magnus Damm 已提交
568
	rm -f roms/seabios/config.mak roms/vgabios/config.mak
569
	rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps
B
Brad Hards 已提交
570 571
	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
572
	rm -f qemu-doc.vr qemu-doc.txt
573
	rm -f config.log
574
	rm -f linux-headers/asm
575 576 577 578 579 580
	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
581
	rm -f docs/qemu-block-drivers.7
P
Paolo Bonzini 已提交
582
	for d in $(TARGET_DIRS); do \
B
bellard 已提交
583
	rm -rf $$d || exit 1 ; \
B
updated  
bellard 已提交
584
        done
585
	rm -Rf .sdk
E
Ed Maste 已提交
586
	if test -f dtc/version_gen.h; then $(MAKE) $(DTC_MAKE_ARGS) clean; fi
B
bellard 已提交
587

B
bellard 已提交
588 589
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 \
590
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
591
bepo    cz
B
bellard 已提交
592

T
ths 已提交
593
ifdef INSTALL_BLOBS
594
BLOBS=bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \
595
vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin \
596
acpi-dsdt.aml \
597
ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin \
598 599
pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
600 601
efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
G
Gerd Hoffmann 已提交
602
efi-e1000e.rom efi-vmxnet3.rom \
A
Anthony Liguori 已提交
603
qemu-icon.bmp qemu_logo_no_text.svg \
604
bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
605
multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
606
s390-ccw.img s390-netboot.img \
607
spapr-rtas.bin slof.bin skiboot.lid \
608
palcode-clipper \
609 610
u-boot.e500 \
qemu_vga.ndrv
T
ths 已提交
611 612 613 614
else
BLOBS=
endif

615
install-doc: $(DOCS)
616
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
617
	$(INSTALL_DATA) qemu-doc.html "$(DESTDIR)$(qemu_docdir)"
618
	$(INSTALL_DATA) qemu-doc.txt "$(DESTDIR)$(qemu_docdir)"
619 620
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
621
ifdef CONFIG_POSIX
622
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
623
	$(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
624
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
625
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
626
	$(INSTALL_DATA) docs/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
627 628
ifneq ($(TOOLS),)
	$(INSTALL_DATA) qemu-img.1 "$(DESTDIR)$(mandir)/man1"
629 630
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
	$(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
631
endif
M
Marc-André Lureau 已提交
632 633
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
634 635 636
	$(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 已提交
637
endif
638
endif
639 640 641 642
ifdef CONFIG_VIRTFS
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
	$(INSTALL_DATA) fsdev/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
endif
643 644 645 646

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

647 648 649 650 651 652 653
install-localstatedir:
ifdef CONFIG_POSIX
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
endif
endif

654

655
install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstatedir
656
ifneq ($(TOOLS),)
657
	$(call install-prog,$(subst qemu-ga,qemu-ga$(EXESUF),$(TOOLS)),$(DESTDIR)$(bindir))
658
endif
659 660
ifneq ($(CONFIG_MODULES),)
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
661 662
	for s in $(modules-m:.mo=$(DSOSUF)); do \
		t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
663
		$(INSTALL_LIB) $$s "$$t"; \
664
		test -z "$(STRIP)" || $(STRIP) "$$t"; \
665 666
	done
endif
667
ifneq ($(HELPERS-y),)
668
	$(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
669
endif
T
ths 已提交
670 671
ifneq ($(BLOBS),)
	set -e; for x in $(BLOBS); do \
672
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
P
pbrook 已提交
673
	done
674 675 676
endif
ifeq ($(CONFIG_GTK),y)
	$(MAKE) -C po $@
T
ths 已提交
677
endif
678
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
679
	set -e; for x in $(KEYMAPS); do \
680
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
P
pbrook 已提交
681
	done
682
	$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
B
bellard 已提交
683
	for d in $(TARGET_DIRS); do \
684
	$(MAKE) $(SUBDIR_MAKEFLAGS) TARGET_DIR=$$d/ -C $$d $@ || exit 1 ; \
B
bellard 已提交
685
        done
B
bellard 已提交
686

B
bellard 已提交
687
# various test targets
B
bellard 已提交
688
test speed: all
A
Anthony Liguori 已提交
689
	$(MAKE) -C tests/tcg $@
690

F
Fam Zheng 已提交
691 692
.PHONY: ctags
ctags:
693
	rm -f tags
F
Fam Zheng 已提交
694 695
	find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +

A
Alexandre Bique 已提交
696
.PHONY: TAGS
697
TAGS:
698
	rm -f TAGS
D
David Gibson 已提交
699
	find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
700

B
bellard 已提交
701
cscope:
F
Fam Zheng 已提交
702 703 704
	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 已提交
705

706 707 708 709 710
# 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 $< > $@,\
711
		"VERT","$@")
712 713 714 715 716

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 $< > $@,\
717
		"FRAG","$@")
718

719 720 721
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \
	ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h

B
bellard 已提交
722
# documentation
723
MAKEINFO=makeinfo
724 725
MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
P
Paolo Bonzini 已提交
726
TEXI2PODFLAGS=$(MAKEINFOINCLUDES) "-DVERSION=$(VERSION)"
727
TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
728

729
docs/version.texi: $(SRC_PATH)/VERSION
730 731
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

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

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

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

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

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

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

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

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

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

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

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

766
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
767
qemu.1: qemu-option-trace.texi
768
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
769
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
770
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
771
qemu-ga.8: qemu-ga.texi
772
docs/qemu-block-drivers.7: docs/qemu-block-drivers.texi
M
Marc-André Lureau 已提交
773

774 775 776 777
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
778

779
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
780
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
781
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
782
	qemu-monitor-info.texi docs/qemu-block-drivers.texi
783

784 785 786 787
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
788

789 790 791 792
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
793 794


795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
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 已提交
818
	$(MAKE) install prefix=${INSTDIR}
819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842
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)" \
843
                -DDISPLAYVERSION="$(VERSION)" \
844 845 846 847 848 849 850
                $(SRC_PATH)/qemu.nsi
	rm -r ${INSTDIR}
ifdef SIGNCODE
	$(SIGNCODE) $(INSTALLER)
endif # SIGNCODE
endif # CONFIG_WIN

851 852
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
853
ifneq ($(wildcard config-host.mak),)
F
Fam Zheng 已提交
854
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
855
Makefile: $(GENERATED_FILES)
856
endif
857
endif
858

859 860 861 862
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
863
# Include automatically generated dependency files
864 865
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
866 867

include $(SRC_PATH)/tests/docker/Makefile.include
F
Fam Zheng 已提交
868
include $(SRC_PATH)/tests/vm/Makefile.include
869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891

.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 已提交
892
	@echo  '  vm-test         - Help about targets running tests inside VM'
893 894
	@echo  ''
	@echo  'Documentation targets:'
895
	@echo  '  html info pdf txt'
896 897 898 899
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
900
	@echo  '  installer       - Build NSIS-based installer for QEMU'
901 902 903 904 905 906
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'