Makefile 42.6 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
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
547 548
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

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

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

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

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

563 564 565 566 567 568 569 570 571 572 573
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 \
574
qga/qapi-generated/qga-qapi-commands.h qga/qapi-generated/qga-qapi-commands.c \
575 576 577
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 已提交
578
	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \
579 580 581
		-o qga/qapi-generated -p "qga-" $<, \
		"GEN","$(@:%-timestamp=%)")
	@>$@
582

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

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

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

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

689 690 691
ifdef QEMU_GA_MSI_ENABLED
QEMU_GA_MSI=qemu-ga-$(ARCH).msi

692
msi: $(QEMU_GA_MSI)
693

694
$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
695 696 697

$(QEMU_GA_MSI): config-host.mak

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

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

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

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

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

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

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

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

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

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

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

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

857

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

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

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

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

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

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 $< > $@,\
916
		"FRAG","$@")
917

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

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

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

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

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

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

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

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

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

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

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

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

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

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

974 975 976 977
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
978

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

985 986 987 988
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
989

990 991 992 993
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
994

995 996 997 998 999 1000 1001 1002 1003 1004
# 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
1005

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

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

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

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

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

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