Makefile 42.7 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=.

9 10
UNCHECKED_GOALS := %clean TAGS cscope ctags dist \
    html info pdf txt \
11
    help check-help print-% \
12
    docker docker-% vm-test vm-build-%
F
Fam Zheng 已提交
13

14 15 16
print-%:
	@echo '$*=$($*)'

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

23 24 25 26
git-submodule-update:

.PHONY: git-submodule-update

27 28 29 30 31
git_module_status := $(shell \
  cd '$(SRC_PATH)' && \
  GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
  echo $$?; \
)
32 33

ifeq (1,$(git_module_status))
34 35 36 37 38 39 40 41 42 43
ifeq (no,$(GIT_UPDATE))
git-submodule-update:
	$(call quiet-command, \
            echo && \
            echo "GIT submodule checkout is out of date. Please run" && \
            echo "  scripts/git-submodule.sh update $(GIT_SUBMODULES)" && \
            echo "from the source directory checkout $(SRC_PATH)" && \
            echo && \
            exit 1)
else
44 45
git-submodule-update:
	$(call quiet-command, \
46
          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
47 48 49 50
          "GIT","$(GIT_SUBMODULES)")
endif
endif

51
.git-submodule-status: git-submodule-update config-host.mak
52

53 54 55 56 57 58
# 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 \
59
"$(MAKE) distclean && rm -rf *-linux-user *-softmmu" in your source tree)
60 61 62
endif
endif

63 64
CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
65
CONFIG_XEN := $(CONFIG_XEN_BACKEND)
66 67 68 69
CONFIG_ALL=y
-include config-all-devices.mak
-include config-all-disas.mak

70
config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios
71
	@echo $@ is out-of-date, running configure
72 73 74 75 76 77 78 79
	@# 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
80 81
else
config-host.mak:
F
Fam Zheng 已提交
82
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
83 84 85
	@echo "Please call configure before running make!"
	@exit 1
endif
86
endif
B
bellard 已提交
87

F
Fam Zheng 已提交
88 89
include $(SRC_PATH)/rules.mak

90
GENERATED_FILES = qemu-version.h config-host.h qemu-options.def
91 92
GENERATED_FILES += qapi/qapi-builtin-types.h qapi/qapi-builtin-types.c
GENERATED_FILES += qapi/qapi-types.h qapi/qapi-types.c
93 94 95 96 97 98
GENERATED_FILES += qapi/qapi-types-block-core.h qapi/qapi-types-block-core.c
GENERATED_FILES += qapi/qapi-types-block.h qapi/qapi-types-block.c
GENERATED_FILES += qapi/qapi-types-char.h qapi/qapi-types-char.c
GENERATED_FILES += qapi/qapi-types-common.h qapi/qapi-types-common.c
GENERATED_FILES += qapi/qapi-types-crypto.h qapi/qapi-types-crypto.c
GENERATED_FILES += qapi/qapi-types-introspect.h qapi/qapi-types-introspect.c
K
Kevin Wolf 已提交
99
GENERATED_FILES += qapi/qapi-types-job.h qapi/qapi-types-job.c
100
GENERATED_FILES += qapi/qapi-types-migration.h qapi/qapi-types-migration.c
101
GENERATED_FILES += qapi/qapi-types-misc.h qapi/qapi-types-misc.c
102 103 104 105 106 107 108 109
GENERATED_FILES += qapi/qapi-types-net.h qapi/qapi-types-net.c
GENERATED_FILES += qapi/qapi-types-rocker.h qapi/qapi-types-rocker.c
GENERATED_FILES += qapi/qapi-types-run-state.h qapi/qapi-types-run-state.c
GENERATED_FILES += qapi/qapi-types-sockets.h qapi/qapi-types-sockets.c
GENERATED_FILES += qapi/qapi-types-tpm.h qapi/qapi-types-tpm.c
GENERATED_FILES += qapi/qapi-types-trace.h qapi/qapi-types-trace.c
GENERATED_FILES += qapi/qapi-types-transaction.h qapi/qapi-types-transaction.c
GENERATED_FILES += qapi/qapi-types-ui.h qapi/qapi-types-ui.c
110 111
GENERATED_FILES += qapi/qapi-builtin-visit.h qapi/qapi-builtin-visit.c
GENERATED_FILES += qapi/qapi-visit.h qapi/qapi-visit.c
112 113 114 115 116 117
GENERATED_FILES += qapi/qapi-visit-block-core.h qapi/qapi-visit-block-core.c
GENERATED_FILES += qapi/qapi-visit-block.h qapi/qapi-visit-block.c
GENERATED_FILES += qapi/qapi-visit-char.h qapi/qapi-visit-char.c
GENERATED_FILES += qapi/qapi-visit-common.h qapi/qapi-visit-common.c
GENERATED_FILES += qapi/qapi-visit-crypto.h qapi/qapi-visit-crypto.c
GENERATED_FILES += qapi/qapi-visit-introspect.h qapi/qapi-visit-introspect.c
K
Kevin Wolf 已提交
118
GENERATED_FILES += qapi/qapi-visit-job.h qapi/qapi-visit-job.c
119
GENERATED_FILES += qapi/qapi-visit-migration.h qapi/qapi-visit-migration.c
120
GENERATED_FILES += qapi/qapi-visit-misc.h qapi/qapi-visit-misc.c
121 122 123 124 125 126 127 128
GENERATED_FILES += qapi/qapi-visit-net.h qapi/qapi-visit-net.c
GENERATED_FILES += qapi/qapi-visit-rocker.h qapi/qapi-visit-rocker.c
GENERATED_FILES += qapi/qapi-visit-run-state.h qapi/qapi-visit-run-state.c
GENERATED_FILES += qapi/qapi-visit-sockets.h qapi/qapi-visit-sockets.c
GENERATED_FILES += qapi/qapi-visit-tpm.h qapi/qapi-visit-tpm.c
GENERATED_FILES += qapi/qapi-visit-trace.h qapi/qapi-visit-trace.c
GENERATED_FILES += qapi/qapi-visit-transaction.h qapi/qapi-visit-transaction.c
GENERATED_FILES += qapi/qapi-visit-ui.h qapi/qapi-visit-ui.c
129
GENERATED_FILES += qapi/qapi-commands.h qapi/qapi-commands.c
130 131 132 133 134 135
GENERATED_FILES += qapi/qapi-commands-block-core.h qapi/qapi-commands-block-core.c
GENERATED_FILES += qapi/qapi-commands-block.h qapi/qapi-commands-block.c
GENERATED_FILES += qapi/qapi-commands-char.h qapi/qapi-commands-char.c
GENERATED_FILES += qapi/qapi-commands-common.h qapi/qapi-commands-common.c
GENERATED_FILES += qapi/qapi-commands-crypto.h qapi/qapi-commands-crypto.c
GENERATED_FILES += qapi/qapi-commands-introspect.h qapi/qapi-commands-introspect.c
K
Kevin Wolf 已提交
136
GENERATED_FILES += qapi/qapi-commands-job.h qapi/qapi-commands-job.c
137
GENERATED_FILES += qapi/qapi-commands-migration.h qapi/qapi-commands-migration.c
138
GENERATED_FILES += qapi/qapi-commands-misc.h qapi/qapi-commands-misc.c
139 140 141 142 143 144 145 146
GENERATED_FILES += qapi/qapi-commands-net.h qapi/qapi-commands-net.c
GENERATED_FILES += qapi/qapi-commands-rocker.h qapi/qapi-commands-rocker.c
GENERATED_FILES += qapi/qapi-commands-run-state.h qapi/qapi-commands-run-state.c
GENERATED_FILES += qapi/qapi-commands-sockets.h qapi/qapi-commands-sockets.c
GENERATED_FILES += qapi/qapi-commands-tpm.h qapi/qapi-commands-tpm.c
GENERATED_FILES += qapi/qapi-commands-trace.h qapi/qapi-commands-trace.c
GENERATED_FILES += qapi/qapi-commands-transaction.h qapi/qapi-commands-transaction.c
GENERATED_FILES += qapi/qapi-commands-ui.h qapi/qapi-commands-ui.c
147
GENERATED_FILES += qapi/qapi-events.h qapi/qapi-events.c
148 149 150 151 152 153
GENERATED_FILES += qapi/qapi-events-block-core.h qapi/qapi-events-block-core.c
GENERATED_FILES += qapi/qapi-events-block.h qapi/qapi-events-block.c
GENERATED_FILES += qapi/qapi-events-char.h qapi/qapi-events-char.c
GENERATED_FILES += qapi/qapi-events-common.h qapi/qapi-events-common.c
GENERATED_FILES += qapi/qapi-events-crypto.h qapi/qapi-events-crypto.c
GENERATED_FILES += qapi/qapi-events-introspect.h qapi/qapi-events-introspect.c
K
Kevin Wolf 已提交
154
GENERATED_FILES += qapi/qapi-events-job.h qapi/qapi-events-job.c
155
GENERATED_FILES += qapi/qapi-events-migration.h qapi/qapi-events-migration.c
156
GENERATED_FILES += qapi/qapi-events-misc.h qapi/qapi-events-misc.c
157 158 159 160 161 162 163 164
GENERATED_FILES += qapi/qapi-events-net.h qapi/qapi-events-net.c
GENERATED_FILES += qapi/qapi-events-rocker.h qapi/qapi-events-rocker.c
GENERATED_FILES += qapi/qapi-events-run-state.h qapi/qapi-events-run-state.c
GENERATED_FILES += qapi/qapi-events-sockets.h qapi/qapi-events-sockets.c
GENERATED_FILES += qapi/qapi-events-tpm.h qapi/qapi-events-tpm.c
GENERATED_FILES += qapi/qapi-events-trace.h qapi/qapi-events-trace.c
GENERATED_FILES += qapi/qapi-events-transaction.h qapi/qapi-events-transaction.c
GENERATED_FILES += qapi/qapi-events-ui.h qapi/qapi-events-ui.c
165 166
GENERATED_FILES += qapi/qapi-introspect.c qapi/qapi-introspect.h
GENERATED_FILES += qapi/qapi-doc.texi
167

168
GENERATED_FILES += trace/generated-tcg-tracers.h
169

170 171 172
GENERATED_FILES += trace/generated-helpers-wrappers.h
GENERATED_FILES += trace/generated-helpers.h
GENERATED_FILES += trace/generated-helpers.c
173

174
ifdef CONFIG_TRACE_UST
175 176
GENERATED_FILES += trace-ust-all.h
GENERATED_FILES += trace-ust-all.c
177 178
endif

179
GENERATED_FILES += module_block.h
180

181 182 183 184 185 186 187 188 189 190 191
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

192 193
GENERATED_FILES += $(TRACE_HEADERS)
GENERATED_FILES += $(TRACE_SOURCES)
194
GENERATED_FILES += $(BUILD_DIR)/trace-events-all
195
GENERATED_FILES += .git-submodule-status
196 197 198

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

199 200 201
tracetool-y = $(SRC_PATH)/scripts/tracetool.py
tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py")

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
%/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

303 304 305 306
KEYCODEMAP_GEN = $(SRC_PATH)/ui/keycodemapdb/tools/keymap-gen
KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv

KEYCODEMAP_FILES = \
307
		 ui/input-keymap-atset1-to-qcode.c \
308
		 ui/input-keymap-linux-to-qcode.c \
309 310 311
		 ui/input-keymap-qcode-to-atset1.c \
		 ui/input-keymap-qcode-to-atset2.c \
		 ui/input-keymap-qcode-to-atset3.c \
312
		 ui/input-keymap-qcode-to-linux.c \
313
		 ui/input-keymap-qcode-to-qnum.c \
314
		 ui/input-keymap-qcode-to-sun.c \
315
		 ui/input-keymap-qnum-to-qcode.c \
316
		 ui/input-keymap-usb-to-qcode.c \
317 318 319 320 321 322
		 ui/input-keymap-win32-to-qcode.c \
		 ui/input-keymap-x11-to-qcode.c \
		 ui/input-keymap-xorgevdev-to-qcode.c \
		 ui/input-keymap-xorgkbd-to-qcode.c \
		 ui/input-keymap-xorgxquartz-to-qcode.c \
		 ui/input-keymap-xorgxwin-to-qcode.c \
323
		 ui/input-keymap-osx-to-qcode.c \
324 325 326 327 328 329
		 $(NULL)

GENERATED_FILES += $(KEYCODEMAP_FILES)

ui/input-keymap-%.c: $(KEYCODEMAP_GEN) $(KEYCODEMAP_CSV) $(SRC_PATH)/ui/Makefile.objs
	$(call quiet-command,\
J
Jan Beulich 已提交
330
	    stem=$* && src=$${stem%-to-*} dst=$${stem#*-to-} && \
331 332 333 334 335 336 337 338 339 340
	    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

341 342 343 344 345
# Don't try to regenerate Makefile or configure
# We don't generate any of them
Makefile: ;
configure: ;

346
.PHONY: all clean cscope distclean html info install install-doc \
347
	pdf txt recurse-all dist msi FORCE
348

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

J
Juan Quintela 已提交
351
LIBS+=-lz $(LIBS_TOOLS)
352

353
HELPERS-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_LINUX)) = qemu-bridge-helper$(EXESUF)
354

355
ifdef BUILD_DOCS
356
DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8
357 358
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
359
DOCS+=docs/qemu-block-drivers.7
360
DOCS+=docs/qemu-cpu-models.7
361
ifdef CONFIG_VIRTFS
362
DOCS+=fsdev/virtfs-proxy-helper.1
363
endif
364 365 366
else
DOCS=
endif
B
bellard 已提交
367

368
SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR)
369 370
SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS))
SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_DIRS))
371

372 373
ifeq ($(SUBDIR_DEVICES_MAK),)
config-all-devices.mak:
374
	$(call quiet-command,echo '# no devices' > $@,"GEN","$@")
375
else
376
config-all-devices.mak: $(SUBDIR_DEVICES_MAK)
377 378 379
	$(call quiet-command, sed -n \
             's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
             $(SUBDIR_DEVICES_MAK) | sort -u > $@, \
380
             "GEN","$@")
381
endif
382

P
Paul Brook 已提交
383 384
-include $(SUBDIR_DEVICES_MAK_DEP)

385
%/config-devices.mak: default-configs/%.mak $(SRC_PATH)/scripts/make_device_config.sh
386
	$(call quiet-command, \
387
            $(SHELL) $(SRC_PATH)/scripts/make_device_config.sh $< $*-config-devices.mak.d $@ > $@.tmp,"GEN","$@.tmp")
388
	$(call quiet-command, if test -f $@; then \
389
	  if cmp -s $@.old $@; then \
P
Paul Brook 已提交
390 391
	    mv $@.tmp $@; \
	    cp -p $@ $@.old; \
392 393 394 395 396 397
	  else \
	    if test -f $@.old; then \
	      echo "WARNING: $@ (user modified) out of date.";\
	    else \
	      echo "WARNING: $@ out of date.";\
	    fi; \
398
	    echo "Run \"$(MAKE) defconfig\" to regenerate."; \
399 400
	    rm $@.tmp; \
	  fi; \
401
	 else \
402 403
	  mv $@.tmp $@; \
	  cp -p $@ $@.old; \
404
	 fi,"GEN","$@");
405 406 407 408

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

409 410
ifneq ($(wildcard config-host.mak),)
include $(SRC_PATH)/Makefile.objs
411 412 413 414
endif

dummy := $(call unnest-vars,, \
                stub-obj-y \
M
Marc-André Lureau 已提交
415
                chardev-obj-y \
416 417
                util-obj-y \
                qga-obj-y \
418 419
                ivshmem-client-obj-y \
                ivshmem-server-obj-y \
M
Marc-André Lureau 已提交
420
                libvhost-user-obj-y \
421
                vhost-user-scsi-obj-y \
422
                vhost-user-blk-obj-y \
423
                qga-vss-dll-obj-y \
424
                block-obj-y \
425
                block-obj-m \
426 427
                crypto-obj-y \
                crypto-aes-obj-y \
428
                qom-obj-y \
429
                io-obj-y \
430
                common-obj-y \
431
                common-obj-m \
G
Gerd Hoffmann 已提交
432 433 434 435
                ui-obj-y \
                ui-obj-m \
                audio-obj-y \
                audio-obj-m \
436
                trace-obj-y)
437

438
include $(SRC_PATH)/tests/Makefile.include
439

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

442 443 444 445
qemu-version.h: FORCE
	$(call quiet-command, \
		(cd $(SRC_PATH); \
		if test -n "$(PKGVERSION)"; then \
446
			pkgvers="$(PKGVERSION)"; \
447 448
		else \
			if test -d .git; then \
449
				pkgvers=$$(git describe --match 'v*' 2>/dev/null | tr -d '\n');\
450
				if ! git diff-index --quiet HEAD &>/dev/null; then \
451
					pkgvers="$${pkgvers}-dirty"; \
452 453
				fi; \
			fi; \
454 455 456 457 458 459 460 461
		fi; \
		printf "#define QEMU_PKGVERSION \"$${pkgvers}\"\n"; \
		if test -n "$${pkgvers}"; then \
			printf '#define QEMU_FULL_VERSION QEMU_VERSION " (" QEMU_PKGVERSION ")"\n'; \
		else \
			printf '#define QEMU_FULL_VERSION QEMU_VERSION\n'; \
		fi; \
		) > $@.tmp)
462 463 464 465 466
	$(call quiet-command, if ! cmp -s $@ $@.tmp; then \
	  mv $@.tmp $@; \
	 else \
	  rm $@.tmp; \
	 fi)
467

468 469
config-host.h: config-host.h-timestamp
config-host.h-timestamp: config-host.mak
470
qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
471
	$(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
472

473
SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
474 475
SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))

476
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
477
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
478
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
479
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
480

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

484
DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
485 486
DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
487

488
subdir-dtc: .git-submodule-status dtc/libfdt dtc/tests
489
	$(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,)
490

491
dtc/%: .git-submodule-status
492
	@mkdir -p $@
493

494 495 496 497 498 499 500 501 502 503 504 505 506
# Overriding CFLAGS causes us to lose defines added in the sub-makefile.
# Not overriding CFLAGS leads to mis-matches between compilation modes.
# Therefore we replicate some of the logic in the sub-makefile.
# Remove all the extra -Warning flags that QEMU uses that Capstone doesn't;
# no need to annoy QEMU developers with such things.
CAP_CFLAGS = $(patsubst -W%,,$(CFLAGS) $(QEMU_CFLAGS))
CAP_CFLAGS += -DCAPSTONE_USE_SYS_DYN_MEM
CAP_CFLAGS += -DCAPSTONE_HAS_ARM
CAP_CFLAGS += -DCAPSTONE_HAS_ARM64
CAP_CFLAGS += -DCAPSTONE_HAS_POWERPC
CAP_CFLAGS += -DCAPSTONE_HAS_X86

subdir-capstone: .git-submodule-status
507
	$(call quiet-command,$(MAKE) -C $(SRC_PATH)/capstone CAPSTONE_SHARED=no BUILDDIR="$(BUILD_DIR)/capstone" CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" CFLAGS="$(CAP_CFLAGS)" $(SUBDIR_MAKEFLAGS) $(BUILD_DIR)/capstone/$(LIBCAPSTONE))
508

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

P
Paul Brook 已提交
512
ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
513
# Only keep -O and -g cflags
P
Paul Brook 已提交
514
romsubdir-%:
515
	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/" CFLAGS="$(filter -O% -g%,$(CFLAGS))",)
P
Paul Brook 已提交
516

517
ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
P
Paul Brook 已提交
518 519

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

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

524
Makefile: $(version-obj-y)
525 526

######################################################################
527
# Build libraries
528

P
Paolo Bonzini 已提交
529
libqemuutil.a: $(util-obj-y) $(trace-obj-y) $(stub-obj-y)
530
libvhost-user.a: $(libvhost-user-obj-y)
531

A
Alon Levy 已提交
532
######################################################################
B
bellard 已提交
533

P
Paolo Bonzini 已提交
534
COMMON_LDADDS = libqemuutil.a
535

J
Juan Quintela 已提交
536
qemu-img.o: qemu-img-cmds.h
537

538 539 540
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)
541

542
qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
543

G
Gerd Hoffmann 已提交
544 545
qemu-keymap$(EXESUF): qemu-keymap.o ui/input-keymap.o $(COMMON_LDADDS)

546 547
qemu-edid$(EXESUF): qemu-edid.o hw/display/edid-generate.o $(COMMON_LDADDS)

548
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
549 550
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

P
Paolo Bonzini 已提交
551
scsi/qemu-pr-helper$(EXESUF): scsi/qemu-pr-helper.o scsi/utils.o $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
552 553 554
ifdef CONFIG_MPATH
scsi/qemu-pr-helper$(EXESUF): LIBS += -ludev -lmultipath -lmpathpersist
endif
P
Paolo Bonzini 已提交
555

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

559
qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
560
qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
561

G
Gerd Hoffmann 已提交
562 563 564
qemu-keymap$(EXESUF): LIBS += $(XKBCOMMON_LIBS)
qemu-keymap$(EXESUF): QEMU_CFLAGS += $(XKBCOMMON_CFLAGS)

565 566 567 568 569 570 571 572 573 574 575
qapi-py = $(SRC_PATH)/scripts/qapi/commands.py \
$(SRC_PATH)/scripts/qapi/events.py \
$(SRC_PATH)/scripts/qapi/introspect.py \
$(SRC_PATH)/scripts/qapi/types.py \
$(SRC_PATH)/scripts/qapi/visit.py \
$(SRC_PATH)/scripts/qapi/common.py \
$(SRC_PATH)/scripts/qapi/doc.py \
$(SRC_PATH)/scripts/qapi-gen.py

qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h \
qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h \
576
qga/qapi-generated/qga-qapi-commands.h qga/qapi-generated/qga-qapi-commands.c \
577 578 579
qga/qapi-generated/qga-qapi-doc.texi: \
qga/qapi-generated/qapi-gen-timestamp ;
qga/qapi-generated/qapi-gen-timestamp: $(SRC_PATH)/qga/qapi-schema.json $(qapi-py)
M
Matthias Maier 已提交
580
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \
581 582 583
		-o qga/qapi-generated -p "qga-" $<, \
		"GEN","$(@:%-timestamp=%)")
	@>$@
584

585
qapi-modules = $(SRC_PATH)/qapi/qapi-schema.json $(SRC_PATH)/qapi/common.json \
586
               $(SRC_PATH)/qapi/block.json $(SRC_PATH)/qapi/block-core.json \
587
               $(SRC_PATH)/qapi/char.json \
588
               $(SRC_PATH)/qapi/crypto.json \
589
               $(SRC_PATH)/qapi/introspect.json \
K
Kevin Wolf 已提交
590
               $(SRC_PATH)/qapi/job.json \
591
               $(SRC_PATH)/qapi/migration.json \
592
               $(SRC_PATH)/qapi/misc.json \
593
               $(SRC_PATH)/qapi/net.json \
594
               $(SRC_PATH)/qapi/rocker.json \
595
               $(SRC_PATH)/qapi/run-state.json \
596
               $(SRC_PATH)/qapi/sockets.json \
597
               $(SRC_PATH)/qapi/tpm.json \
598
               $(SRC_PATH)/qapi/trace.json \
599
               $(SRC_PATH)/qapi/transaction.json \
600
               $(SRC_PATH)/qapi/ui.json
601

602 603
qapi/qapi-builtin-types.c qapi/qapi-builtin-types.h \
qapi/qapi-types.c qapi/qapi-types.h \
604 605 606 607 608 609
qapi/qapi-types-block-core.c qapi/qapi-types-block-core.h \
qapi/qapi-types-block.c qapi/qapi-types-block.h \
qapi/qapi-types-char.c qapi/qapi-types-char.h \
qapi/qapi-types-common.c qapi/qapi-types-common.h \
qapi/qapi-types-crypto.c qapi/qapi-types-crypto.h \
qapi/qapi-types-introspect.c qapi/qapi-types-introspect.h \
K
Kevin Wolf 已提交
610
qapi/qapi-types-job.c qapi/qapi-types-job.h \
611
qapi/qapi-types-migration.c qapi/qapi-types-migration.h \
612
qapi/qapi-types-misc.c qapi/qapi-types-misc.h \
613 614 615 616 617 618 619 620
qapi/qapi-types-net.c qapi/qapi-types-net.h \
qapi/qapi-types-rocker.c qapi/qapi-types-rocker.h \
qapi/qapi-types-run-state.c qapi/qapi-types-run-state.h \
qapi/qapi-types-sockets.c qapi/qapi-types-sockets.h \
qapi/qapi-types-tpm.c qapi/qapi-types-tpm.h \
qapi/qapi-types-trace.c qapi/qapi-types-trace.h \
qapi/qapi-types-transaction.c qapi/qapi-types-transaction.h \
qapi/qapi-types-ui.c qapi/qapi-types-ui.h \
621 622
qapi/qapi-builtin-visit.c qapi/qapi-builtin-visit.h \
qapi/qapi-visit.c qapi/qapi-visit.h \
623 624 625 626 627 628
qapi/qapi-visit-block-core.c qapi/qapi-visit-block-core.h \
qapi/qapi-visit-block.c qapi/qapi-visit-block.h \
qapi/qapi-visit-char.c qapi/qapi-visit-char.h \
qapi/qapi-visit-common.c qapi/qapi-visit-common.h \
qapi/qapi-visit-crypto.c qapi/qapi-visit-crypto.h \
qapi/qapi-visit-introspect.c qapi/qapi-visit-introspect.h \
K
Kevin Wolf 已提交
629
qapi/qapi-visit-job.c qapi/qapi-visit-job.h \
630
qapi/qapi-visit-migration.c qapi/qapi-visit-migration.h \
631
qapi/qapi-visit-misc.c qapi/qapi-visit-misc.h \
632 633 634 635 636 637 638 639
qapi/qapi-visit-net.c qapi/qapi-visit-net.h \
qapi/qapi-visit-rocker.c qapi/qapi-visit-rocker.h \
qapi/qapi-visit-run-state.c qapi/qapi-visit-run-state.h \
qapi/qapi-visit-sockets.c qapi/qapi-visit-sockets.h \
qapi/qapi-visit-tpm.c qapi/qapi-visit-tpm.h \
qapi/qapi-visit-trace.c qapi/qapi-visit-trace.h \
qapi/qapi-visit-transaction.c qapi/qapi-visit-transaction.h \
qapi/qapi-visit-ui.c qapi/qapi-visit-ui.h \
640
qapi/qapi-commands.h qapi/qapi-commands.c \
641 642 643 644 645 646
qapi/qapi-commands-block-core.c qapi/qapi-commands-block-core.h \
qapi/qapi-commands-block.c qapi/qapi-commands-block.h \
qapi/qapi-commands-char.c qapi/qapi-commands-char.h \
qapi/qapi-commands-common.c qapi/qapi-commands-common.h \
qapi/qapi-commands-crypto.c qapi/qapi-commands-crypto.h \
qapi/qapi-commands-introspect.c qapi/qapi-commands-introspect.h \
K
Kevin Wolf 已提交
647
qapi/qapi-commands-job.c qapi/qapi-commands-job.h \
648
qapi/qapi-commands-migration.c qapi/qapi-commands-migration.h \
649
qapi/qapi-commands-misc.c qapi/qapi-commands-misc.h \
650 651 652 653 654 655 656 657
qapi/qapi-commands-net.c qapi/qapi-commands-net.h \
qapi/qapi-commands-rocker.c qapi/qapi-commands-rocker.h \
qapi/qapi-commands-run-state.c qapi/qapi-commands-run-state.h \
qapi/qapi-commands-sockets.c qapi/qapi-commands-sockets.h \
qapi/qapi-commands-tpm.c qapi/qapi-commands-tpm.h \
qapi/qapi-commands-trace.c qapi/qapi-commands-trace.h \
qapi/qapi-commands-transaction.c qapi/qapi-commands-transaction.h \
qapi/qapi-commands-ui.c qapi/qapi-commands-ui.h \
658
qapi/qapi-events.c qapi/qapi-events.h \
659 660 661 662 663 664
qapi/qapi-events-block-core.c qapi/qapi-events-block-core.h \
qapi/qapi-events-block.c qapi/qapi-events-block.h \
qapi/qapi-events-char.c qapi/qapi-events-char.h \
qapi/qapi-events-common.c qapi/qapi-events-common.h \
qapi/qapi-events-crypto.c qapi/qapi-events-crypto.h \
qapi/qapi-events-introspect.c qapi/qapi-events-introspect.h \
K
Kevin Wolf 已提交
665
qapi/qapi-events-job.c qapi/qapi-events-job.h \
666
qapi/qapi-events-migration.c qapi/qapi-events-migration.h \
667
qapi/qapi-events-misc.c qapi/qapi-events-misc.h \
668 669 670 671 672 673 674 675
qapi/qapi-events-net.c qapi/qapi-events-net.h \
qapi/qapi-events-rocker.c qapi/qapi-events-rocker.h \
qapi/qapi-events-run-state.c qapi/qapi-events-run-state.h \
qapi/qapi-events-sockets.c qapi/qapi-events-sockets.h \
qapi/qapi-events-tpm.c qapi/qapi-events-tpm.h \
qapi/qapi-events-trace.c qapi/qapi-events-trace.h \
qapi/qapi-events-transaction.c qapi/qapi-events-transaction.h \
qapi/qapi-events-ui.c qapi/qapi-events-ui.h \
676 677
qapi/qapi-introspect.h qapi/qapi-introspect.c \
qapi/qapi-doc.texi: \
678 679
qapi-gen-timestamp ;
qapi-gen-timestamp: $(qapi-modules) $(qapi-py)
M
Matthias Maier 已提交
680
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \
681
		-o "qapi" -b $<, \
682 683
		"GEN","$(@:%-timestamp=%)")
	@>$@
684

685
QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qapi-commands.h)
686
$(qga-obj-y): $(QGALIB_GEN)
687

688
qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
689
	$(call LINK, $^)
M
Michael Roth 已提交
690

691 692 693
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

694
msi: $(QEMU_GA_MSI)
695

696
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
697 698 699

$(QEMU_GA_MSI): config-host.mak

700 701
$(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)" \
702
	wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
703 704
else
msi:
705
	@echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
706 707
endif

708 709 710 711 712
ifneq ($(EXESUF),)
.PHONY: qemu-ga
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
endif

713
ifdef CONFIG_IVSHMEM
714
ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
715
	$(call LINK, $^)
716
ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
717
	$(call LINK, $^)
718
endif
719
vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y) libvhost-user.a
720
	$(call LINK, $^)
721 722
vhost-user-blk$(EXESUF): $(vhost-user-blk-obj-y) libvhost-user.a
	$(call LINK, $^)
723

724 725 726
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))), \
727
	"GEN","$@")
728

729 730 731 732 733 734 735 736
ifdef CONFIG_GCOV
.PHONY: clean-coverage
clean-coverage:
	$(call quiet-command, \
		find . \( -name '*.gcda' -o -name '*.gcov' \) -type f -exec rm {} +, \
		"CLEAN", "coverage files")
endif

737
clean:
738
# avoid old build problems by removing potentially incorrect old files
739
	rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
740
	rm -f qemu-options.def
741
	rm -f *.msi
742
	find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} +
743
	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
P
Paolo Bonzini 已提交
744
	rm -f fsdev/*.pod scsi/*.pod
B
Blue Swirl 已提交
745
	rm -f qemu-img-cmds.h
746
	rm -f ui/shader/*-vert.h ui/shader/*-frag.h
747
	@# May not be present in GENERATED_FILES
748 749
	rm -f trace/generated-tracers-dtrace.dtrace*
	rm -f trace/generated-tracers-dtrace.h*
750
	rm -f $(foreach f,$(GENERATED_FILES),$(f) $(f)-timestamp)
751
	rm -f qapi-gen-timestamp
752
	rm -rf qga/qapi-generated
753
	for d in $(ALL_SUBDIRS); do \
M
Magnus Damm 已提交
754
	if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \
755
	rm -f $$d/qemu-options.def; \
B
bellard 已提交
756
        done
757
	rm -f config-all-devices.mak
758

759 760 761 762 763 764 765
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 已提交
766
distclean: clean
767
	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
768
	rm -f config-all-devices.mak config-all-disas.mak config.status
769
	rm -f $(SUBDIR_DEVICES_MAK)
770
	rm -f po/*.mo tests/qemu-iotests/common.env
M
Magnus Damm 已提交
771
	rm -f roms/seabios/config.mak roms/vgabios/config.mak
772
	rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps
B
Brad Hards 已提交
773 774
	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
775
	rm -f qemu-doc.vr qemu-doc.txt
776
	rm -f config.log
777
	rm -f linux-headers/asm
778 779 780 781 782 783
	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
784
	rm -f docs/qemu-block-drivers.7
785
	rm -f docs/qemu-cpu-models.7
786
	for d in $(TARGET_DIRS); do \
B
bellard 已提交
787
	rm -rf $$d || exit 1 ; \
B
updated  
bellard 已提交
788
        done
789
	rm -Rf .sdk
E
Ed Maste 已提交
790
	if test -f dtc/version_gen.h; then $(MAKE) $(DTC_MAKE_ARGS) clean; fi
B
bellard 已提交
791

B
bellard 已提交
792 793
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 \
794
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
795
bepo    cz
B
bellard 已提交
796

T
ths 已提交
797
ifdef INSTALL_BLOBS
798
BLOBS=bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \
799
vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin \
800
ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin \
801 802
pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
803 804
efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
G
Gerd Hoffmann 已提交
805
efi-e1000e.rom efi-vmxnet3.rom \
A
Anthony Liguori 已提交
806
qemu-icon.bmp qemu_logo_no_text.svg \
B
BALATON Zoltan 已提交
807
bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
808
multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
809
s390-ccw.img s390-netboot.img \
810
spapr-rtas.bin slof.bin skiboot.lid \
811
palcode-clipper \
812
u-boot.e500 u-boot-sam460-20100605.bin \
813 814
qemu_vga.ndrv \
hppa-firmware.img
T
ths 已提交
815 816 817 818
else
BLOBS=
endif

819
install-doc: $(DOCS)
820
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
821
	$(INSTALL_DATA) qemu-doc.html "$(DESTDIR)$(qemu_docdir)"
822
	$(INSTALL_DATA) qemu-doc.txt "$(DESTDIR)$(qemu_docdir)"
823 824
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
825
ifdef CONFIG_POSIX
826
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
827
	$(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
828
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
829
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
830
	$(INSTALL_DATA) docs/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
831
	$(INSTALL_DATA) docs/qemu-cpu-models.7 "$(DESTDIR)$(mandir)/man7"
832 833
ifneq ($(TOOLS),)
	$(INSTALL_DATA) qemu-img.1 "$(DESTDIR)$(mandir)/man1"
834 835
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
	$(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
836
endif
M
Marc-André Lureau 已提交
837 838
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
839 840 841
	$(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 已提交
842
endif
843
endif
844 845 846 847
ifdef CONFIG_VIRTFS
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
	$(INSTALL_DATA) fsdev/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
endif
848 849 850 851

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

852 853 854 855 856 857 858
install-localstatedir:
ifdef CONFIG_POSIX
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
endif
endif

859

860
install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstatedir
861
ifneq ($(TOOLS),)
862
	$(call install-prog,$(subst qemu-ga,qemu-ga$(EXESUF),$(TOOLS)),$(DESTDIR)$(bindir))
863
endif
864 865
ifneq ($(CONFIG_MODULES),)
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
866 867
	for s in $(modules-m:.mo=$(DSOSUF)); do \
		t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
868
		$(INSTALL_LIB) $$s "$$t"; \
869
		test -z "$(STRIP)" || $(STRIP) "$$t"; \
870 871
	done
endif
872
ifneq ($(HELPERS-y),)
873
	$(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
874
endif
T
ths 已提交
875 876
ifneq ($(BLOBS),)
	set -e; for x in $(BLOBS); do \
877
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
P
pbrook 已提交
878
	done
879
endif
880
ifdef CONFIG_GTK
881
	$(MAKE) -C po $@
T
ths 已提交
882
endif
883
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
884
	set -e; for x in $(KEYMAPS); do \
885
		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
P
pbrook 已提交
886
	done
887
	$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
888
	for d in $(TARGET_DIRS); do \
889
	$(MAKE) $(SUBDIR_MAKEFLAGS) TARGET_DIR=$$d/ -C $$d $@ || exit 1 ; \
B
bellard 已提交
890
        done
B
bellard 已提交
891

F
Fam Zheng 已提交
892 893
.PHONY: ctags
ctags:
894
	rm -f tags
F
Fam Zheng 已提交
895 896
	find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +

A
Alexandre Bique 已提交
897
.PHONY: TAGS
898
TAGS:
899
	rm -f TAGS
D
David Gibson 已提交
900
	find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
901

B
bellard 已提交
902
cscope:
F
Fam Zheng 已提交
903 904 905
	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 已提交
906

907 908 909 910 911
# 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 $< > $@,\
912
		"VERT","$@")
913 914 915 916 917

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 $< > $@,\
918
		"FRAG","$@")
919

920
ui/shader.o: $(SRC_PATH)/ui/shader.c \
G
Gerd Hoffmann 已提交
921 922 923
	ui/shader/texture-blit-vert.h \
	ui/shader/texture-blit-flip-vert.h \
	ui/shader/texture-blit-frag.h
924

B
bellard 已提交
925
# documentation
926
MAKEINFO=makeinfo
927 928
MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
P
Paolo Bonzini 已提交
929
TEXI2PODFLAGS=$(MAKEINFOINCLUDES) "-DVERSION=$(VERSION)"
930
TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
931

932
docs/version.texi: $(SRC_PATH)/VERSION
933 934
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

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

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

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

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

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

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

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

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

961
docs/interop/qemu-qmp-qapi.texi: qapi/qapi-doc.texi
962
	@cp -p $< $@
963

964 965
docs/interop/qemu-ga-qapi.texi: qga/qapi-generated/qga-qapi-doc.texi
	@cp -p $< $@
966

967
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
968
qemu.1: qemu-option-trace.texi
969
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
970
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
971
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
972
qemu-ga.8: qemu-ga.texi
973
docs/qemu-block-drivers.7: docs/qemu-block-drivers.texi
974
docs/qemu-cpu-models.7: docs/qemu-cpu-models.texi
M
Marc-André Lureau 已提交
975

976 977 978 979
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
980

981
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
982
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
983
	qemu-deprecated.texi qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
984 985
	qemu-monitor-info.texi docs/qemu-block-drivers.texi \
	docs/qemu-cpu-models.texi
986

987 988 989 990
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
991

992 993 994 995
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
996

997 998 999 1000 1001 1002 1003 1004 1005 1006
# Reports/Analysis

%/coverage-report.html:
	@mkdir -p $*
	$(call quiet-command,\
		gcovr -p --html --html-details -o $@, \
		"GEN", "coverage-report.html")

.PHONY: coverage-report
coverage-report: $(CURDIR)/reports/coverage/coverage-report.html
1007

1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
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 已提交
1031
	$(MAKE) install prefix=${INSTDIR}
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
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)" \
1056
                -DDISPLAYVERSION="$(VERSION)" \
1057 1058 1059 1060 1061 1062 1063
                $(SRC_PATH)/qemu.nsi
	rm -r ${INSTDIR}
ifdef SIGNCODE
	$(SIGNCODE) $(INSTALLER)
endif # SIGNCODE
endif # CONFIG_WIN

1064 1065
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
1066
ifneq ($(wildcard config-host.mak),)
F
Fam Zheng 已提交
1067
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
1068
Makefile: $(GENERATED_FILES)
1069
endif
1070
endif
1071

1072 1073 1074 1075
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
1076
# Include automatically generated dependency files
1077 1078
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
1079 1080

include $(SRC_PATH)/tests/docker/Makefile.include
F
Fam Zheng 已提交
1081
include $(SRC_PATH)/tests/vm/Makefile.include
1082 1083 1084 1085 1086

.PHONY: help
help:
	@echo  'Generic targets:'
	@echo  '  all             - Build all'
1087 1088 1089
ifdef CONFIG_MODULES
	@echo  '  modules         - Build all modules'
endif
1090 1091 1092 1093 1094
	@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  ''
1095
	@$(if $(TARGET_DIRS), \
1096
		echo 'Architecture specific targets:'; \
1097
		$(foreach t, $(TARGET_DIRS), \
1098 1099 1100 1101
		printf "  %-30s - Build for %s\\n" $(patsubst %,subdir-%,$(t)) $(t);) \
		echo '')
	@echo  'Cleaning targets:'
	@echo  '  clean           - Remove most generated files but keep the config'
1102 1103 1104
ifdef CONFIG_GCOV
	@echo  '  clean-coverage  - Remove coverage files'
endif
1105 1106 1107 1108 1109 1110
	@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 已提交
1111
	@echo  '  vm-test         - Help about targets running tests inside VM'
1112 1113
	@echo  ''
	@echo  'Documentation targets:'
1114
	@echo  '  html info pdf txt'
1115
	@echo  '                  - Build documentation in specified format'
1116 1117 1118
ifdef CONFIG_GCOV
	@echo  '  coverage-report - Create code coverage report'
endif
1119 1120 1121
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
1122
	@echo  '  installer       - Build NSIS-based installer for QEMU'
1123 1124 1125 1126 1127
ifdef QEMU_GA_MSI_ENABLED
	@echo  '  msi             - Build MSI-based installer for qemu-ga'
endif
	@echo  ''
endif
1128 1129
	@echo  '  $(MAKE) [targets]      (quiet build, default)'
	@echo  '  $(MAKE) V=1 [targets]  (verbose build)'