blob: 34275f57c9cbe180dd42bf98b300f1eec541c0b3 [file] [log] [blame]
pbrook0cb3fb12006-05-14 12:07:53 +00001# Makefile for QEMU.
2
Antonio Ospite4ace32e2019-05-26 16:47:47 +02003ifneq ($(words $(subst :, ,$(CURDIR))), 1)
4 $(error main directory cannot contain spaces nor colons)
5endif
6
Stefan Weil519e1692011-09-16 21:50:43 +02007# Always point to the root of the build tree (needs GNU make).
8BUILD_DIR=$(CURDIR)
Lluís Vilanova388d4752011-09-15 22:45:35 +02009
Fam Zhengeaa2ddb2015-05-22 13:35:07 +080010# Before including a proper config-host.mak, assume we are in the source tree
11SRC_PATH=.
12
Philippe Mathieu-Daudé28fa2922017-11-21 00:22:47 -030013UNCHECKED_GOALS := %clean TAGS cscope ctags dist \
14 html info pdf txt \
Marc-André Lureaude1da442018-01-04 17:05:08 +010015 help check-help print-% \
Philippe Mathieu-Daudé4f2f6272019-05-31 08:43:41 +020016 docker docker-% vm-help vm-test vm-build-%
Fam Zhengeaa2ddb2015-05-22 13:35:07 +080017
Lluís Vilanova250b0862012-03-06 19:50:38 +010018# All following code might depend on configuration variables
aurel3255d7e8f2009-04-15 14:42:57 +000019ifneq ($(wildcard config-host.mak),)
Paul Brook1ad21342009-05-19 16:17:58 +010020# Put the all: rule here so that config-host.mak can contain dependencies.
Stefan Weil8f67aa82012-07-09 20:36:36 +020021all:
pbrookad064842006-04-16 12:41:07 +000022include config-host.mak
Peter Maydelld1bd2422012-10-19 14:54:23 +010023
Daniel P. Berrangeaef45d52017-09-29 11:11:56 +010024git-submodule-update:
25
26.PHONY: git-submodule-update
27
Daniel P. Berrangec4b01c72017-11-06 11:08:14 +000028git_module_status := $(shell \
29 cd '$(SRC_PATH)' && \
30 GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
31 echo $$?; \
32)
Daniel P. Berrangeaef45d52017-09-29 11:11:56 +010033
34ifeq (1,$(git_module_status))
Daniel P. Berrangef62bbee2017-10-26 13:52:26 +010035ifeq (no,$(GIT_UPDATE))
36git-submodule-update:
37 $(call quiet-command, \
38 echo && \
39 echo "GIT submodule checkout is out of date. Please run" && \
40 echo " scripts/git-submodule.sh update $(GIT_SUBMODULES)" && \
41 echo "from the source directory checkout $(SRC_PATH)" && \
42 echo && \
43 exit 1)
44else
Daniel P. Berrangeaef45d52017-09-29 11:11:56 +010045git-submodule-update:
46 $(call quiet-command, \
Daniel P. Berrangecc84d632017-10-20 15:02:43 +010047 (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
Daniel P. Berrangeaef45d52017-09-29 11:11:56 +010048 "GIT","$(GIT_SUBMODULES)")
49endif
50endif
51
Daniel P. Berrange92712822017-09-29 11:11:58 +010052.git-submodule-status: git-submodule-update config-host.mak
Daniel P. Berrangeaef45d52017-09-29 11:11:56 +010053
Peter Maydelld1bd2422012-10-19 14:54:23 +010054# Check that we're not trying to do an out-of-tree build from
55# a tree that's been used for an in-tree build.
56ifneq ($(realpath $(SRC_PATH)),$(realpath .))
57ifneq ($(wildcard $(SRC_PATH)/config-host.mak),)
58$(error This is an out of tree build but your source tree ($(SRC_PATH)) \
59seems to have been used for an in-tree build. You can fix this by running \
Philippe Mathieu-Daudéb98a3ba2017-11-21 06:55:10 -030060"$(MAKE) distclean && rm -rf *-linux-user *-softmmu" in your source tree)
Peter Maydelld1bd2422012-10-19 14:54:23 +010061endif
62endif
63
Alex Bennée2b1f35b2018-07-04 07:30:11 +010064CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y)
65CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y)
Stefano Stabellini6b827cc2017-03-16 13:01:50 -070066CONFIG_XEN := $(CONFIG_XEN_BACKEND)
Paolo Bonzinif3aa8442013-04-16 10:50:38 +020067CONFIG_ALL=y
68-include config-all-devices.mak
69-include config-all-disas.mak
70
Markus Armbruster3a6b0162018-12-14 09:47:54 +010071config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION
Juan Quintelae5efe7f2009-10-07 02:40:59 +020072 @echo $@ is out-of-date, running configure
Markus Armbrustercdb69b02019-05-28 10:23:05 +020073 @./config.status
Emilio G. Cota26fffe22018-10-21 13:56:29 -040074
75# Force configure to re-run if the API symbols are updated
76ifeq ($(CONFIG_PLUGIN),y)
77config-host.mak: $(SRC_PATH)/plugins/qemu-plugins.symbols
78endif
79
aurel3255d7e8f2009-04-15 14:42:57 +000080else
81config-host.mak:
Fam Zhengeaa2ddb2015-05-22 13:35:07 +080082ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
aurel3255d7e8f2009-04-15 14:42:57 +000083 @echo "Please call configure before running make!"
84 @exit 1
85endif
Mike Frysinger7748b8c2012-09-16 16:07:13 -040086endif
bellard766a4872003-02-18 23:35:48 +000087
Fam Zhengfb57c882016-06-01 12:25:16 +080088include $(SRC_PATH)/rules.mak
89
Paolo Bonzinic932ce32019-07-18 12:24:29 +020090# lor is defined in rules.mak
Laurent Vivier29de2802019-04-01 16:12:22 +020091CONFIG_BLOCK := $(call lor,$(CONFIG_SOFTMMU),$(CONFIG_TOOLS))
92
Peter Maydell57b49732019-03-07 14:26:47 +000093# Create QEMU_PKGVERSION and FULL_VERSION strings
94# If PKGVERSION is set, use that; otherwise get version and -dirty status from git
95QEMU_PKGVERSION := $(if $(PKGVERSION),$(PKGVERSION),$(shell \
96 cd $(SRC_PATH); \
97 if test -e .git; then \
98 git describe --match 'v*' 2>/dev/null | tr -d '\n'; \
99 if ! git diff-index --quiet HEAD &>/dev/null; then \
100 echo "-dirty"; \
101 fi; \
102 fi))
103
104# Either "version (pkgversion)", or just "version" if pkgversion not set
105FULL_VERSION := $(if $(QEMU_PKGVERSION),$(VERSION) ($(QEMU_PKGVERSION)),$(VERSION))
106
Laurent Vivier3dff1992019-04-01 16:12:19 +0200107generated-files-y = qemu-version.h config-host.h qemu-options.def
Eric Blakebf582c32018-11-16 14:00:16 -0600108
Eric Blakebf582c32018-11-16 14:00:16 -0600109GENERATED_QAPI_FILES = qapi/qapi-builtin-types.h qapi/qapi-builtin-types.c
110GENERATED_QAPI_FILES += qapi/qapi-types.h qapi/qapi-types.c
111GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-types-%.h)
112GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-types-%.c)
113GENERATED_QAPI_FILES += qapi/qapi-builtin-visit.h qapi/qapi-builtin-visit.c
114GENERATED_QAPI_FILES += qapi/qapi-visit.h qapi/qapi-visit.c
115GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-visit-%.h)
116GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-visit-%.c)
Markus Armbruster00ca24f2019-11-20 19:25:48 +0100117GENERATED_QAPI_FILES += qapi/qapi-init-commands.h qapi/qapi-init-commands.c
Eric Blakebf582c32018-11-16 14:00:16 -0600118GENERATED_QAPI_FILES += qapi/qapi-commands.h qapi/qapi-commands.c
119GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-commands-%.h)
120GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-commands-%.c)
Markus Armbruster5d756482019-02-14 16:22:38 +0100121GENERATED_QAPI_FILES += qapi/qapi-emit-events.h qapi/qapi-emit-events.c
Eric Blakebf582c32018-11-16 14:00:16 -0600122GENERATED_QAPI_FILES += qapi/qapi-events.h qapi/qapi-events.c
123GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-events-%.h)
124GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-events-%.c)
125GENERATED_QAPI_FILES += qapi/qapi-introspect.c qapi/qapi-introspect.h
126GENERATED_QAPI_FILES += qapi/qapi-doc.texi
127
Kevin Wolf2af282e2020-02-24 15:30:08 +0100128# The following list considers only the storage daemon main module. All other
129# modules are currently shared with the main schema, so we don't actually
130# generate additional files.
131
132GENERATED_STORAGE_DAEMON_QAPI_FILES = storage-daemon/qapi/qapi-commands.h
133GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-commands.c
134GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-emit-events.h
135GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-emit-events.c
136GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-events.h
137GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-events.c
138GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-init-commands.h
139GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-init-commands.c
140GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-introspect.h
141GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-introspect.c
142GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-types.h
143GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-types.c
144GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-visit.h
145GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-visit.c
146GENERATED_STORAGE_DAEMON_QAPI_FILES += storage-daemon/qapi/qapi-doc.texi
147
Laurent Vivier3dff1992019-04-01 16:12:19 +0200148generated-files-y += $(GENERATED_QAPI_FILES)
Kevin Wolf2af282e2020-02-24 15:30:08 +0100149generated-files-y += $(GENERATED_STORAGE_DAEMON_QAPI_FILES)
Lluís Vilanovaeac236e2012-12-14 20:13:09 +0100150
Laurent Vivier3dff1992019-04-01 16:12:19 +0200151generated-files-y += trace/generated-tcg-tracers.h
Lluís Vilanova465830f2014-05-30 14:12:13 +0200152
Laurent Vivier3dff1992019-04-01 16:12:19 +0200153generated-files-y += trace/generated-helpers-wrappers.h
154generated-files-y += trace/generated-helpers.h
155generated-files-y += trace/generated-helpers.c
Lluís Vilanova707c8a92014-05-30 14:11:50 +0200156
Laurent Vivier3dff1992019-04-01 16:12:19 +0200157generated-files-$(CONFIG_TRACE_UST) += trace-ust-all.h
158generated-files-$(CONFIG_TRACE_UST) += trace-ust-all.c
Mohamad Gebaie6bf23f2014-01-29 22:47:56 -0500159
Laurent Vivier3dff1992019-04-01 16:12:19 +0200160generated-files-y += module_block.h
Marc Mari0c0c1fd2016-08-12 09:27:02 -0400161
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000162TRACE_HEADERS = trace-root.h $(trace-events-subdirs:%=%/trace.h)
163TRACE_SOURCES = trace-root.c $(trace-events-subdirs:%=%/trace.c)
164TRACE_DTRACE =
165ifdef CONFIG_TRACE_DTRACE
166TRACE_HEADERS += trace-dtrace-root.h $(trace-events-subdirs:%=%/trace-dtrace.h)
167TRACE_DTRACE += trace-dtrace-root.dtrace $(trace-events-subdirs:%=%/trace-dtrace.dtrace)
168endif
169ifdef CONFIG_TRACE_UST
170TRACE_HEADERS += trace-ust-root.h $(trace-events-subdirs:%=%/trace-ust.h)
171endif
172
Laurent Vivier3dff1992019-04-01 16:12:19 +0200173generated-files-y += $(TRACE_HEADERS)
174generated-files-y += $(TRACE_SOURCES)
175generated-files-y += $(BUILD_DIR)/trace-events-all
176generated-files-y += .git-submodule-status
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000177
178trace-group-name = $(shell dirname $1 | sed -e 's/[^a-zA-Z0-9]/_/g')
179
Daniel P. Berrange8755b4a2017-03-15 12:34:21 +0000180tracetool-y = $(SRC_PATH)/scripts/tracetool.py
181tracetool-y += $(shell find $(SRC_PATH)/scripts/tracetool -name "*.py")
182
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000183%/trace.h: %/trace.h-timestamp
184 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800185%/trace.h-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000186 $(call quiet-command,$(TRACETOOL) \
187 --group=$(call trace-group-name,$@) \
188 --format=h \
189 --backends=$(TRACE_BACKENDS) \
190 $< > $@,"GEN","$(@:%-timestamp=%)")
191
192%/trace.c: %/trace.c-timestamp
193 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800194%/trace.c-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000195 $(call quiet-command,$(TRACETOOL) \
196 --group=$(call trace-group-name,$@) \
197 --format=c \
198 --backends=$(TRACE_BACKENDS) \
199 $< > $@,"GEN","$(@:%-timestamp=%)")
200
201%/trace-ust.h: %/trace-ust.h-timestamp
202 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800203%/trace-ust.h-timestamp: $(SRC_PATH)/%/trace-events $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000204 $(call quiet-command,$(TRACETOOL) \
205 --group=$(call trace-group-name,$@) \
206 --format=ust-events-h \
207 --backends=$(TRACE_BACKENDS) \
208 $< > $@,"GEN","$(@:%-timestamp=%)")
209
210%/trace-dtrace.dtrace: %/trace-dtrace.dtrace-timestamp
211 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
212%/trace-dtrace.dtrace-timestamp: $(SRC_PATH)/%/trace-events $(BUILD_DIR)/config-host.mak $(tracetool-y)
213 $(call quiet-command,$(TRACETOOL) \
214 --group=$(call trace-group-name,$@) \
215 --format=d \
216 --backends=$(TRACE_BACKENDS) \
217 $< > $@,"GEN","$(@:%-timestamp=%)")
218
219%/trace-dtrace.h: %/trace-dtrace.dtrace $(tracetool-y)
220 $(call quiet-command,dtrace -o $@ -h -s $<, "GEN","$@")
221
222%/trace-dtrace.o: %/trace-dtrace.dtrace $(tracetool-y)
223
224
225trace-root.h: trace-root.h-timestamp
226 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800227trace-root.h-timestamp: $(SRC_PATH)/trace-events $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000228 $(call quiet-command,$(TRACETOOL) \
229 --group=root \
230 --format=h \
231 --backends=$(TRACE_BACKENDS) \
232 $< > $@,"GEN","$(@:%-timestamp=%)")
233
234trace-root.c: trace-root.c-timestamp
235 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800236trace-root.c-timestamp: $(SRC_PATH)/trace-events $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000237 $(call quiet-command,$(TRACETOOL) \
238 --group=root \
239 --format=c \
240 --backends=$(TRACE_BACKENDS) \
241 $< > $@,"GEN","$(@:%-timestamp=%)")
242
243trace-ust-root.h: trace-ust-root.h-timestamp
244 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800245trace-ust-root.h-timestamp: $(SRC_PATH)/trace-events $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000246 $(call quiet-command,$(TRACETOOL) \
247 --group=root \
248 --format=ust-events-h \
249 --backends=$(TRACE_BACKENDS) \
250 $< > $@,"GEN","$(@:%-timestamp=%)")
251
252trace-ust-all.h: trace-ust-all.h-timestamp
253 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800254trace-ust-all.h-timestamp: $(trace-events-files) $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000255 $(call quiet-command,$(TRACETOOL) \
256 --group=all \
257 --format=ust-events-h \
258 --backends=$(TRACE_BACKENDS) \
259 $(trace-events-files) > $@,"GEN","$(@:%-timestamp=%)")
260
261trace-ust-all.c: trace-ust-all.c-timestamp
262 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
Stefan Hajnoczi57b7bdf2019-01-29 10:53:43 +0800263trace-ust-all.c-timestamp: $(trace-events-files) $(tracetool-y) $(BUILD_DIR)/config-host.mak
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000264 $(call quiet-command,$(TRACETOOL) \
265 --group=all \
266 --format=ust-events-c \
267 --backends=$(TRACE_BACKENDS) \
268 $(trace-events-files) > $@,"GEN","$(@:%-timestamp=%)")
269
270trace-dtrace-root.dtrace: trace-dtrace-root.dtrace-timestamp
271 @cmp $< $@ >/dev/null 2>&1 || cp $< $@
272trace-dtrace-root.dtrace-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak $(tracetool-y)
273 $(call quiet-command,$(TRACETOOL) \
274 --group=root \
275 --format=d \
276 --backends=$(TRACE_BACKENDS) \
277 $< > $@,"GEN","$(@:%-timestamp=%)")
278
279trace-dtrace-root.h: trace-dtrace-root.dtrace
280 $(call quiet-command,dtrace -o $@ -h -s $<, "GEN","$@")
281
282trace-dtrace-root.o: trace-dtrace-root.dtrace
283
Daniel P. Berrange92712822017-09-29 11:11:58 +0100284KEYCODEMAP_GEN = $(SRC_PATH)/ui/keycodemapdb/tools/keymap-gen
285KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv
286
287KEYCODEMAP_FILES = \
Daniel P. Berrange2ec78702018-01-17 16:47:15 +0000288 ui/input-keymap-atset1-to-qcode.c \
Daniel P. Berrangebcd5ac92017-09-29 11:11:59 +0100289 ui/input-keymap-linux-to-qcode.c \
Daniel P. Berrangeab8f9d42018-01-17 16:41:15 +0000290 ui/input-keymap-qcode-to-atset1.c \
291 ui/input-keymap-qcode-to-atset2.c \
292 ui/input-keymap-qcode-to-atset3.c \
Daniel P. Berrange5a15e6b2018-01-17 16:41:17 +0000293 ui/input-keymap-qcode-to-linux.c \
Daniel P. Berrangebcd5ac92017-09-29 11:11:59 +0100294 ui/input-keymap-qcode-to-qnum.c \
Daniel P. Berrangee709a612018-01-17 16:41:16 +0000295 ui/input-keymap-qcode-to-sun.c \
Daniel P. Berrangebcd5ac92017-09-29 11:11:59 +0100296 ui/input-keymap-qnum-to-qcode.c \
Daniel P. Berrangeed7b2622018-01-17 16:47:14 +0000297 ui/input-keymap-usb-to-qcode.c \
Daniel P. Berrange2ec78702018-01-17 16:47:15 +0000298 ui/input-keymap-win32-to-qcode.c \
299 ui/input-keymap-x11-to-qcode.c \
300 ui/input-keymap-xorgevdev-to-qcode.c \
301 ui/input-keymap-xorgkbd-to-qcode.c \
302 ui/input-keymap-xorgxquartz-to-qcode.c \
303 ui/input-keymap-xorgxwin-to-qcode.c \
Keno Fischer656282d2018-06-13 19:51:56 -0400304 ui/input-keymap-osx-to-qcode.c \
Daniel P. Berrange92712822017-09-29 11:11:58 +0100305 $(NULL)
306
Laurent Vivier3dff1992019-04-01 16:12:19 +0200307generated-files-$(CONFIG_SOFTMMU) += $(KEYCODEMAP_FILES)
Daniel P. Berrange92712822017-09-29 11:11:58 +0100308
309ui/input-keymap-%.c: $(KEYCODEMAP_GEN) $(KEYCODEMAP_CSV) $(SRC_PATH)/ui/Makefile.objs
310 $(call quiet-command,\
Jan Beulich6809df12018-01-19 00:52:27 -0700311 stem=$* && src=$${stem%-to-*} dst=$${stem#*-to-} && \
Daniel P. Berrange92712822017-09-29 11:11:58 +0100312 test -e $(KEYCODEMAP_GEN) && \
313 $(PYTHON) $(KEYCODEMAP_GEN) \
314 --lang glib2 \
315 --varname qemu_input_map_$${src}_to_$${dst} \
316 code-map $(KEYCODEMAP_CSV) $${src} $${dst} \
317 > $@ || rm -f $@, "GEN", "$@")
318
319$(KEYCODEMAP_GEN): .git-submodule-status
320$(KEYCODEMAP_CSV): .git-submodule-status
321
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100322edk2-decompressed = $(basename $(wildcard pc-bios/edk2-*.fd.bz2))
323pc-bios/edk2-%.fd: pc-bios/edk2-%.fd.bz2
324 $(call quiet-command,bzip2 -d -c $< > $@,"BUNZIP2",$<)
325
Juan Quintelad9ace8b2009-10-06 21:11:15 +0200326# Don't try to regenerate Makefile or configure
327# We don't generate any of them
328Makefile: ;
329configure: ;
330
Marc-André Lureaubd3f5702017-01-13 15:41:32 +0100331.PHONY: all clean cscope distclean html info install install-doc \
Daniel P. Berrange7c3d1912017-11-21 14:25:38 +0000332 pdf txt recurse-all dist msi FORCE
pbrook0cb3fb12006-05-14 12:07:53 +0000333
Paolo Bonzinifec90ff2012-05-29 11:49:50 +0200334$(call set-vpath, $(SRC_PATH))
pbrook8c462f82007-11-18 21:12:37 +0000335
Juan Quintela3e2e0e62009-08-03 14:47:06 +0200336LIBS+=-lz $(LIBS_TOOLS)
Juan Quintela67c0f082009-07-27 16:12:51 +0200337
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200338vhost-user-json-y =
339HELPERS-y =
340
Laurent Vivier206d1b92018-06-05 18:09:58 +0200341HELPERS-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_LINUX)) = qemu-bridge-helper$(EXESUF)
Corey Bryant7b93fad2012-01-26 09:42:24 -0500342
Marc-André Lureau57589bc2019-08-27 12:08:24 +0400343ifeq ($(CONFIG_LINUX)$(CONFIG_VIRGL)$(CONFIG_GBM)$(CONFIG_TOOLS),yyyy)
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200344HELPERS-y += vhost-user-gpu$(EXESUF)
345vhost-user-json-y += contrib/vhost-user-gpu/50-qemu-gpu.json
346endif
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200347
Dr. David Alan Gilbert2405f3c2019-12-03 12:23:44 +0000348ifeq ($(CONFIG_LINUX)$(CONFIG_SECCOMP)$(CONFIG_LIBCAP_NG),yyy)
Dr. David Alan Gilbert81bfc422019-02-07 12:17:21 +0000349HELPERS-y += virtiofsd$(EXESUF)
Stefan Hajnoczi315616e2019-08-27 10:54:37 +0100350vhost-user-json-y += tools/virtiofsd/50-qemu-virtiofsd.json
Dr. David Alan Gilbert81bfc422019-02-07 12:17:21 +0000351endif
352
Peter Maydellb53c54c2019-09-19 16:59:57 +0100353# Sphinx does not allow building manuals into the same directory as
354# the source files, so if we're doing an in-tree QEMU build we must
355# build the manuals into a subdirectory (and then install them from
356# there for 'make install'). For an out-of-tree build we can just
357# use the docs/ subdirectory in the build tree as normal.
358ifeq ($(realpath $(SRC_PATH)),$(realpath .))
359MANUAL_BUILDDIR := docs/built
360else
361MANUAL_BUILDDIR := docs
362endif
363
pbrookcc8ae6d2006-04-23 17:57:59 +0000364ifdef BUILD_DOCS
Peter Maydelld06118b2020-02-28 15:36:15 +0000365DOCS+=$(MANUAL_BUILDDIR)/system/qemu.1
Peter Maydella08b4a92020-02-25 10:45:14 +0000366DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-img.1
367DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-nbd.8
Peter Maydell87c08682020-01-23 15:22:39 +0000368DOCS+=$(MANUAL_BUILDDIR)/interop/qemu-ga.8
Stefan Hajnoczi6a7e2bb2020-02-07 16:29:51 +0000369ifeq ($(CONFIG_LINUX)$(CONFIG_SECCOMP)$(CONFIG_LIBCAP_NG),yyy)
Peter Maydella08b4a92020-02-25 10:45:14 +0000370DOCS+=$(MANUAL_BUILDDIR)/tools/virtiofsd.1
Stefan Hajnoczi6a7e2bb2020-02-07 16:29:51 +0000371endif
Peter Maydellacab9232020-01-23 15:22:40 +0000372DOCS+=$(MANUAL_BUILDDIR)/system/qemu-block-drivers.7
Paolo Bonzinid59157e2017-06-06 16:55:19 +0200373DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7
374DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7
Kashyap Chamarthy1bf84a12020-02-28 15:36:01 +0000375DOCS+=$(MANUAL_BUILDDIR)/system/qemu-cpu-models.7
Stefan Hajnoczi22108f32019-12-19 13:56:20 +0000376DOCS+=$(MANUAL_BUILDDIR)/index.html
Meador Inge983eef52012-02-24 14:00:42 +0530377ifdef CONFIG_VIRTFS
Peter Maydella08b4a92020-02-25 10:45:14 +0000378DOCS+=$(MANUAL_BUILDDIR)/tools/virtfs-proxy-helper.1
Meador Inge983eef52012-02-24 14:00:42 +0530379endif
Daniel P. Berrangé62dd1042019-01-23 12:00:16 +0000380ifdef CONFIG_TRACE_SYSTEMTAP
Peter Maydella08b4a92020-02-25 10:45:14 +0000381DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-trace-stap.1
Daniel P. Berrangé62dd1042019-01-23 12:00:16 +0000382endif
pbrookcc8ae6d2006-04-23 17:57:59 +0000383else
384DOCS=
385endif
bellard7d132992003-03-06 23:23:54 +0000386
Daniel P. Berrange8cc357b2018-01-23 16:47:17 +0000387SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR)
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800388SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(filter %-softmmu, $(TARGET_DIRS)))
389SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %.d, $(SUBDIR_DEVICES_MAK))
Juan Quintela1f3d3c82009-10-07 02:41:02 +0200390
Stefan Weil8bdd3d42012-09-14 19:02:30 +0200391ifeq ($(SUBDIR_DEVICES_MAK),)
Paolo Bonzinib7c11e52019-03-13 11:51:14 +0100392config-all-devices.mak: config-host.mak
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100393 $(call quiet-command,echo '# no devices' > $@,"GEN","$@")
Stefan Weil8bdd3d42012-09-14 19:02:30 +0200394else
Paolo Bonzinib7c11e52019-03-13 11:51:14 +0100395config-all-devices.mak: $(SUBDIR_DEVICES_MAK) config-host.mak
Paolo Bonzinibb585a72013-04-03 17:53:21 +0200396 $(call quiet-command, sed -n \
397 's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \
398 $(SUBDIR_DEVICES_MAK) | sort -u > $@, \
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100399 "GEN","$@")
Stefan Weil8bdd3d42012-09-14 19:02:30 +0200400endif
Juan Quintela1f3d3c82009-10-07 02:41:02 +0200401
Paul Brookbd9141b2010-11-26 18:47:45 +0000402-include $(SUBDIR_DEVICES_MAK_DEP)
403
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800404# This has to be kept in sync with Kconfig.host.
405MINIKCONF_ARGS = \
Paolo Bonzinif3494742019-01-23 14:56:17 +0800406 $(CONFIG_MINIKCONF_MODE) \
Thomas Huthbb768f72019-05-10 10:11:59 +0200407 $@ $*/config-devices.mak.d $< $(MINIKCONF_INPUTS) \
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800408 CONFIG_KVM=$(CONFIG_KVM) \
409 CONFIG_SPICE=$(CONFIG_SPICE) \
410 CONFIG_IVSHMEM=$(CONFIG_IVSHMEM) \
411 CONFIG_TPM=$(CONFIG_TPM) \
412 CONFIG_XEN=$(CONFIG_XEN) \
413 CONFIG_OPENGL=$(CONFIG_OPENGL) \
414 CONFIG_X11=$(CONFIG_X11) \
415 CONFIG_VHOST_USER=$(CONFIG_VHOST_USER) \
Marc-André Lureau21c6b0c2019-08-15 17:13:06 +0400416 CONFIG_VHOST_KERNEL=$(CONFIG_VHOST_KERNEL) \
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800417 CONFIG_VIRTFS=$(CONFIG_VIRTFS) \
Paolo Bonzinid6c1bd42019-03-14 14:09:09 +0100418 CONFIG_LINUX=$(CONFIG_LINUX) \
419 CONFIG_PVRDMA=$(CONFIG_PVRDMA)
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800420
Thomas Huthea763fd2020-02-03 16:31:46 +0100421MINIKCONF_INPUTS = $(SRC_PATH)/Kconfig.host $(SRC_PATH)/hw/Kconfig
422MINIKCONF_DEPS = $(MINIKCONF_INPUTS) $(wildcard $(SRC_PATH)/hw/*/Kconfig)
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800423MINIKCONF = $(PYTHON) $(SRC_PATH)/scripts/minikconf.py \
424
Thomas Huthea763fd2020-02-03 16:31:46 +0100425$(SUBDIR_DEVICES_MAK): %/config-devices.mak: default-configs/%.mak $(MINIKCONF_DEPS) $(BUILD_DIR)/config-host.mak
Paolo Bonzinie0e312f2019-01-23 14:56:01 +0800426 $(call quiet-command, $(MINIKCONF) $(MINIKCONF_ARGS) > $@.tmp, "GEN", "$@.tmp")
Michael S. Tsirkin12ccfec2015-02-19 08:48:46 +0100427 $(call quiet-command, if test -f $@; then \
Blue Swirl904fe1f2010-10-02 14:28:08 +0000428 if cmp -s $@.old $@; then \
Paul Brookbd9141b2010-11-26 18:47:45 +0000429 mv $@.tmp $@; \
430 cp -p $@ $@.old; \
Stefan Weil012f0872009-12-20 15:39:03 +0100431 else \
432 if test -f $@.old; then \
433 echo "WARNING: $@ (user modified) out of date.";\
434 else \
435 echo "WARNING: $@ out of date.";\
436 fi; \
Philippe Mathieu-Daudéb98a3ba2017-11-21 06:55:10 -0300437 echo "Run \"$(MAKE) defconfig\" to regenerate."; \
Stefan Weil012f0872009-12-20 15:39:03 +0100438 rm $@.tmp; \
439 fi; \
Paul Brooka992fe32009-11-22 16:25:30 +0000440 else \
Stefan Weil012f0872009-12-20 15:39:03 +0100441 mv $@.tmp $@; \
442 cp -p $@ $@.old; \
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100443 fi,"GEN","$@");
Paul Brooka992fe32009-11-22 16:25:30 +0000444
445defconfig:
446 rm -f config-all-devices.mak $(SUBDIR_DEVICES_MAK)
447
Paolo Bonzini992aeb82012-12-21 08:34:49 +0100448ifneq ($(wildcard config-host.mak),)
449include $(SRC_PATH)/Makefile.objs
Fam Zhengba1183d2014-02-10 14:48:52 +0800450endif
451
452dummy := $(call unnest-vars,, \
453 stub-obj-y \
Daniel P. Berrange5b76dd12015-10-21 13:16:21 +0100454 authz-obj-y \
Marc-André Lureau32d955a2016-12-12 15:49:01 +0300455 chardev-obj-y \
Fam Zhengba1183d2014-02-10 14:48:52 +0800456 util-obj-y \
457 qga-obj-y \
Viktor Prutyanov3fa2d382018-08-29 15:41:25 +0300458 elf2dmp-obj-y \
David Marchanda75eb032014-09-08 11:17:48 +0200459 ivshmem-client-obj-y \
460 ivshmem-server-obj-y \
Dr. David Alan Gilbert81bfc422019-02-07 12:17:21 +0000461 virtiofsd-obj-y \
Yuval Shaiaa5d2f6f2018-12-21 16:40:15 +0200462 rdmacm-mux-obj-y \
Marc-André Lureau7b2e5c62016-10-18 12:24:04 +0300463 libvhost-user-obj-y \
Felipe Franciosi49cc0342017-03-02 10:25:53 -0800464 vhost-user-scsi-obj-y \
Changpeng Liu406d2aa2018-01-04 09:53:34 +0800465 vhost-user-blk-obj-y \
Marc-André Lureau06914c92019-05-14 12:41:26 +0200466 vhost-user-input-obj-y \
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200467 vhost-user-gpu-obj-y \
Tomoki Sekiyama577a6722014-03-26 14:28:45 -0400468 qga-vss-dll-obj-y \
Fam Zhengba1183d2014-02-10 14:48:52 +0800469 block-obj-y \
Fam Zhengcc475692014-02-10 14:48:59 +0800470 block-obj-m \
Kevin Wolf14837c62020-02-24 15:29:54 +0100471 storage-daemon-obj-y \
472 storage-daemon-obj-m \
Daniel P. Berrangefb377262015-09-02 10:57:27 +0100473 crypto-obj-y \
Daniel P. Berrange0c7012e2015-09-02 11:18:16 +0100474 qom-obj-y \
Daniel P. Berrange666a3af2015-02-27 16:19:33 +0000475 io-obj-y \
Fam Zhengcc475692014-02-10 14:48:59 +0800476 common-obj-y \
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000477 common-obj-m \
Marc-André Lureau675b9b52019-02-12 17:25:23 +0100478 trace-obj-y)
Fam Zhengba1183d2014-02-10 14:48:52 +0800479
Fam Zheng46e7b702016-06-01 10:23:31 +0800480include $(SRC_PATH)/tests/Makefile.include
Paolo Bonzini992aeb82012-12-21 08:34:49 +0100481
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200482all: $(DOCS) $(if $(BUILD_DOCS),sphinxdocs) $(TOOLS) $(HELPERS-y) recurse-all modules $(vhost-user-json-y)
pbrookb9dea4f2006-05-13 16:54:03 +0000483
Fam Zheng67a1de02016-06-01 17:44:21 +0800484qemu-version.h: FORCE
485 $(call quiet-command, \
Peter Maydell57b49732019-03-07 14:26:47 +0000486 (printf '#define QEMU_PKGVERSION "$(QEMU_PKGVERSION)"\n'; \
487 printf '#define QEMU_FULL_VERSION "$(FULL_VERSION)"\n'; \
Thomas Huth7e563bf2018-02-15 12:06:47 +0100488 ) > $@.tmp)
Lin Mad9e73d32017-02-15 10:40:30 +0800489 $(call quiet-command, if ! cmp -s $@ $@.tmp; then \
490 mv $@.tmp $@; \
491 else \
492 rm $@.tmp; \
493 fi)
Fam Zheng67a1de02016-06-01 17:44:21 +0800494
Juan Quintela1215c6e2009-10-07 02:40:58 +0200495config-host.h: config-host.h-timestamp
496config-host.h-timestamp: config-host.mak
Paolo Bonzini077de812016-06-07 13:27:04 +0200497qemu-options.def: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100498 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
Juan Quintela1215c6e2009-10-07 02:40:58 +0200499
Alexander Bulekovc621dc32020-02-19 23:11:13 -0500500TARGET_DIRS_RULES := $(foreach t, all fuzz clean install, $(addsuffix /$(t), $(TARGET_DIRS)))
Andreas Färber916359f2013-02-21 16:26:47 +0100501
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200502SOFTMMU_ALL_RULES=$(filter %-softmmu/all, $(TARGET_DIRS_RULES))
503$(SOFTMMU_ALL_RULES): $(authz-obj-y)
504$(SOFTMMU_ALL_RULES): $(block-obj-y)
Kevin Wolf14837c62020-02-24 15:29:54 +0100505$(SOFTMMU_ALL_RULES): $(storage-daemon-obj-y)
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200506$(SOFTMMU_ALL_RULES): $(chardev-obj-y)
507$(SOFTMMU_ALL_RULES): $(crypto-obj-y)
508$(SOFTMMU_ALL_RULES): $(io-obj-y)
509$(SOFTMMU_ALL_RULES): config-all-devices.mak
Philippe Mathieu-Daudé05dfa222019-11-08 12:45:30 +0100510ifdef DECOMPRESS_EDK2_BLOBS
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200511$(SOFTMMU_ALL_RULES): $(edk2-decompressed)
Philippe Mathieu-Daudé05dfa222019-11-08 12:45:30 +0100512endif
pbrookcec7d0b2008-05-28 16:44:57 +0000513
Alexander Bulekovc621dc32020-02-19 23:11:13 -0500514SOFTMMU_FUZZ_RULES=$(filter %-softmmu/fuzz, $(TARGET_DIRS_RULES))
515$(SOFTMMU_FUZZ_RULES): $(authz-obj-y)
516$(SOFTMMU_FUZZ_RULES): $(block-obj-y)
517$(SOFTMMU_FUZZ_RULES): $(chardev-obj-y)
518$(SOFTMMU_FUZZ_RULES): $(crypto-obj-y)
519$(SOFTMMU_FUZZ_RULES): $(io-obj-y)
520$(SOFTMMU_FUZZ_RULES): config-all-devices.mak
521$(SOFTMMU_FUZZ_RULES): $(edk2-decompressed)
522
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200523.PHONY: $(TARGET_DIRS_RULES)
524# The $(TARGET_DIRS_RULES) are of the form SUBDIR/GOAL, so that
525# $(dir $@) yields the sub-directory, and $(notdir $@) yields the sub-goal
526$(TARGET_DIRS_RULES):
527 $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $(dir $@) V="$(V)" TARGET_DIR="$(dir $@)" $(notdir $@),)
pbrook4aa42532006-05-13 13:55:08 +0000528
Peter Crosthwaitea540f152013-04-18 14:47:31 +1000529DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_srcdir=$(SRC_PATH)/dtc/libfdt
Peter Maydell965f4862013-06-21 14:00:17 +0100530DTC_CFLAGS=$(CFLAGS) $(QEMU_CFLAGS)
531DTC_CPPFLAGS=-I$(BUILD_DIR)/dtc -I$(SRC_PATH)/dtc -I$(SRC_PATH)/dtc/libfdt
Peter Crosthwaitea540f152013-04-18 14:47:31 +1000532
Markus Armbruster3b8593e2019-05-28 10:23:07 +0200533.PHONY: dtc/all
534dtc/all: .git-submodule-status dtc/libfdt dtc/tests
Paolo Bonzinidb5adea2019-12-11 15:34:27 +0100535 $(call quiet-command,$(MAKE) $(DTC_MAKE_ARGS) CPPFLAGS="$(DTC_CPPFLAGS)" CFLAGS="$(DTC_CFLAGS)" LDFLAGS="$(QEMU_LDFLAGS)" ARFLAGS="$(ARFLAGS)" CC="$(CC)" AR="$(AR)" LD="$(LD)" $(SUBDIR_MAKEFLAGS) libfdt/libfdt.a,)
Peter Crosthwaitea540f152013-04-18 14:47:31 +1000536
Aaron Lindsay00525862017-10-18 14:40:23 -0400537dtc/%: .git-submodule-status
Jan Kiszka814e1112018-04-15 20:05:22 -0300538 @mkdir -p $@
Peter Crosthwaitea540f152013-04-18 14:47:31 +1000539
Richard Hendersone219c492017-09-28 09:01:23 -0700540# Overriding CFLAGS causes us to lose defines added in the sub-makefile.
541# Not overriding CFLAGS leads to mis-matches between compilation modes.
542# Therefore we replicate some of the logic in the sub-makefile.
543# Remove all the extra -Warning flags that QEMU uses that Capstone doesn't;
544# no need to annoy QEMU developers with such things.
545CAP_CFLAGS = $(patsubst -W%,,$(CFLAGS) $(QEMU_CFLAGS))
546CAP_CFLAGS += -DCAPSTONE_USE_SYS_DYN_MEM
547CAP_CFLAGS += -DCAPSTONE_HAS_ARM
548CAP_CFLAGS += -DCAPSTONE_HAS_ARM64
549CAP_CFLAGS += -DCAPSTONE_HAS_POWERPC
550CAP_CFLAGS += -DCAPSTONE_HAS_X86
551
Markus Armbruster3b8593e2019-05-28 10:23:07 +0200552.PHONY: capstone/all
553capstone/all: .git-submodule-status
Alistair Francis9f81aeb2017-11-07 17:10:46 -0800554 $(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))
Richard Hendersone219c492017-09-28 09:01:23 -0700555
Markus Armbruster3b8593e2019-05-28 10:23:07 +0200556.PHONY: slirp/all
557slirp/all: .git-submodule-status
Alex Bennéedaa79d92019-09-19 14:07:36 +0100558 $(call quiet-command,$(MAKE) -C $(SRC_PATH)/slirp \
559 BUILD_DIR="$(BUILD_DIR)/slirp" \
560 PKG_CONFIG="$(PKG_CONFIG)" \
561 CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" \
Paolo Bonzinidb5adea2019-12-11 15:34:27 +0100562 CFLAGS="$(QEMU_CFLAGS) $(CFLAGS)" LDFLAGS="$(QEMU_LDFLAGS)")
Marc-André Lureau675b9b52019-02-12 17:25:23 +0100563
Markus Armbruster3b8593e2019-05-28 10:23:07 +0200564# Compatibility gunk to keep make working across the rename of targets
565# for recursion, to be removed some time after 4.1.
566subdir-dtc: dtc/all
567subdir-capstone: capstone/all
568subdir-slirp: slirp/all
569
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200570$(filter %/all, $(TARGET_DIRS_RULES)): libqemuutil.a $(common-obj-y) \
Paolo Bonzinib8d89ba2019-07-29 15:55:47 +0200571 $(qom-obj-y)
Blue Swirladd16152009-09-27 16:26:02 +0000572
Alexander Bulekovc621dc32020-02-19 23:11:13 -0500573$(filter %/fuzz, $(TARGET_DIRS_RULES)): libqemuutil.a $(common-obj-y) \
574 $(qom-obj-y) $(crypto-user-obj-$(CONFIG_USER_ONLY))
575
Markus Armbruster3b8593e2019-05-28 10:23:07 +0200576ROM_DIRS = $(addprefix pc-bios/, $(ROMS))
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200577ROM_DIRS_RULES=$(foreach t, all clean, $(addsuffix /$(t), $(ROM_DIRS)))
Marc-André Lureaua9c87302016-08-05 12:23:46 +0400578# Only keep -O and -g cflags
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200579.PHONY: $(ROM_DIRS_RULES)
580$(ROM_DIRS_RULES):
581 $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $(dir $@) V="$(V)" TARGET_DIR="$(dir $@)" CFLAGS="$(filter -O% -g%,$(CFLAGS))" $(notdir $@),)
Paul Brookc05ac892009-07-31 13:18:32 +0100582
Markus Armbruster8d358a52019-07-09 16:38:01 +0200583.PHONY: recurse-all recurse-clean recurse-install
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200584recurse-all: $(addsuffix /all, $(TARGET_DIRS) $(ROM_DIRS))
585recurse-clean: $(addsuffix /clean, $(TARGET_DIRS) $(ROM_DIRS))
586recurse-install: $(addsuffix /install, $(TARGET_DIRS))
Markus Armbruster47ae0602019-07-12 07:59:35 +0200587$(addsuffix /install, $(TARGET_DIRS)): all
bellard83f64092006-08-01 16:21:11 +0000588
Marc-André Lureauc17a18e2016-11-08 11:05:13 +0400589$(BUILD_DIR)/version.o: $(SRC_PATH)/version.rc config-host.h
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100590 $(call quiet-command,$(WINDRES) -I$(BUILD_DIR) -o $@ $<,"RC","version.o")
Marc-André Lureau5354e4d2013-02-25 23:31:13 +0100591
Marc-André Lureauc17a18e2016-11-08 11:05:13 +0400592Makefile: $(version-obj-y)
Paolo Bonzini3bc2f572012-11-16 18:35:27 +0100593
594######################################################################
Paolo Bonzini8a090702012-12-20 15:40:20 +0100595# Build libraries
Paolo Bonzini3bc2f572012-11-16 18:35:27 +0100596
Paolo Bonziniebedb372017-09-19 16:20:31 +0200597libqemuutil.a: $(util-obj-y) $(trace-obj-y) $(stub-obj-y)
Xie Yongji5f9ff1e2019-02-28 16:53:52 +0800598libvhost-user.a: $(libvhost-user-obj-y) $(util-obj-y) $(stub-obj-y)
Paolo Bonzini3bc2f572012-11-16 18:35:27 +0100599
bellard4fb240a2007-11-07 19:24:02 +0000600######################################################################
601
Paolo Bonziniebedb372017-09-19 16:20:31 +0200602COMMON_LDADDS = libqemuutil.a
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000603
Juan Quintela3c089e12010-01-20 20:54:18 +0100604qemu-img.o: qemu-img-cmds.h
Stuart Brady153859b2009-06-07 00:42:17 +0100605
Daniel P. Berrange5b76dd12015-10-21 13:16:21 +0100606qemu-img$(EXESUF): qemu-img.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
607qemu-nbd$(EXESUF): qemu-nbd.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
608qemu-io$(EXESUF): qemu-io.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
Kevin Wolf5e6911c2020-02-24 15:30:01 +0100609qemu-storage-daemon$(EXESUF): qemu-storage-daemon.o $(authz-obj-y) $(block-obj-y) $(crypto-obj-y) $(chardev-obj-y) $(io-obj-y) $(qom-obj-y) $(storage-daemon-obj-y) $(COMMON_LDADDS)
aliguori0a8e1ac2009-04-05 18:41:23 +0000610
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000611qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o $(COMMON_LDADDS)
Corey Bryant7b93fad2012-01-26 09:42:24 -0500612
Gerd Hoffmann6a021532017-10-05 17:33:28 +0200613qemu-keymap$(EXESUF): qemu-keymap.o ui/input-keymap.o $(COMMON_LDADDS)
614
Gerd Hoffmann72d277a2018-09-25 09:56:42 +0200615qemu-edid$(EXESUF): qemu-edid.o hw/display/edid-generate.o $(COMMON_LDADDS)
616
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000617fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS)
M. Mohan Kumar17bff522011-12-14 13:58:42 +0530618
Daniel P. Berrange5b76dd12015-10-21 13:16:21 +0100619scsi/qemu-pr-helper$(EXESUF): scsi/qemu-pr-helper.o scsi/utils.o $(authz-obj-y) $(crypto-obj-y) $(io-obj-y) $(qom-obj-y) $(COMMON_LDADDS)
Paolo Bonzinife8fc5a2017-08-22 06:50:55 +0200620ifdef CONFIG_MPATH
621scsi/qemu-pr-helper$(EXESUF): LIBS += -ludev -lmultipath -lmpathpersist
622endif
Paolo Bonzinib855f8d2017-08-22 06:50:18 +0200623
Paolo Bonzini077de812016-06-07 13:27:04 +0200624qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/scripts/hxtool
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100625 $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@,"GEN","$@")
Stuart Brady153859b2009-06-07 00:42:17 +0100626
Michael Roth957f1f92011-08-11 15:38:12 -0500627qemu-ga$(EXESUF): LIBS = $(LIBS_QGA)
Dunrong Huang54c2e502012-07-29 03:11:24 +0800628qemu-ga$(EXESUF): QEMU_CFLAGS += -I qga/qapi-generated
Michael Roth640e5402011-07-19 14:50:44 -0500629
Gerd Hoffmann6a021532017-10-05 17:33:28 +0200630qemu-keymap$(EXESUF): LIBS += $(XKBCOMMON_LIBS)
631qemu-keymap$(EXESUF): QEMU_CFLAGS += $(XKBCOMMON_CFLAGS)
632
Markus Armbrustere6c42b92019-10-18 09:43:44 +0200633qapi-py = $(SRC_PATH)/scripts/qapi/__init__.py \
634$(SRC_PATH)/scripts/qapi/commands.py \
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600635$(SRC_PATH)/scripts/qapi/common.py \
636$(SRC_PATH)/scripts/qapi/doc.py \
Markus Armbrustere6c42b92019-10-18 09:43:44 +0200637$(SRC_PATH)/scripts/qapi/error.py \
638$(SRC_PATH)/scripts/qapi/events.py \
639$(SRC_PATH)/scripts/qapi/expr.py \
640$(SRC_PATH)/scripts/qapi/gen.py \
641$(SRC_PATH)/scripts/qapi/introspect.py \
642$(SRC_PATH)/scripts/qapi/parser.py \
643$(SRC_PATH)/scripts/qapi/schema.py \
644$(SRC_PATH)/scripts/qapi/source.py \
645$(SRC_PATH)/scripts/qapi/types.py \
646$(SRC_PATH)/scripts/qapi/visit.py \
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600647$(SRC_PATH)/scripts/qapi-gen.py
Avi Kivity8d3bc512011-12-27 16:02:16 +0200648
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600649qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h \
650qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h \
Markus Armbrustereb815e22018-02-11 10:36:05 +0100651qga/qapi-generated/qga-qapi-commands.h qga/qapi-generated/qga-qapi-commands.c \
Markus Armbruster00ca24f2019-11-20 19:25:48 +0100652qga/qapi-generated/qga-qapi-init-commands.h qga/qapi-generated/qga-qapi-init-commands.c \
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600653qga/qapi-generated/qga-qapi-doc.texi: \
654qga/qapi-generated/qapi-gen-timestamp ;
655qga/qapi-generated/qapi-gen-timestamp: $(SRC_PATH)/qga/qapi-schema.json $(qapi-py)
Matthias Maier0d6b93d2018-06-18 19:59:58 +0200656 $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600657 -o qga/qapi-generated -p "qga-" $<, \
658 "GEN","$(@:%-timestamp=%)")
659 @>$@
Michael Rothe3d4d252011-07-19 15:41:55 -0500660
Eric Blakebf582c32018-11-16 14:00:16 -0600661qapi-modules = $(SRC_PATH)/qapi/qapi-schema.json \
662 $(QAPI_MODULES:%=$(SRC_PATH)/qapi/%.json)
Max Reitzbe13d462014-06-18 08:43:26 +0200663
Eric Blakebf582c32018-11-16 14:00:16 -0600664$(GENERATED_QAPI_FILES): qapi-gen-timestamp ;
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600665qapi-gen-timestamp: $(qapi-modules) $(qapi-py)
Matthias Maier0d6b93d2018-06-18 19:59:58 +0200666 $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \
Markus Armbrustereb815e22018-02-11 10:36:05 +0100667 -o "qapi" -b $<, \
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600668 "GEN","$(@:%-timestamp=%)")
669 @>$@
Anthony Liguorie3193602011-09-02 12:34:47 -0500670
Kevin Wolf2af282e2020-02-24 15:30:08 +0100671qapi-modules-storage-daemon = \
672 $(SRC_PATH)/storage-daemon/qapi/qapi-schema.json \
673 $(QAPI_MODULES_STORAGE_DAEMON:%=$(SRC_PATH)/qapi/%.json)
674
675$(GENERATED_STORAGE_DAEMON_QAPI_FILES): storage-daemon/qapi/qapi-gen-timestamp ;
676storage-daemon/qapi/qapi-gen-timestamp: $(qapi-modules-storage-daemon) $(qapi-py)
677 $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \
678 -o "storage-daemon/qapi" $<, \
679 "GEN","$(@:%-timestamp=%)")
680 @>$@
681
Markus Armbruster00ca24f2019-11-20 19:25:48 +0100682QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qapi-commands.h qga-qapi-init-commands.h)
Marc-André Lureau7a0b7eb2017-07-27 17:45:05 +0200683$(qga-obj-y): $(QGALIB_GEN)
Michael Roth957f1f92011-08-11 15:38:12 -0500684
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000685qemu-ga$(EXESUF): $(qga-obj-y) $(COMMON_LDADDS)
Michael Rothfafcaf12015-09-07 18:47:05 -0500686 $(call LINK, $^)
Michael Roth48ff7a62011-07-20 15:19:37 -0500687
Yossi Hindin9dacf322015-05-06 14:57:40 +0300688ifdef QEMU_GA_MSI_ENABLED
689QEMU_GA_MSI=qemu-ga-$(ARCH).msi
690
Leonid Bloch0a187502015-07-29 20:10:51 +0300691msi: $(QEMU_GA_MSI)
Yossi Hindin9dacf322015-05-06 14:57:40 +0300692
Michael Rothfafcaf12015-09-07 18:47:05 -0500693$(QEMU_GA_MSI): qemu-ga.exe $(QGA_VSS_PROVIDER)
Yossi Hindin9dacf322015-05-06 14:57:40 +0300694
Yossi Hindin9dacf322015-05-06 14:57:40 +0300695$(QEMU_GA_MSI): config-host.mak
696
Leonid Blochdecdfbd2015-08-26 15:07:16 +0300697$(QEMU_GA_MSI): $(SRC_PATH)/qga/installer/qemu-ga.wxs
698 $(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)" \
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100699 wixl -o $@ $(QEMU_GA_MSI_ARCH) $(QEMU_GA_MSI_WITH_VSS) $(QEMU_GA_MSI_MINGW_DLL_PATH) $<,"WIXL","$@")
Yossi Hindin9dacf322015-05-06 14:57:40 +0300700else
701msi:
Michael Roth15b19ed2015-08-26 17:05:01 -0500702 @echo "MSI build not configured or dependency resolution failed (reconfigure with --enable-guest-agent-msi option)"
Yossi Hindin9dacf322015-05-06 14:57:40 +0300703endif
704
Michael Rothfafcaf12015-09-07 18:47:05 -0500705ifneq ($(EXESUF),)
706.PHONY: qemu-ga
707qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
708endif
709
Viktor Prutyanov1b9d35f2018-12-20 04:24:41 +0300710elf2dmp$(EXESUF): $(elf2dmp-obj-y)
Viktor Prutyanov3fa2d382018-08-29 15:41:25 +0300711 $(call LINK, $^)
712
Kamil Rytarowskib1449ed2017-07-14 09:33:45 +0100713ifdef CONFIG_IVSHMEM
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000714ivshmem-client$(EXESUF): $(ivshmem-client-obj-y) $(COMMON_LDADDS)
David Marchanda75eb032014-09-08 11:17:48 +0200715 $(call LINK, $^)
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +0000716ivshmem-server$(EXESUF): $(ivshmem-server-obj-y) $(COMMON_LDADDS)
David Marchanda75eb032014-09-08 11:17:48 +0200717 $(call LINK, $^)
Kamil Rytarowskib1449ed2017-07-14 09:33:45 +0100718endif
Marc-André Lureaud59a0312017-09-19 17:25:04 +0200719vhost-user-scsi$(EXESUF): $(vhost-user-scsi-obj-y) libvhost-user.a
Felipe Franciosi49cc0342017-03-02 10:25:53 -0800720 $(call LINK, $^)
Changpeng Liu406d2aa2018-01-04 09:53:34 +0800721vhost-user-blk$(EXESUF): $(vhost-user-blk-obj-y) libvhost-user.a
722 $(call LINK, $^)
Marcel Apfelbaum0f645ba2019-01-18 14:46:14 +0200723
724rdmacm-mux$(EXESUF): LIBS += "-libumad"
Yuval Shaiaa5d2f6f2018-12-21 16:40:15 +0200725rdmacm-mux$(EXESUF): $(rdmacm-mux-obj-y) $(COMMON_LDADDS)
726 $(call LINK, $^)
David Marchanda75eb032014-09-08 11:17:48 +0200727
Stefan Hajnoczi4f8bde92019-03-13 09:32:51 +0000728# relies on Linux-specific syscalls
Dr. David Alan Gilbert2405f3c2019-12-03 12:23:44 +0000729ifeq ($(CONFIG_LINUX)$(CONFIG_SECCOMP)$(CONFIG_LIBCAP_NG),yyy)
Dr. David Alan Gilbert81bfc422019-02-07 12:17:21 +0000730virtiofsd$(EXESUF): $(virtiofsd-obj-y) libvhost-user.a $(COMMON_LDADDS)
731 $(call LINK, $^)
732endif
733
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200734vhost-user-gpu$(EXESUF): $(vhost-user-gpu-obj-y) $(libvhost-user-obj-y) libqemuutil.a libqemustub.a
735 $(call LINK, $^)
736
Marc-André Lureau06914c92019-05-14 12:41:26 +0200737ifdef CONFIG_VHOST_USER_INPUT
738ifdef CONFIG_LINUX
739vhost-user-input$(EXESUF): $(vhost-user-input-obj-y) libvhost-user.a libqemuutil.a
740 $(call LINK, $^)
741
742# build by default, do not install
743all: vhost-user-input$(EXESUF)
744endif
745endif
746
Marc Mari0c0c1fd2016-08-12 09:27:02 -0400747module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak
748 $(call quiet-command,$(PYTHON) $< $@ \
749 $(addprefix $(SRC_PATH)/,$(patsubst %.mo,%.c,$(block-obj-m))), \
Peter Maydell0bdb12c2016-10-04 17:27:21 +0100750 "GEN","$@")
Marc Mari0c0c1fd2016-08-12 09:27:02 -0400751
Alex Bennée990e6a22018-06-20 12:34:45 +0100752ifdef CONFIG_GCOV
753.PHONY: clean-coverage
754clean-coverage:
755 $(call quiet-command, \
756 find . \( -name '*.gcda' -o -name '*.gcov' \) -type f -exec rm {} +, \
757 "CLEAN", "coverage files")
758endif
759
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200760clean: recurse-clean
bellard2d80ae82003-08-11 23:01:33 +0000761# avoid old build problems by removing potentially incorrect old files
Juan Quintela25be210f2009-10-07 02:41:00 +0200762 rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
Michael S. Tsirkindf2943b2010-10-26 17:53:41 +0200763 rm -f qemu-options.def
Yossi Hindin9dacf322015-05-06 14:57:40 +0300764 rm -f *.msi
Laszlo Ersek23858f42019-02-04 17:03:21 +0100765 find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f \
766 ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \
767 ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
768 ! -path ./roms/edk2/BaseTools/Source/Python/UPT/Dll/sqlite3.dll \
769 -exec rm {} +
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100770 rm -f $(edk2-decompressed)
Paolo Bonzini08144652019-07-18 12:22:01 +0200771 rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) TAGS cscope.* *.pod *~ */*~
Paolo Bonzinib855f8d2017-08-22 06:50:18 +0200772 rm -f fsdev/*.pod scsi/*.pod
Blue Swirl07b44ce2009-06-09 18:45:16 +0000773 rm -f qemu-img-cmds.h
Gerd Hoffmannd98bc0b2015-01-16 13:59:17 +0100774 rm -f ui/shader/*-vert.h ui/shader/*-frag.h
Laurent Vivier3dff1992019-04-01 16:12:19 +0200775 @# May not be present in generated-files-y
Lluís Vilanovaeac236e2012-12-14 20:13:09 +0100776 rm -f trace/generated-tracers-dtrace.dtrace*
777 rm -f trace/generated-tracers-dtrace.h*
Laurent Vivier3dff1992019-04-01 16:12:19 +0200778 rm -f $(foreach f,$(generated-files-y),$(f) $(f)-timestamp)
Markus Armbrusterfb0bc832018-02-26 13:48:58 -0600779 rm -f qapi-gen-timestamp
Kevin Wolf2af282e2020-02-24 15:30:08 +0100780 rm -f storage-daemon/qapi/qapi-gen-timestamp
Dunrong Huang54c2e502012-07-29 03:11:24 +0800781 rm -rf qga/qapi-generated
Juan Quintelae92af6e2018-07-16 10:41:30 +0200782 rm -f config-all-devices.mak
bellard31e31b82003-02-18 22:55:36 +0000783
Anthony Liguori34bb4432012-07-17 13:33:32 -0500784VERSION ?= $(shell cat VERSION)
785
786dist: qemu-$(VERSION).tar.bz2
787
788qemu-%.tar.bz2:
789 $(SRC_PATH)/scripts/make-release "$(SRC_PATH)" "$(patsubst qemu-%.tar.bz2,%,$@)"
790
Peter Maydell5f71eac2019-03-07 14:26:46 +0000791define clean-manual =
Peter Maydell1290e672019-03-08 13:57:42 +0000792rm -rf $(MANUAL_BUILDDIR)/$1/_static
793rm -f $(MANUAL_BUILDDIR)/$1/objects.inv $(MANUAL_BUILDDIR)/$1/searchindex.js $(MANUAL_BUILDDIR)/$1/*.html
Peter Maydell5f71eac2019-03-07 14:26:46 +0000794endef
795
bellard7d132992003-03-06 23:23:54 +0000796distclean: clean
Richard Hendersonee5195e2019-12-17 13:25:09 -1000797 rm -f config-host.mak config-host.h* $(DOCS)
Paolo Bonzini2038f8c2019-08-07 16:35:23 +0200798 rm -f tests/tcg/config-*.mak
Thomas Huthae219352014-12-15 11:19:46 +0100799 rm -f config-all-devices.mak config-all-disas.mak config.status
Juan Quintelae92af6e2018-07-16 10:41:30 +0200800 rm -f $(SUBDIR_DEVICES_MAK)
Thomas Huthae219352014-12-15 11:19:46 +0100801 rm -f po/*.mo tests/qemu-iotests/common.env
Magnus Dammfc8e3202009-11-13 18:51:05 +0900802 rm -f roms/seabios/config.mak roms/vgabios/config.mak
Emilio G. Cota26fffe22018-10-21 13:56:29 -0400803 rm -f qemu-plugins-ld.symbols qemu-plugins-ld64.symbols
Alexandre Raymond793553a2011-07-25 23:56:02 -0400804 rm -f config.log
Peter Maydell67ed96f2012-02-01 18:50:42 +0000805 rm -f linux-headers/asm
Paolo Bonzinid59157e2017-06-06 16:55:19 +0200806 rm -f docs/version.texi
807 rm -f docs/interop/qemu-ga-qapi.texi docs/interop/qemu-qmp-qapi.texi
808 rm -f docs/interop/qemu-qmp-ref.7 docs/interop/qemu-ga-ref.7
809 rm -f docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt
810 rm -f docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf
811 rm -f docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html
Peter Maydell81f33402019-03-08 13:57:43 +0000812 rm -rf .doctrees
Peter Maydell5f71eac2019-03-07 14:26:46 +0000813 $(call clean-manual,devel)
814 $(call clean-manual,interop)
Peter Maydell0783a732019-06-17 15:35:31 +0100815 $(call clean-manual,specs)
Peter Maydell09285232020-01-23 15:22:40 +0000816 $(call clean-manual,system)
Peter Maydell65c35422020-02-25 10:45:13 +0000817 $(call clean-manual,tools)
Paolo Bonzini09147932020-02-28 15:35:47 +0000818 $(call clean-manual,user)
Alex Bennée2b1f35b2018-07-04 07:30:11 +0100819 for d in $(TARGET_DIRS); do \
bellardbc1b0502003-10-28 00:12:52 +0000820 rm -rf $$d || exit 1 ; \
bellard76bc6832003-08-10 23:41:46 +0000821 done
Tomoki Sekiyamad9840e22013-08-07 11:40:03 -0400822 rm -Rf .sdk
Ed Mastefb8597b2015-04-01 13:58:38 -0400823 if test -f dtc/version_gen.h; then $(MAKE) $(DTC_MAKE_ARGS) clean; fi
bellard7d132992003-03-06 23:23:54 +0000824
Gerd Hoffmann06e77722018-11-16 11:43:16 +0100825KEYMAPS=da en-gb et fr fr-ch is lt no pt-br sv \
bellardfed4a9a2004-12-12 22:18:34 +0000826ar de en-us fi fr-be hr it lv nl pl ru th \
Gerd Hoffmann26b1cbf2018-11-16 11:43:18 +0100827de-ch es fo fr-ca hu ja mk pt sl tr \
Jan Krupa3751e722013-10-16 14:40:04 +0200828bepo cz
bellardfed4a9a2004-12-12 22:18:34 +0000829
ths77755342008-11-27 15:45:16 +0000830ifdef INSTALL_BLOBS
Bruce Rogers32eb2da2019-11-02 12:43:46 +0100831BLOBS=bios.bin bios-256k.bin bios-microvm.bin sgabios.bin vgabios.bin vgabios-cirrus.bin \
Gerd Hoffmann7a4dfd12014-09-10 13:04:17 +0200832vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin \
Gerd Hoffmann0a87fd62019-07-03 06:52:12 +0200833vgabios-ramfb.bin vgabios-bochs-display.bin vgabios-ati.bin \
Thomas Huthb2ce76a2020-01-14 12:46:17 +0100834openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin \
Alex Williamson5ee8ad72011-04-18 11:46:01 -0600835pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
836pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
Sander Eikelenboom9fd02972013-04-08 23:08:13 +0200837efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
838efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
Gerd Hoffmann45027802016-07-01 13:26:57 +0200839efi-e1000e.rom efi-vmxnet3.rom \
Philippe Mathieu-Daudéb3ce38d2019-07-15 19:48:14 +0200840qemu-nsis.bmp \
BALATON Zoltan4b387f92018-02-19 11:34:25 +0100841bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
Stefano Garzarella2785dc72019-01-18 13:01:41 +0100842multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin \
Christian Borntraeger6c5359e2017-07-12 16:00:41 +0200843s390-ccw.img s390-netboot.img \
Alexey Kardashevskiy744a9282019-07-16 15:27:43 +1000844slof.bin skiboot.lid \
Cole Robinson0c6ab8c2014-07-04 15:43:18 -0400845palcode-clipper \
BALATON Zoltan82e65fe2018-03-02 12:50:14 +0100846u-boot.e500 u-boot-sam460-20100605.bin \
Richard Henderson43ad2562018-01-21 13:04:45 -0800847qemu_vga.ndrv \
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100848edk2-licenses.txt \
Alistair Francis91f3a2f2019-07-16 11:47:22 -0700849hppa-firmware.img \
Bin Menga6fcc802020-02-24 05:39:42 -0800850opensbi-riscv32-sifive_u-fw_jump.bin opensbi-riscv32-virt-fw_jump.bin \
Alistair Francis91f3a2f2019-07-16 11:47:22 -0700851opensbi-riscv64-sifive_u-fw_jump.bin opensbi-riscv64-virt-fw_jump.bin
852
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100853
854DESCS=50-edk2-i386-secure.json 50-edk2-x86_64-secure.json \
85560-edk2-aarch64.json 60-edk2-arm.json 60-edk2-i386.json 60-edk2-x86_64.json
ths77755342008-11-27 15:45:16 +0000856else
857BLOBS=
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100858DESCS=
ths77755342008-11-27 15:45:16 +0000859endif
860
Peter Maydell336cfef2019-03-08 13:57:44 +0000861# Note that we manually filter-out the non-Sphinx documentation which
Peter Maydell27a296f2019-09-05 14:10:40 +0100862# is currently built into the docs/interop directory in the build tree,
863# and also any sphinx-built manpages.
Peter Maydell5f71eac2019-03-07 14:26:46 +0000864define install-manual =
Peter Maydell1290e672019-03-08 13:57:42 +0000865for d in $$(cd $(MANUAL_BUILDDIR) && find $1 -type d); do $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)/$$d"; done
Peter Maydell27a296f2019-09-05 14:10:40 +0100866for f in $$(cd $(MANUAL_BUILDDIR) && find $1 -type f -a '!' '(' -name '*.[0-9]' -o -name 'qemu-*-qapi.*' -o -name 'qemu-*-ref.*' ')' ); do $(INSTALL_DATA) "$(MANUAL_BUILDDIR)/$$f" "$(DESTDIR)$(qemu_docdir)/$$f"; done
Peter Maydell5f71eac2019-03-07 14:26:46 +0000867endef
868
869# Note that we deliberately do not install the "devel" manual: it is
870# for QEMU developers, and not interesting to our users.
871.PHONY: install-sphinxdocs
872install-sphinxdocs: sphinxdocs
873 $(call install-manual,interop)
Peter Maydell0783a732019-06-17 15:35:31 +0100874 $(call install-manual,specs)
Peter Maydell09285232020-01-23 15:22:40 +0000875 $(call install-manual,system)
Peter Maydell65c35422020-02-25 10:45:13 +0000876 $(call install-manual,tools)
Paolo Bonzini09147932020-02-28 15:35:47 +0000877 $(call install-manual,user)
Peter Maydell5f71eac2019-03-07 14:26:46 +0000878
879install-doc: $(DOCS) install-sphinxdocs
Eduardo Habkostd7dd65b2012-04-18 16:55:44 -0300880 $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
Stefan Hajnoczi22108f32019-12-19 13:56:20 +0000881 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/index.html "$(DESTDIR)$(qemu_docdir)"
Paolo Bonzinid59157e2017-06-06 16:55:19 +0200882 $(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
883 $(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
Juan Quintela96d409e2009-08-03 14:47:00 +0200884ifdef CONFIG_POSIX
aliguori58f8aea2009-04-18 15:36:02 +0000885 $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
Peter Maydelld06118b2020-02-28 15:36:15 +0000886 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu.1 "$(DESTDIR)$(mandir)/man1"
Marc-André Lureau56e8bdd2017-01-13 15:41:35 +0100887 $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man7"
Paolo Bonzinid59157e2017-06-06 16:55:19 +0200888 $(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
Peter Maydellacab9232020-01-23 15:22:40 +0000889 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
Kashyap Chamarthy1bf84a12020-02-28 15:36:01 +0000890 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-cpu-models.7 "$(DESTDIR)$(mandir)/man7"
Paolo Bonzinic932ce32019-07-18 12:24:29 +0200891ifeq ($(CONFIG_TOOLS),y)
Peter Maydella08b4a92020-02-25 10:45:14 +0000892 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-img.1 "$(DESTDIR)$(mandir)/man1"
aliguori58f8aea2009-04-18 15:36:02 +0000893 $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
Peter Maydella08b4a92020-02-25 10:45:14 +0000894 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
pbrook38954dc2006-04-30 23:54:18 +0000895endif
Daniel P. Berrangé62dd1042019-01-23 12:00:16 +0000896ifdef CONFIG_TRACE_SYSTEMTAP
Peter Maydella08b4a92020-02-25 10:45:14 +0000897 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-trace-stap.1 "$(DESTDIR)$(mandir)/man1"
Daniel P. Berrangé62dd1042019-01-23 12:00:16 +0000898endif
Marc-André Lureau665b5d02015-08-27 01:34:59 +0200899ifneq (,$(findstring qemu-ga,$(TOOLS)))
Peter Maydellb53c54c2019-09-19 16:59:57 +0100900 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/interop/qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
Paolo Bonzinid59157e2017-06-06 16:55:19 +0200901 $(INSTALL_DATA) docs/interop/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)"
902 $(INSTALL_DATA) docs/interop/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)"
903 $(INSTALL_DATA) docs/interop/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7"
Marc-André Lureau665b5d02015-08-27 01:34:59 +0200904endif
Andreas Färber8a3e8f72013-06-11 13:13:58 +0200905endif
M. Mohan Kumara2d8f1b2011-12-14 13:58:47 +0530906ifdef CONFIG_VIRTFS
907 $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
Peter Maydella08b4a92020-02-25 10:45:14 +0000908 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
M. Mohan Kumara2d8f1b2011-12-14 13:58:47 +0530909endif
Stefan Hajnoczi6a7e2bb2020-02-07 16:29:51 +0000910ifeq ($(CONFIG_LINUX)$(CONFIG_SECCOMP)$(CONFIG_LIBCAP_NG),yyy)
Peter Maydella08b4a92020-02-25 10:45:14 +0000911 $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/virtiofsd.1 "$(DESTDIR)$(mandir)/man1"
Stefan Hajnoczi6a7e2bb2020-02-07 16:29:51 +0000912endif
john cooperb5ec5ce2010-02-20 11:14:59 -0600913
Eduardo Habkoste2d87bf2012-05-02 13:07:30 -0300914install-datadir:
915 $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)"
916
Laszlo Ersekf2e39782013-05-18 07:13:14 +0200917install-localstatedir:
918ifdef CONFIG_POSIX
919ifneq (,$(findstring qemu-ga,$(TOOLS)))
920 $(INSTALL_DIR) "$(DESTDIR)$(qemu_localstatedir)"/run
921endif
922endif
923
Daniel P. Berrangéa8260d32019-01-10 12:00:45 +0000924ICON_SIZES=16x16 24x24 32x32 48x48 64x64 128x128 256x256 512x512
Eduardo Habkoste2d87bf2012-05-02 13:07:30 -0300925
Emilio G. Cota54cb65d2017-08-30 18:39:53 -0400926install-includedir:
927 $(INSTALL_DIR) "$(DESTDIR)$(includedir)"
928
929install: all $(if $(BUILD_DOCS),install-doc) \
930 install-datadir install-localstatedir install-includedir \
Markus Armbruster1338a4b2019-05-28 10:23:08 +0200931 $(if $(INSTALL_BLOBS),$(edk2-decompressed)) \
932 recurse-install
ths932a79d2007-10-20 18:29:34 +0000933ifneq ($(TOOLS),)
Paolo Bonzini08144652019-07-18 12:22:01 +0200934 $(call install-prog,$(TOOLS),$(DESTDIR)$(bindir))
ths932a79d2007-10-20 18:29:34 +0000935endif
Fam Zhenge3be6f02014-02-10 14:48:58 +0800936ifneq ($(CONFIG_MODULES),)
937 $(INSTALL_DIR) "$(DESTDIR)$(qemu_moddir)"
Michael Tokarev21151822014-05-08 14:56:58 +0400938 for s in $(modules-m:.mo=$(DSOSUF)); do \
939 t="$(DESTDIR)$(qemu_moddir)/$$(echo $$s | tr / -)"; \
Michael Tokarev264f8b42014-05-08 15:06:03 +0400940 $(INSTALL_LIB) $$s "$$t"; \
Michael Tokarev21151822014-05-08 14:56:58 +0400941 test -z "$(STRIP)" || $(STRIP) "$$t"; \
Fam Zhenge3be6f02014-02-10 14:48:58 +0800942 done
943endif
Corey Bryant7b93fad2012-01-26 09:42:24 -0500944ifneq ($(HELPERS-y),)
Michael Tokarev0d659422014-06-22 10:55:23 +0400945 $(call install-prog,$(HELPERS-y),$(DESTDIR)$(libexecdir))
Corey Bryant7b93fad2012-01-26 09:42:24 -0500946endif
Marc-André Lureaud52c4542019-05-24 15:09:42 +0200947ifneq ($(vhost-user-json-y),)
948 $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/vhost-user/"
949 for x in $(vhost-user-json-y); do \
950 $(INSTALL_DATA) $$x "$(DESTDIR)$(qemu_datadir)/vhost-user/"; \
951 done
952endif
Daniel P. Berrangé62dd1042019-01-23 12:00:16 +0000953ifdef CONFIG_TRACE_SYSTEMTAP
954 $(INSTALL_PROG) "scripts/qemu-trace-stap" $(DESTDIR)$(bindir)
955endif
ths77755342008-11-27 15:45:16 +0000956ifneq ($(BLOBS),)
ths77755342008-11-27 15:45:16 +0000957 set -e; for x in $(BLOBS); do \
Eduardo Habkost6aae2a22012-04-18 16:55:41 -0300958 $(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
pbrookad064842006-04-16 12:41:07 +0000959 done
ths77755342008-11-27 15:45:16 +0000960endif
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100961ifdef INSTALL_BLOBS
962 set -e; for x in $(edk2-decompressed); do \
963 $(INSTALL_DATA) $$x "$(DESTDIR)$(qemu_datadir)"; \
964 done
965endif
966ifneq ($(DESCS),)
967 $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/firmware"
968 set -e; tmpf=$$(mktemp); trap 'rm -f -- "$$tmpf"' EXIT; \
969 for x in $(DESCS); do \
Olaf Hering177cd672019-05-30 21:28:11 +0200970 sed -e 's,@DATADIR@,$(qemu_datadir),' \
Laszlo Ersek26ce90f2019-03-08 01:19:35 +0100971 "$(SRC_PATH)/pc-bios/descriptors/$$x" > "$$tmpf"; \
972 $(INSTALL_DATA) "$$tmpf" \
973 "$(DESTDIR)$(qemu_datadir)/firmware/$$x"; \
974 done
975endif
Daniel P. Berrangéa8260d32019-01-10 12:00:45 +0000976 for s in $(ICON_SIZES); do \
Stefan Hajnoczi6c11dda2019-05-21 15:53:18 +0100977 mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps"; \
Daniel P. Berrangéa8260d32019-01-10 12:00:45 +0000978 $(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_$${s}.png \
Stefan Hajnoczi6c11dda2019-05-21 15:53:18 +0100979 "$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps/qemu.png"; \
Daniel P. Berrangéa8260d32019-01-10 12:00:45 +0000980 done; \
Stefan Hajnoczi6c11dda2019-05-21 15:53:18 +0100981 mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/32x32/apps"; \
Daniel P. Berrangéa8260d32019-01-10 12:00:45 +0000982 $(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_32x32.bmp \
Stefan Hajnoczi6c11dda2019-05-21 15:53:18 +0100983 "$(DESTDIR)$(qemu_icondir)/hicolor/32x32/apps/qemu.bmp"; \
984 mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/scalable/apps"; \
Daniel P. Berrangéa8260d32019-01-10 12:00:45 +0000985 $(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu.svg \
Stefan Hajnoczi6c11dda2019-05-21 15:53:18 +0100986 "$(DESTDIR)$(qemu_icondir)/hicolor/scalable/apps/qemu.svg"
987 mkdir -p "$(DESTDIR)$(qemu_desktopdir)"
Daniel P. Berrangé67ea9542019-01-10 12:00:46 +0000988 $(INSTALL_DATA) $(SRC_PATH)/ui/qemu.desktop \
Stefan Hajnoczi6c11dda2019-05-21 15:53:18 +0100989 "$(DESTDIR)$(qemu_desktopdir)/qemu.desktop"
Michael Tokarev2a6b5372018-04-16 12:37:19 +0300990ifdef CONFIG_GTK
Anthony Liguori834574e2013-02-20 07:43:24 -0600991 $(MAKE) -C po $@
992endif
Emilio G. Cota54cb65d2017-08-30 18:39:53 -0400993ifeq ($(CONFIG_PLUGIN),y)
994 $(INSTALL_DATA) $(SRC_PATH)/include/qemu/qemu-plugin.h "$(DESTDIR)$(includedir)/qemu-plugin.h"
995endif
Eduardo Habkost6aae2a22012-04-18 16:55:41 -0300996 $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
blueswir118be8d72008-03-05 18:16:09 +0000997 set -e; for x in $(KEYMAPS); do \
Eduardo Habkost6aae2a22012-04-18 16:55:41 -0300998 $(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
pbrookad064842006-04-16 12:41:07 +0000999 done
Daniel P. Berrange1412cf52016-06-16 09:39:47 +01001000 $(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
bellard612384d2003-03-22 17:31:19 +00001001
Fam Zhengae5fdc82015-05-22 13:35:08 +08001002.PHONY: ctags
1003ctags:
Sergey Fedorovac99c622016-06-09 20:58:35 +03001004 rm -f tags
Fam Zhengae5fdc82015-05-22 13:35:08 +08001005 find "$(SRC_PATH)" -name '*.[hc]' -exec ctags --append {} +
1006
Alexandre Bique21d4e8e2009-08-07 15:43:11 +01001007.PHONY: TAGS
ths5fafdf22007-09-16 21:08:06 +00001008TAGS:
Sergey Fedorovac99c622016-06-09 20:58:35 +03001009 rm -f TAGS
David Gibsonb1999e82013-03-12 13:57:28 +11001010 find "$(SRC_PATH)" -name '*.[hc]' -exec etags --append {} +
bellard31e31b82003-02-18 22:55:36 +00001011
bellard6688bc62005-08-21 09:23:39 +00001012cscope:
Fam Zhengeaa2ddb2015-05-22 13:35:07 +08001013 rm -f "$(SRC_PATH)"/cscope.*
1014 find "$(SRC_PATH)/" -name "*.[chsS]" -print | sed 's,^\./,,' > "$(SRC_PATH)/cscope.files"
1015 cscope -b -i"$(SRC_PATH)/cscope.files"
bellard6688bc62005-08-21 09:23:39 +00001016
Gerd Hoffmannd98bc0b2015-01-16 13:59:17 +01001017# opengl shader programs
1018ui/shader/%-vert.h: $(SRC_PATH)/ui/shader/%.vert $(SRC_PATH)/scripts/shaderinclude.pl
1019 @mkdir -p $(dir $@)
1020 $(call quiet-command,\
1021 perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
Peter Maydell0bdb12c2016-10-04 17:27:21 +01001022 "VERT","$@")
Gerd Hoffmannd98bc0b2015-01-16 13:59:17 +01001023
1024ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclude.pl
1025 @mkdir -p $(dir $@)
1026 $(call quiet-command,\
1027 perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
Peter Maydell0bdb12c2016-10-04 17:27:21 +01001028 "FRAG","$@")
Gerd Hoffmannd98bc0b2015-01-16 13:59:17 +01001029
Gerd Hoffmann46e19e12017-10-10 15:54:49 +02001030ui/shader.o: $(SRC_PATH)/ui/shader.c \
Gerd Hoffmann2e1d70b2017-10-10 15:54:50 +02001031 ui/shader/texture-blit-vert.h \
1032 ui/shader/texture-blit-flip-vert.h \
1033 ui/shader/texture-blit-frag.h
Gerd Hoffmanncd2bc882015-01-09 11:40:23 +01001034
bellard3ef693a2003-03-23 20:17:16 +00001035# documentation
Markus Armbrustere8518c92017-01-19 10:06:44 +01001036MAKEINFO=makeinfo
Paolo Bonzinid59157e2017-06-06 16:55:19 +02001037MAKEINFOINCLUDES= -I docs -I $(<D) -I $(@D)
1038MAKEINFOFLAGS=--no-split --number-sections $(MAKEINFOINCLUDES)
Marc-André Lureaue8338fd2018-11-26 14:51:25 +04001039TEXI2PODFLAGS=$(MAKEINFOINCLUDES) -DVERSION="$(VERSION)" -DCONFDIR="$(qemu_confdir)"
Paolo Bonzinid59157e2017-06-06 16:55:19 +02001040TEXI2PDFFLAGS=$(if $(V),,--quiet) -I $(SRC_PATH) $(MAKEINFOINCLUDES)
Marc-André Lureau56e8bdd2017-01-13 15:41:35 +01001041
Marc-André Lureaue8338fd2018-11-26 14:51:25 +04001042docs/version.texi: $(SRC_PATH)/VERSION config-host.mak
1043 $(call quiet-command,(\
1044 echo "@set VERSION $(VERSION)" && \
1045 echo "@set CONFDIR $(qemu_confdir)" \
1046 )> $@,"GEN","$@")
Peter Maydellfea346f2017-02-17 18:59:28 +00001047
Paolo Bonzini44cb2802017-06-06 16:59:37 +02001048%.html: %.texi docs/version.texi
Marc-André Lureaue9ee06b2017-01-13 15:41:31 +01001049 $(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
1050 --html $< -o $@,"GEN","$@")
bellard3ef693a2003-03-23 20:17:16 +00001051
Paolo Bonzini44cb2802017-06-06 16:59:37 +02001052%.info: %.texi docs/version.texi
Marc-André Lureaue9ee06b2017-01-13 15:41:31 +01001053 $(call quiet-command,$(MAKEINFO) $(MAKEINFOFLAGS) $< -o $@,"GEN","$@")
bellardf3548322006-04-30 22:51:54 +00001054
Paolo Bonzini44cb2802017-06-06 16:59:37 +02001055%.txt: %.texi docs/version.texi
Marc-André Lureauf8bab102017-01-13 15:41:34 +01001056 $(call quiet-command,LC_ALL=C $(MAKEINFO) $(MAKEINFOFLAGS) --no-headers \
1057 --plaintext $< -o $@,"GEN","$@")
1058
Paolo Bonzini44cb2802017-06-06 16:59:37 +02001059%.pdf: %.texi docs/version.texi
Paolo Bonzinid59157e2017-06-06 16:55:19 +02001060 $(call quiet-command,texi2pdf $(TEXI2PDFFLAGS) $< -o $@,"GEN","$@")
Markus Armbrusterbd7f9742017-03-15 13:56:56 +01001061
Peter Maydell5f71eac2019-03-07 14:26:46 +00001062# Sphinx builds all its documentation at once in one invocation
1063# and handles "don't rebuild things unless necessary" itself.
1064# The '.doctrees' files are cached information to speed this up.
1065.PHONY: sphinxdocs
Peter Maydell09285232020-01-23 15:22:40 +00001066sphinxdocs: $(MANUAL_BUILDDIR)/devel/index.html \
1067 $(MANUAL_BUILDDIR)/interop/index.html \
1068 $(MANUAL_BUILDDIR)/specs/index.html \
Peter Maydell65c35422020-02-25 10:45:13 +00001069 $(MANUAL_BUILDDIR)/system/index.html \
Paolo Bonzini09147932020-02-28 15:35:47 +00001070 $(MANUAL_BUILDDIR)/tools/index.html \
1071 $(MANUAL_BUILDDIR)/user/index.html
Peter Maydell5f71eac2019-03-07 14:26:46 +00001072
1073# Canned command to build a single manual
Peter Maydell27a296f2019-09-05 14:10:40 +01001074# Arguments: $1 = manual name, $2 = Sphinx builder ('html' or 'man')
Eduardo Habkost6bda4152019-10-14 12:01:33 -03001075# Note the use of different doctree for each (manual, builder) tuple;
1076# this works around Sphinx not handling parallel invocation on
1077# a single doctree: https://github.com/sphinx-doc/sphinx/issues/2946
Peter Maydell516e8b72020-04-11 19:29:32 +01001078build-manual = $(call quiet-command,CONFDIR="$(qemu_confdir)" $(SPHINX_BUILD) $(if $(V),,-q) $(SPHINX_WERROR) -b $2 -D version=$(VERSION) -D release="$(FULL_VERSION)" -d .doctrees/$1-$2 $(SRC_PATH)/docs/$1 $(MANUAL_BUILDDIR)/$1 ,"SPHINX","$(MANUAL_BUILDDIR)/$1")
Peter Maydell5f71eac2019-03-07 14:26:46 +00001079# We assume all RST files in the manual's directory are used in it
Peter Maydell814e0682020-03-09 21:58:14 +00001080manual-deps = $(wildcard $(SRC_PATH)/docs/$1/*.rst $(SRC_PATH)/docs/$1/*/*.rst) \
Peter Maydellde1572c2020-02-28 15:36:00 +00001081 $(SRC_PATH)/docs/defs.rst.inc \
Peter Maydell9165d322020-03-06 17:17:47 +00001082 $(SRC_PATH)/docs/$1/conf.py $(SRC_PATH)/docs/conf.py \
1083 $(SRC_PATH)/docs/sphinx/*.py
Peter Maydelle0f37282020-01-24 16:25:59 +00001084# Macro to write out the rule and dependencies for building manpages
1085# Usage: $(call define-manpage-rule,manualname,manpage1 manpage2...[,extradeps])
1086# 'extradeps' is optional, and specifies extra files (eg .hx files) that
1087# the manual page depends on.
1088define define-manpage-rule
1089$(call atomic,$(foreach manpage,$2,$(MANUAL_BUILDDIR)/$1/$(manpage)),$(call manual-deps,$1) $3)
1090 $(call build-manual,$1,man)
1091endef
Peter Maydell5f71eac2019-03-07 14:26:46 +00001092
Peter Maydell1290e672019-03-08 13:57:42 +00001093$(MANUAL_BUILDDIR)/devel/index.html: $(call manual-deps,devel)
Peter Maydell27a296f2019-09-05 14:10:40 +01001094 $(call build-manual,devel,html)
Peter Maydell5f71eac2019-03-07 14:26:46 +00001095
Peter Maydella08b4a92020-02-25 10:45:14 +00001096$(MANUAL_BUILDDIR)/interop/index.html: $(call manual-deps,interop)
Peter Maydell27a296f2019-09-05 14:10:40 +01001097 $(call build-manual,interop,html)
Peter Maydell5f71eac2019-03-07 14:26:46 +00001098
Peter Maydell0783a732019-06-17 15:35:31 +01001099$(MANUAL_BUILDDIR)/specs/index.html: $(call manual-deps,specs)
Peter Maydell27a296f2019-09-05 14:10:40 +01001100 $(call build-manual,specs,html)
1101
Peter Maydell09ce5f22020-02-28 15:36:13 +00001102$(MANUAL_BUILDDIR)/system/index.html: $(call manual-deps,system) $(SRC_PATH)/hmp-commands.hx $(SRC_PATH)/hmp-commands-info.hx $(SRC_PATH)/qemu-options.hx
Peter Maydell09285232020-01-23 15:22:40 +00001103 $(call build-manual,system,html)
1104
Peter Maydella08b4a92020-02-25 10:45:14 +00001105$(MANUAL_BUILDDIR)/tools/index.html: $(call manual-deps,tools) $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/docs/qemu-option-trace.rst.inc
Peter Maydell65c35422020-02-25 10:45:13 +00001106 $(call build-manual,tools,html)
1107
Paolo Bonzini09147932020-02-28 15:35:47 +00001108$(MANUAL_BUILDDIR)/user/index.html: $(call manual-deps,user)
1109 $(call build-manual,user,html)
1110
Peter Maydella08b4a92020-02-25 10:45:14 +00001111$(call define-manpage-rule,interop,qemu-ga.8)
Peter Maydell0783a732019-06-17 15:35:31 +01001112
Peter Maydelld06118b2020-02-28 15:36:15 +00001113$(call define-manpage-rule,system,qemu.1 qemu-block-drivers.7 qemu-cpu-models.7)
Peter Maydellacab9232020-01-23 15:22:40 +00001114
Peter Maydella08b4a92020-02-25 10:45:14 +00001115$(call define-manpage-rule,tools,\
1116 qemu-img.1 qemu-nbd.8 qemu-trace-stap.1\
1117 virtiofsd.1 virtfs-proxy-helper.1,\
1118 $(SRC_PATH)/qemu-img-cmds.hx $(SRC_PATH)/docs/qemu-option-trace.rst.inc)
1119
Stefan Hajnoczi22108f32019-12-19 13:56:20 +00001120$(MANUAL_BUILDDIR)/index.html: $(SRC_PATH)/docs/index.html.in qemu-version.h
Stefan Hajnoczid83bbed2020-01-20 16:34:00 +00001121 @mkdir -p "$(MANUAL_BUILDDIR)"
Stefan Hajnoczi22108f32019-12-19 13:56:20 +00001122 $(call quiet-command, sed "s|@@VERSION@@|${VERSION}|g" $< >$@, \
1123 "GEN","$@")
1124
Markus Armbrustereb815e22018-02-11 10:36:05 +01001125docs/interop/qemu-qmp-qapi.texi: qapi/qapi-doc.texi
Markus Armbrusterfb0bc832018-02-26 13:48:58 -06001126 @cp -p $< $@
Markus Armbruster4afeeb52017-03-20 14:11:50 +01001127
Markus Armbrusterfb0bc832018-02-26 13:48:58 -06001128docs/interop/qemu-ga-qapi.texi: qga/qapi-generated/qga-qapi-doc.texi
1129 @cp -p $< $@
Marc-André Lureau56e8bdd2017-01-13 15:41:35 +01001130
Peter Maydell5b1d0e92020-02-28 15:36:17 +00001131html: docs/interop/qemu-qmp-ref.html docs/interop/qemu-ga-ref.html sphinxdocs
1132info: docs/interop/qemu-qmp-ref.info docs/interop/qemu-ga-ref.info
1133pdf: docs/interop/qemu-qmp-ref.pdf docs/interop/qemu-ga-ref.pdf
1134txt: docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt
aliguori818220f2008-09-24 01:13:40 +00001135
Paolo Bonzinid59157e2017-06-06 16:55:19 +02001136docs/interop/qemu-ga-ref.dvi docs/interop/qemu-ga-ref.html \
1137 docs/interop/qemu-ga-ref.info docs/interop/qemu-ga-ref.pdf \
1138 docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7: \
1139 docs/interop/qemu-ga-ref.texi docs/interop/qemu-ga-qapi.texi
Marc-André Lureau56e8bdd2017-01-13 15:41:35 +01001140
Paolo Bonzinid59157e2017-06-06 16:55:19 +02001141docs/interop/qemu-qmp-ref.dvi docs/interop/qemu-qmp-ref.html \
1142 docs/interop/qemu-qmp-ref.info docs/interop/qemu-qmp-ref.pdf \
1143 docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7: \
1144 docs/interop/qemu-qmp-ref.texi docs/interop/qemu-qmp-qapi.texi
Marc-André Lureau56e8bdd2017-01-13 15:41:35 +01001145
Eric Blakeae560cc2019-01-17 13:36:39 -06001146$(filter %.1 %.7 %.8,$(DOCS)): scripts/texi2pod.pl
1147
Alex Bennéefe8bf5f2018-06-20 14:04:24 +01001148# Reports/Analysis
1149
1150%/coverage-report.html:
1151 @mkdir -p $*
1152 $(call quiet-command,\
Alex Bennée5eda6e42019-04-30 16:59:48 +01001153 gcovr -r $(SRC_PATH) \
1154 $(foreach t, $(TARGET_DIRS), --object-directory $(BUILD_DIR)/$(t)) \
1155 --object-directory $(BUILD_DIR) \
Alex Bennée337f2312019-03-12 09:18:31 +00001156 -p --html --html-details -o $@, \
Alex Bennéefe8bf5f2018-06-20 14:04:24 +01001157 "GEN", "coverage-report.html")
1158
1159.PHONY: coverage-report
1160coverage-report: $(CURDIR)/reports/coverage/coverage-report.html
Marc-André Lureau56e8bdd2017-01-13 15:41:35 +01001161
Stefan Weilf53ec692013-07-15 23:49:57 +02001162ifdef CONFIG_WIN32
1163
1164INSTALLER = qemu-setup-$(VERSION)$(EXESUF)
1165
1166nsisflags = -V2 -NOCD
1167
1168ifneq ($(wildcard $(SRC_PATH)/dll),)
1169ifeq ($(ARCH),x86_64)
1170# 64 bit executables
1171DLL_PATH = $(SRC_PATH)/dll/w64
1172nsisflags += -DW64
1173else
1174# 32 bit executables
1175DLL_PATH = $(SRC_PATH)/dll/w32
1176endif
1177endif
1178
1179.PHONY: installer
1180installer: $(INSTALLER)
1181
1182INSTDIR=/tmp/qemu-nsis
1183
Philippe Mathieu-Daudéf84f9f72019-07-15 19:48:13 +02001184$(INSTALLER): install-doc $(SRC_PATH)/qemu.nsi
Ed Mastefb8597b2015-04-01 13:58:38 -04001185 $(MAKE) install prefix=${INSTDIR}
Stefan Weilf53ec692013-07-15 23:49:57 +02001186ifdef SIGNCODE
1187 (cd ${INSTDIR}; \
1188 for i in *.exe; do \
1189 $(SIGNCODE) $${i}; \
1190 done \
1191 )
1192endif # SIGNCODE
1193 (cd ${INSTDIR}; \
1194 for i in qemu-system-*.exe; do \
1195 arch=$${i%.exe}; \
1196 arch=$${arch#qemu-system-}; \
1197 echo Section \"$$arch\" Section_$$arch; \
1198 echo SetOutPath \"\$$INSTDIR\"; \
1199 echo File \"\$${BINDIR}\\$$i\"; \
1200 echo SectionEnd; \
1201 done \
1202 ) >${INSTDIR}/system-emulations.nsh
1203 makensis $(nsisflags) \
1204 $(if $(BUILD_DOCS),-DCONFIG_DOCUMENTATION="y") \
1205 $(if $(CONFIG_GTK),-DCONFIG_GTK="y") \
1206 -DBINDIR="${INSTDIR}" \
1207 $(if $(DLL_PATH),-DDLLDIR="$(DLL_PATH)") \
1208 -DSRCDIR="$(SRC_PATH)" \
1209 -DOUTFILE="$(INSTALLER)" \
Stefan Weil805d8a62015-05-03 19:57:09 +02001210 -DDISPLAYVERSION="$(VERSION)" \
Stefan Weilf53ec692013-07-15 23:49:57 +02001211 $(SRC_PATH)/qemu.nsi
1212 rm -r ${INSTDIR}
1213ifdef SIGNCODE
1214 $(SIGNCODE) $(INSTALLER)
1215endif # SIGNCODE
1216endif # CONFIG_WIN
1217
Anthony Liguoricb5fc672012-07-17 18:58:20 -05001218# Add a dependency on the generated files, so that they are always
1219# rebuilt before other object files
Thomas Huth428952c2017-06-08 14:59:59 +02001220ifneq ($(wildcard config-host.mak),)
Fam Zhengeaa2ddb2015-05-22 13:35:07 +08001221ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
Laurent Vivier3dff1992019-04-01 16:12:19 +02001222Makefile: $(generated-files-y)
Mike Frysinger7748b8c2012-09-16 16:07:13 -04001223endif
Thomas Huth428952c2017-06-08 14:59:59 +02001224endif
Anthony Liguoricb5fc672012-07-17 18:58:20 -05001225
Daniel P. Berrange0ab8ed12017-01-25 16:14:15 +00001226.SECONDARY: $(TRACE_HEADERS) $(TRACE_HEADERS:%=%-timestamp) \
1227 $(TRACE_SOURCES) $(TRACE_SOURCES:%=%-timestamp) \
1228 $(TRACE_DTRACE) $(TRACE_DTRACE:%=%-timestamp)
1229
bellard4fb240a2007-11-07 19:24:02 +00001230# Include automatically generated dependency files
Paolo Bonzini1435ddb2012-07-11 16:40:21 +02001231# Dependencies in Makefile.objs files come from our recursive subdir rules
1232-include $(wildcard *.d tests/*.d)
Fam Zheng324027c2016-06-01 12:25:17 +08001233
1234include $(SRC_PATH)/tests/docker/Makefile.include
Fam Zhengb1fb9a62017-09-05 10:11:58 +08001235include $(SRC_PATH)/tests/vm/Makefile.include
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001236
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001237print-help-run = printf " %-30s - %s\\n" "$1" "$2"
1238print-help = $(quiet-@)$(call print-help-run,$1,$2)
1239
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001240.PHONY: help
1241help:
1242 @echo 'Generic targets:'
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001243 $(call print-help,all,Build all)
Marc-André Lureau0decdfe2018-03-06 17:17:28 +01001244ifdef CONFIG_MODULES
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001245 $(call print-help,modules,Build all modules)
Marc-André Lureau0decdfe2018-03-06 17:17:28 +01001246endif
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001247 $(call print-help,dir/file.o,Build specified target only)
1248 $(call print-help,install,Install QEMU, documentation and tools)
1249 $(call print-help,ctags/TAGS,Generate tags file for editors)
1250 $(call print-help,cscope,Generate cscope index)
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001251 @echo ''
Alex Bennée2b1f35b2018-07-04 07:30:11 +01001252 @$(if $(TARGET_DIRS), \
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001253 echo 'Architecture specific targets:'; \
Alex Bennée2b1f35b2018-07-04 07:30:11 +01001254 $(foreach t, $(TARGET_DIRS), \
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001255 $(call print-help-run,$(t)/all,Build for $(t));) \
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001256 echo '')
Philippe Mathieu-Daudé81ed0a52020-03-05 01:48:55 +01001257 @$(if $(TOOLS), \
1258 echo 'Tools targets:'; \
1259 $(foreach t, $(TOOLS), \
1260 $(call print-help-run,$(t),Build $(shell basename $(t)) tool);) \
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001261 echo '')
1262 @echo 'Cleaning targets:'
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001263 $(call print-help,clean,Remove most generated files but keep the config)
Alex Bennée990e6a22018-06-20 12:34:45 +01001264ifdef CONFIG_GCOV
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001265 $(call print-help,clean-coverage,Remove coverage files)
Alex Bennée990e6a22018-06-20 12:34:45 +01001266endif
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001267 $(call print-help,distclean,Remove all generated files)
1268 $(call print-help,dist,Build a distributable tarball)
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001269 @echo ''
1270 @echo 'Test targets:'
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001271 $(call print-help,check,Run all tests (check-help for details))
1272 $(call print-help,docker,Help about targets running tests inside containers)
1273 $(call print-help,vm-help,Help about targets running tests inside VM)
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001274 @echo ''
1275 @echo 'Documentation targets:'
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001276 $(call print-help,html info pdf txt,Build documentation in specified format)
Alex Bennéefe8bf5f2018-06-20 14:04:24 +01001277ifdef CONFIG_GCOV
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001278 $(call print-help,coverage-report,Create code coverage report)
Alex Bennéefe8bf5f2018-06-20 14:04:24 +01001279endif
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001280 @echo ''
1281ifdef CONFIG_WIN32
1282 @echo 'Windows targets:'
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001283 $(call print-help,installer,Build NSIS-based installer for QEMU)
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001284ifdef QEMU_GA_MSI_ENABLED
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001285 $(call print-help,msi,Build MSI-based installer for qemu-ga)
Marc-André Lureau0d8e0652016-09-13 18:20:33 +04001286endif
1287 @echo ''
1288endif
Philippe Mathieu-Daudéc355de52020-03-05 01:48:54 +01001289 $(call print-help,$(MAKE) [targets],(quiet build, default))
1290 $(call print-help,$(MAKE) V=1 [targets],(verbose build))