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_XEN) += qemu-xen-dir
28endif
29
30SUBDIRS-y += xenpmd
31SUBDIRS-$(CONFIG_GOLANG) += golang
32SUBDIRS-y += xl
33SUBDIRS-y += helpers
34SUBDIRS-y += 9pfsd
35SUBDIRS-$(CONFIG_X86) += xenpaging
36SUBDIRS-$(CONFIG_X86) += debugger
37SUBDIRS-$(CONFIG_TESTS) += tests
38
39SUBDIRS-y += python
40SUBDIRS-$(CONFIG_PYGRUB) += pygrub
41SUBDIRS-$(OCAML_TOOLS) += ocaml
42
43ifeq ($(CONFIG_RUMP),y)
44SUBDIRS-y := libs
45endif
46
47# For the sake of linking, set the sys-root
48ifneq ($(CROSS_COMPILE),)
49CROSS_BIN_PATH ?= /usr/$(CROSS_COMPILE:-=)/bin
50CROSS_SYS_ROOT ?= /usr/$(CROSS_COMPILE:-=)/sys-root
51export CROSS_SYS_ROOT # exported for check/funcs.sh
52export CROSS_BIN_PATH # exported for cross-install.sh
53endif
54
55.PHONY: build all
56build all: subdirs-all
57
58.PHONY: install
59install:
60	$(INSTALL_DIR) -m 700 $(DESTDIR)$(XEN_DUMP_DIR)
61	$(INSTALL_DIR) $(DESTDIR)$(XEN_LOG_DIR)
62	$(INSTALL_DIR) $(DESTDIR)$(XEN_LIB_DIR)
63	$(INSTALL_DIR) $(DESTDIR)$(PKG_INSTALLDIR)
64	$(MAKE) subdirs-install
65
66.PHONY: uninstall
67uninstall: D=$(DESTDIR)
68uninstall:
69	[ -d $(D)$(XEN_CONFIG_DIR) ] && mv -f $(D)$(XEN_CONFIG_DIR) $(D)$(XEN_CONFIG_DIR).old-`date +%s` || true
70	rm -rf $(D)$(libdir)/xen
71	rm -rf $(D)$(SHAREDIR)/xen
72	rm -rf $(D)$(SHAREDIR)/qemu-xen
73	$(MAKE) subdirs-uninstall
74
75.PHONY: clean
76clean: subdirs-clean
77	rm -rf pkg-config
78
79.PHONY: distclean
80distclean: subdirs-distclean clean
81	rm -rf qemu-xen-dir qemu-xen-dir-remote qemu-xen-build
82	rm -rf ../config/Tools.mk config.h config.log config.status \
83		config.cache autom4te.cache
84
85ifneq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
86IOEMU_CONFIGURE_CROSS ?= --cross-prefix=$(CROSS_COMPILE) \
87			 --interp-prefix=$(CROSS_SYS_ROOT)
88endif
89
90ifeq ($(XEN_TOOLS_RPATH),y)
91QEMU_UPSTREAM_RPATH := -Wl,-rpath,$(LIBEXEC_LIB):$(libdir)
92IOEMU_EXTRA_LDFLAGS := --extra-ldflags="-Wl,-rpath,$(libdir)"
93else
94QEMU_UPSTREAM_RPATH := -Wl,-rpath,$(LIBEXEC_LIB)
95IOEMU_EXTRA_LDFLAGS :=
96endif
97
98# Targets for external trees:
99#  ${target}-dir-find
100#    See if the directory exists and check it out if not.
101#  ${target}-dir-force-update
102#    Pull to the most recent update (as if you had checked it out for the
103#    first time)
104#  subdir-all-${target}-dir
105#    Do "make all" for ${target}, including all prerequisites (such as
106#    configure)
107#  subdir-install-${target}-dir
108#    Do "make install" for $TARGET
109#  subdir-clean-${target}-dir
110#    Do "make clean" for $TARGET
111#
112# Directories for external trees:
113#  ${target}-dir
114#    Used for local builds.  Usually a link to ${target}-dir-remote
115#  ${target}-dir-remote
116#    Where remote repositories are cloned
117#  ${target}
118#    Where a copy of the source files are put when building a source
119#    tarball for release
120#
121# Expected variables:
122#   ${TARGET}_URL
123#     A url from which to clone a git repo
124#   ${TARGET}_REVISION
125#     The target revision to check out when doing "find" or "force-update"
126#   ${TARGET}_INTREE
127#     The directory where the subtree can be found (usually used when building
128#     a source tarball)
129#   ${TARGET}_LOC
130#     The ultimate location of the source (either a local dir or remote URL)
131
132# External target: qemu-xen
133qemu-xen-dir-find:
134	if test -d $(QEMU_UPSTREAM_LOC) ; then \
135		mkdir -p qemu-xen-dir; \
136	else \
137		export GIT=$(GIT); \
138		$(XEN_ROOT)/scripts/git-checkout.sh $(QEMU_UPSTREAM_LOC) $(QEMU_UPSTREAM_REVISION) qemu-xen-dir ; \
139	fi
140
141.PHONY: qemu-xen-dir-force-update
142qemu-xen-dir-force-update: qemu-xen-dir-find
143	set -ex; \
144	if [ "$(QEMU_UPSTREAM_REVISION)" ]; then \
145		cd qemu-xen-dir-remote; \
146		$(GIT) fetch origin; \
147		$(GIT) reset --hard $(QEMU_UPSTREAM_REVISION); \
148	fi
149
150ifeq ($(debug),y)
151QEMU_XEN_ENABLE_DEBUG := --enable-debug
152else
153QEMU_XEN_ENABLE_DEBUG :=
154endif
155
156subdir-all-qemu-xen-dir: qemu-xen-dir-find
157	unset MAKELEVEL; \
158	if test -d $(QEMU_UPSTREAM_LOC) ; then \
159		source=$(QEMU_UPSTREAM_LOC); \
160	else \
161		source=$(XEN_ROOT)/tools/qemu-xen-dir; \
162	fi; \
163	mkdir -p qemu-xen-build; \
164	cd qemu-xen-build; \
165	if $$source/scripts/tracetool.py --check-backend --backend log ; then \
166		enable_trace_backend="--enable-trace-backends=log"; \
167	elif $$source/scripts/tracetool.py --check-backend --backend stderr ; then \
168		enable_trace_backend='--enable-trace-backends=stderr'; \
169	else \
170		enable_trace_backend='' ; \
171	fi ; \
172	if [ "$(CONFIG_9PFS)" = "y" ]; then \
173		virtfs='--enable-virtfs' ; \
174	elif [ "$(CONFIG_9PFS)" = "n" ]; then \
175		virtfs='--disable-virtfs' ; \
176	else \
177		virtfs='' ; \
178	fi ; \
179	PKG_CONFIG_PATH=$(XEN_ROOT)/tools/pkg-config$${PKG_CONFIG_PATH:+:$${PKG_CONFIG_PATH}} \
180	$$source/configure --enable-xen --target-list=i386-softmmu \
181		$(QEMU_XEN_ENABLE_DEBUG) \
182		$$enable_trace_backend \
183		--prefix=$(prefix) \
184		--libdir=$(LIBEXEC_LIB) \
185		--includedir=$(LIBEXEC_INC) \
186		--extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \
187		-DXC_WANT_COMPAT_GNTTAB_API=1 \
188		-DXC_WANT_COMPAT_MAP_FOREIGN_API=1 \
189		-DXC_WANT_COMPAT_DEVICEMODEL_API=1 \
190		$(EXTRA_CFLAGS_QEMU_XEN)" \
191		--extra-ldflags="$(QEMU_UPSTREAM_RPATH)" \
192		--bindir=$(LIBEXEC_BIN) \
193		--datadir=$(SHAREDIR)/qemu-xen \
194		--localstatedir=$(localstatedir) \
195		--docdir=$(LIBEXEC)/share/doc \
196		--mandir=$(LIBEXEC)/share/man \
197		--libexecdir=$(LIBEXEC)/libexec \
198		--firmwarepath=$(LIBEXEC)/share/qemu-firmware \
199		--disable-kvm \
200		--disable-docs \
201		--disable-guest-agent \
202		--python=$(PYTHON) \
203		$(CONFIG_QEMUU_EXTRA_ARGS) \
204		--cpu=$(IOEMU_CPU_ARCH) \
205		$(IOEMU_CONFIGURE_CROSS) \
206		$$virtfs; \
207	$(MAKE) all
208
209subdir-install-qemu-xen-dir: subdir-all-qemu-xen-dir
210	cd qemu-xen-build; \
211	$(MAKE) install
212
213subdir-clean-qemu-xen-dir:
214	set -e; if test -d qemu-xen-build/.; then \
215		$(MAKE) -C qemu-xen-build clean; \
216	fi
217
218subdir-uninstall-qemu-xen-dir: ;
219
220subtree-force-update:
221ifeq ($(CONFIG_QEMU_XEN),y)
222	$(MAKE) qemu-xen-dir-force-update
223endif
224ifeq ($(CONFIG_X86),y)
225	$(MAKE) -C firmware subtree-force-update
226endif
227