Makefile 41.8 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
ifdef CONFIG_VIRTFS
361
DOCS+=fsdev/virtfs-proxy-helper.1
362
endif
363 364 365
else
DOCS=
endif
B
bellard 已提交
366

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

493 494 495 496 497 498 499 500 501 502 503 504 505
# 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
506
	$(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))
507

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

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

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

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

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

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

######################################################################
526
# Build libraries
527

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

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

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

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

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

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

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

545
fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
546 547
fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap

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

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

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

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

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

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

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

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

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

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

691
msi: $(QEMU_GA_MSI)
692

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

$(QEMU_GA_MSI): config-host.mak

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

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

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

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

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

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

B
bellard 已提交
779 780
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 \
781
common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr \
J
Jan Krupa 已提交
782
bepo    cz
B
bellard 已提交
783

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

806
install-doc: $(DOCS)
807
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
808
	$(INSTALL_DATA) qemu-doc.html "$(DESTDIR)$(qemu_docdir)"
809
	$(INSTALL_DATA) qemu-doc.txt "$(DESTDIR)$(qemu_docdir)"
810 811
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
812
ifdef CONFIG_POSIX
813
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
814
	$(INSTALL_DATA) qemu.1 "$(DESTDIR)$(mandir)/man1"
815
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
816
	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
817
	$(INSTALL_DATA) docs/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
818 819
ifneq ($(TOOLS),)
	$(INSTALL_DATA) qemu-img.1 "$(DESTDIR)$(mandir)/man1"
820 821
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
	$(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
822
endif
M
Marc-André Lureau 已提交
823 824
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
825 826 827
	$(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 已提交
828
endif
829
endif
830 831 832 833
ifdef CONFIG_VIRTFS
	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
	$(INSTALL_DATA) fsdev/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
endif
834 835 836 837

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

838 839 840 841 842 843 844
install-localstatedir:
ifdef CONFIG_POSIX
ifneq (,$(findstring qemu-ga,$(TOOLS)))
	$(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
endif
endif

845

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

F
Fam Zheng 已提交
878 879
.PHONY: ctags
ctags:
880
	rm -f tags
F
Fam Zheng 已提交
881 882
	find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +

A
Alexandre Bique 已提交
883
.PHONY: TAGS
884
TAGS:
885
	rm -f TAGS
D
David Gibson 已提交
886
	find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
887

B
bellard 已提交
888
cscope:
F
Fam Zheng 已提交
889 890 891
	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 已提交
892

893 894 895 896 897
# 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 $< > $@,\
898
		"VERT","$@")
899 900 901 902 903

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 $< > $@,\
904
		"FRAG","$@")
905

906
ui/shader.o: $(SRC_PATH)/ui/shader.c \
G
Gerd Hoffmann 已提交
907 908 909
	ui/shader/texture-blit-vert.h \
	ui/shader/texture-blit-flip-vert.h \
	ui/shader/texture-blit-frag.h
910

B
bellard 已提交
911
# documentation
912
MAKEINFO=makeinfo
913 914
MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
P
Paolo Bonzini 已提交
915
TEXI2PODFLAGS=$(MAKEINFOINCLUDES) "-DVERSION=$(VERSION)"
916
TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
917

918
docs/version.texi: $(SRC_PATH)/VERSION
919 920
	$(call quiet-command,echo "@set VERSION $(VERSION)" > $@,"GEN","$@")

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

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

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

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

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

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

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

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

947
docs/interop/qemu-qmp-qapi.texi: qapi/qapi-doc.texi
948
	@cp -p $< $@
949

950 951
docs/interop/qemu-ga-qapi.texi: qga/qapi-generated/qga-qapi-doc.texi
	@cp -p $< $@
952

953
qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi qemu-monitor-info.texi
954
qemu.1: qemu-option-trace.texi
955
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
956
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
957
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
M
Marc-André Lureau 已提交
958
qemu-ga.8: qemu-ga.texi
959
docs/qemu-block-drivers.7: docs/qemu-block-drivers.texi
M
Marc-André Lureau 已提交
960

961 962 963 964
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
965

966
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
967
	qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-option-trace.texi \
968
	qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
969
	qemu-monitor-info.texi docs/qemu-block-drivers.texi
970

971 972 973 974
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
975

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


982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
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 已提交
1005
	$(MAKE) install prefix=${INSTDIR}
1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
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)" \
1030
                -DDISPLAYVERSION="$(VERSION)" \
1031 1032 1033 1034 1035 1036 1037
                $(SRC_PATH)/qemu.nsi
	rm -r ${INSTDIR}
ifdef SIGNCODE
	$(SIGNCODE) $(INSTALLER)
endif # SIGNCODE
endif # CONFIG_WIN

1038 1039
# Add a dependency on the generated files, so that they are always
# rebuilt before other object files
1040
ifneq ($(wildcard config-host.mak),)
F
Fam Zheng 已提交
1041
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
1042
Makefile: $(GENERATED_FILES)
1043
endif
1044
endif
1045

1046 1047 1048 1049
.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
	$(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
	$(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)

B
bellard 已提交
1050
# Include automatically generated dependency files
1051 1052
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
F
Fam Zheng 已提交
1053 1054

include $(SRC_PATH)/tests/docker/Makefile.include
F
Fam Zheng 已提交
1055
include $(SRC_PATH)/tests/vm/Makefile.include
1056 1057 1058 1059 1060

.PHONY: help
help:
	@echo  'Generic targets:'
	@echo  '  all             - Build all'
1061 1062 1063
ifdef CONFIG_MODULES
	@echo  '  modules         - Build all modules'
endif
1064 1065 1066 1067 1068
	@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  ''
1069
	@$(if $(TARGET_DIRS), \
1070
		echo 'Architecture specific targets:'; \
1071
		$(foreach t, $(TARGET_DIRS), \
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
		printf "  %-30s - Build for %s\\n" $(patsubst %,subdir-%,$(t)) $(t);) \
		echo '')
	@echo  'Cleaning targets:'
	@echo  '  clean           - Remove most generated files but keep the config'
	@echo  '  distclean       - Remove all generated files'
	@echo  '  dist            - Build a distributable tarball'
	@echo  ''
	@echo  'Test targets:'
	@echo  '  check           - Run all tests (check-help for details)'
	@echo  '  docker          - Help about targets running tests inside Docker containers'
F
Fam Zheng 已提交
1082
	@echo  '  vm-test         - Help about targets running tests inside VM'
1083 1084
	@echo  ''
	@echo  'Documentation targets:'
1085
	@echo  '  html info pdf txt'
1086 1087 1088 1089
	@echo  '                  - Build documentation in specified format'
	@echo  ''
ifdef CONFIG_WIN32
	@echo  'Windows targets:'
1090
	@echo  '  installer       - Build NSIS-based installer for QEMU'
1091 1092 1093 1094 1095
ifdef QEMU_GA_MSI_ENABLED
	@echo  '  msi             - Build MSI-based installer for qemu-ga'
endif
	@echo  ''
endif
1096 1097
	@echo  '  $(MAKE) [targets]      (quiet build, default)'
	@echo  '  $(MAKE) V=1 [targets]  (verbose build)'