1XEN_ROOT = $(CURDIR)/..
2
3export PKG_CONFIG_DIR = $(CURDIR)/pkg-config
4
5include $(XEN_ROOT)/tools/Rules.mk
6
7SUBDIRS-y :=
8SUBDIRS-y += libs
9SUBDIRS-y += flask
10SUBDIRS-y += fuzz
11SUBDIRS-y += xs-clients
12SUBDIRS-$(XENSTORE_XENSTORED) += xenstored
13SUBDIRS-y += misc
14SUBDIRS-y += examples
15SUBDIRS-y += hotplug
16SUBDIRS-y += xentrace
17SUBDIRS-$(CONFIG_XCUTILS) += xcutils
18SUBDIRS-$(CONFIG_X86) += firmware
19SUBDIRS-y += console
20SUBDIRS-y += xenmon
21SUBDIRS-$(XENSTAT_XENTOP) += xentop
22SUBDIRS-$(CONFIG_LIBFSIMAGE) += libfsimage
23SUBDIRS-$(CONFIG_Linux) += vchan
24
25# do not recurse in to a dir we are about to delete
26ifneq "$(MAKECMDGOALS)" "distclean"
27SUBDIRS-$(CONFIG_QEMU_TRAD) += qemu-xen-traditional-dir
28SUBDIRS-$(CONFIG_QEMU_XEN) += qemu-xen-dir
29endif
30
31SUBDIRS-y += xenpmd
32SUBDIRS-$(CONFIG_GOLANG) += golang
33SUBDIRS-y += xl
34SUBDIRS-y += helpers
35SUBDIRS-y += 9pfsd
36SUBDIRS-$(CONFIG_X86) += xenpaging
37SUBDIRS-$(CONFIG_X86) += debugger
38SUBDIRS-$(CONFIG_TESTS) += tests
39
40SUBDIRS-y += python
41SUBDIRS-$(CONFIG_PYGRUB) += pygrub
42SUBDIRS-$(OCAML_TOOLS) += ocaml
43
44ifeq ($(CONFIG_RUMP),y)
45SUBDIRS-y := libs
46endif
47
48# For the sake of linking, set the sys-root
49ifneq ($(CROSS_COMPILE),)
50CROSS_BIN_PATH ?= /usr/$(CROSS_COMPILE:-=)/bin
51CROSS_SYS_ROOT ?= /usr/$(CROSS_COMPILE:-=)/sys-root
52export CROSS_SYS_ROOT # exported for check/funcs.sh
53export CROSS_BIN_PATH # exported for cross-install.sh
54endif
55
56.PHONY: build all
57build all: subdirs-all
58
59.PHONY: install
60install:
61	$(INSTALL_DIR) -m 700 $(DESTDIR)$(XEN_DUMP_DIR)
62	$(INSTALL_DIR) $(DESTDIR)$(XEN_LOG_DIR)
63	$(INSTALL_DIR) $(DESTDIR)$(XEN_LIB_DIR)
64	$(INSTALL_DIR) $(DESTDIR)$(PKG_INSTALLDIR)
65	$(MAKE) subdirs-install
66
67.PHONY: uninstall
68uninstall: D=$(DESTDIR)
69uninstall:
70	[ -d $(D)$(XEN_CONFIG_DIR) ] && mv -f $(D)$(XEN_CONFIG_DIR) $(D)$(XEN_CONFIG_DIR).old-`date +%s` || true
71	rm -rf $(D)$(libdir)/xen
72	rm -rf $(D)$(SHAREDIR)/xen
73	rm -rf $(D)$(SHAREDIR)/qemu-xen
74	$(MAKE) subdirs-uninstall
75
76.PHONY: clean
77clean: subdirs-clean
78	rm -rf pkg-config
79
80.PHONY: distclean
81distclean: subdirs-distclean clean
82	rm -rf qemu-xen-traditional-dir qemu-xen-traditional-dir-remote
83	rm -rf qemu-xen-dir qemu-xen-dir-remote qemu-xen-build
84	rm -rf ../config/Tools.mk config.h config.log config.status \
85		config.cache autom4te.cache
86
87ifneq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
88IOEMU_CONFIGURE_CROSS ?= --cross-prefix=$(CROSS_COMPILE) \
89			 --interp-prefix=$(CROSS_SYS_ROOT)
90endif
91
92ifeq ($(XEN_TOOLS_RPATH),y)
93QEMU_UPSTREAM_RPATH := -Wl,-rpath,$(LIBEXEC_LIB):$(libdir)
94IOEMU_EXTRA_LDFLAGS := --extra-ldflags="-Wl,-rpath,$(libdir)"
95else
96QEMU_UPSTREAM_RPATH := -Wl,-rpath,$(LIBEXEC_LIB)
97IOEMU_EXTRA_LDFLAGS :=
98endif
99
100QEMU_ROOT := $(shell if [ -d "$(QEMU_TRADITIONAL_LOC)" ]; then echo "$(QEMU_TRADITIONAL_LOC)"; else echo .; fi)
101ifneq ($(QEMU_ROOT),.)
102export QEMU_ROOT
103endif
104
105# Targets for external trees:
106#  ${target}-dir-find
107#    See if the directory exists and check it out if not.
108#  ${target}-dir-force-update
109#    Pull to the most recent update (as if you had checked it out for the
110#    first time)
111#  subdir-all-${target}-dir
112#    Do "make all" for ${target}, including all prerequisites (such as
113#    configure)
114#  subdir-install-${target}-dir
115#    Do "make install" for $TARGET
116#  subdir-clean-${target}-dir
117#    Do "make clean" for $TARGET
118#
119# Directories for external trees:
120#  ${target}-dir
121#    Used for local builds.  Usually a link to ${target}-dir-remote
122#  ${target}-dir-remote
123#    Where remote repositories are cloned
124#  ${target}
125#    Where a copy of the source files are put when building a source
126#    tarball for release
127#
128# Expected variables:
129#   ${TARGET}_URL
130#     A url from which to clone a git repo
131#   ${TARGET}_REVISION
132#     The target revision to check out when doing "find" or "force-update"
133#   ${TARGET}_INTREE
134#     The directory where the subtree can be found (usually used when building
135#     a source tarball)
136#   ${TARGET}_LOC
137#     The ultimate location of the source (either a local dir or remote URL)
138
139# External target: qemu-xen-traditional
140qemu-xen-traditional-dir-find:
141	set -ex; \
142	if test -d $(QEMU_TRADITIONAL_LOC); then \
143		mkdir -p qemu-xen-traditional-dir; \
144	else \
145		export GIT=$(GIT); \
146		$(XEN_ROOT)/scripts/git-checkout.sh $(QEMU_TRADITIONAL_LOC) $(QEMU_TRADITIONAL_REVISION) qemu-xen-traditional-dir; \
147	fi
148
149.PHONY: qemu-xen-traditional-dir-force-update
150qemu-xen-traditional-dir-force-update: qemu-xen-traditional-dir-find
151	set -ex; \
152	if [ "$(QEMU_TRADITIONAL_REVISION)" ]; then \
153		cd qemu-xen-traditional-dir-remote; \
154		$(GIT) fetch origin; \
155		$(GIT) reset --hard $(QEMU_TRADITIONAL_REVISION); \
156	fi
157
158qemu-traditional-recurse = \
159	set -e; \
160		$(buildmakevars2shellvars); \
161		export CONFIG_BLKTAP1=n; \
162		export BUILDING_QEMU_TRAD=y; \
163		cd qemu-xen-traditional-dir; \
164		$(1)
165
166subdir-all-qemu-xen-traditional-dir: qemu-xen-traditional-dir-find
167	$(call qemu-traditional-recurse,\
168		$(QEMU_ROOT)/xen-setup \
169		--extra-cflags="-D__XEN_TOOLS__ $(EXTRA_CFLAGS_QEMU_TRADITIONAL)" \
170		$(IOEMU_EXTRA_LDFLAGS) \
171		--cpu=$(IOEMU_CPU_ARCH) \
172		$(IOEMU_CONFIGURE_CROSS); \
173		$(MAKE) all \
174	)
175
176subdir-install-qemu-xen-traditional-dir: subdir-all-qemu-xen-traditional-dir
177	$(call qemu-traditional-recurse,$(MAKE) install)
178
179subdir-clean-qemu-xen-traditional-dir:
180	set -e; if test -d qemu-xen-traditional-dir/.; then \
181		$(MAKE) -C qemu-xen-traditional-dir clean; \
182	fi
183subdir-uninstall-qemu-xen-traditional-dir:
184	rm -f $(D)$(bindir)/qemu-nbd*
185	rm -f $(D)$(bindir)/qemu-img*
186
187# External target: qemu-xen
188qemu-xen-dir-find:
189	if test -d $(QEMU_UPSTREAM_LOC) ; then \
190		mkdir -p qemu-xen-dir; \
191	else \
192		export GIT=$(GIT); \
193		$(XEN_ROOT)/scripts/git-checkout.sh $(QEMU_UPSTREAM_LOC) $(QEMU_UPSTREAM_REVISION) qemu-xen-dir ; \
194	fi
195
196.PHONY: qemu-xen-dir-force-update
197qemu-xen-dir-force-update: qemu-xen-dir-find
198	set -ex; \
199	if [ "$(QEMU_UPSTREAM_REVISION)" ]; then \
200		cd qemu-xen-dir-remote; \
201		$(GIT) fetch origin; \
202		$(GIT) reset --hard $(QEMU_UPSTREAM_REVISION); \
203	fi
204
205ifeq ($(debug),y)
206QEMU_XEN_ENABLE_DEBUG := --enable-debug
207else
208QEMU_XEN_ENABLE_DEBUG :=
209endif
210
211subdir-all-qemu-xen-dir: qemu-xen-dir-find
212	unset MAKELEVEL; \
213	if test -d $(QEMU_UPSTREAM_LOC) ; then \
214		source=$(QEMU_UPSTREAM_LOC); \
215	else \
216		source=$(XEN_ROOT)/tools/qemu-xen-dir; \
217	fi; \
218	mkdir -p qemu-xen-build; \
219	cd qemu-xen-build; \
220	if $$source/scripts/tracetool.py --check-backend --backend log ; then \
221		enable_trace_backend="--enable-trace-backends=log"; \
222	elif $$source/scripts/tracetool.py --check-backend --backend stderr ; then \
223		enable_trace_backend='--enable-trace-backends=stderr'; \
224	else \
225		enable_trace_backend='' ; \
226	fi ; \
227	if [ "$(CONFIG_9PFS)" = "y" ]; then \
228		virtfs='--enable-virtfs' ; \
229	elif [ "$(CONFIG_9PFS)" = "n" ]; then \
230		virtfs='--disable-virtfs' ; \
231	else \
232		virtfs='' ; \
233	fi ; \
234	PKG_CONFIG_PATH=$(XEN_ROOT)/tools/pkg-config$${PKG_CONFIG_PATH:+:$${PKG_CONFIG_PATH}} \
235	$$source/configure --enable-xen --target-list=i386-softmmu \
236		$(QEMU_XEN_ENABLE_DEBUG) \
237		$$enable_trace_backend \
238		--prefix=$(prefix) \
239		--libdir=$(LIBEXEC_LIB) \
240		--includedir=$(LIBEXEC_INC) \
241		--extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \
242		-DXC_WANT_COMPAT_GNTTAB_API=1 \
243		-DXC_WANT_COMPAT_MAP_FOREIGN_API=1 \
244		-DXC_WANT_COMPAT_DEVICEMODEL_API=1 \
245		$(EXTRA_CFLAGS_QEMU_XEN)" \
246		--extra-ldflags="$(QEMU_UPSTREAM_RPATH)" \
247		--bindir=$(LIBEXEC_BIN) \
248		--datadir=$(SHAREDIR)/qemu-xen \
249		--localstatedir=$(localstatedir) \
250		--docdir=$(LIBEXEC)/share/doc \
251		--mandir=$(LIBEXEC)/share/man \
252		--libexecdir=$(LIBEXEC)/libexec \
253		--firmwarepath=$(LIBEXEC)/share/qemu-firmware \
254		--disable-kvm \
255		--disable-docs \
256		--disable-guest-agent \
257		--python=$(PYTHON) \
258		$(CONFIG_QEMUU_EXTRA_ARGS) \
259		--cpu=$(IOEMU_CPU_ARCH) \
260		$(IOEMU_CONFIGURE_CROSS) \
261		$$virtfs; \
262	$(MAKE) all
263
264subdir-install-qemu-xen-dir: subdir-all-qemu-xen-dir
265	cd qemu-xen-build; \
266	$(MAKE) install
267
268subdir-clean-qemu-xen-dir:
269	set -e; if test -d qemu-xen-build/.; then \
270		$(MAKE) -C qemu-xen-build clean; \
271	fi
272
273subdir-uninstall-qemu-xen-dir: ;
274
275subtree-force-update:
276ifeq ($(CONFIG_QEMU_XEN),y)
277	$(MAKE) qemu-xen-dir-force-update
278endif
279ifeq ($(CONFIG_QEMU_TRAD),y)
280	$(MAKE) qemu-xen-traditional-dir-force-update
281endif
282ifeq ($(CONFIG_X86),y)
283	$(MAKE) -C firmware subtree-force-update
284endif
285
286subtree-force-update-all:
287	$(MAKE) qemu-xen-dir-force-update
288	$(MAKE) qemu-xen-traditional-dir-force-update
289	$(MAKE) -C firmware subtree-force-update-all
290