OCAMLPACKS    = xml-light2 cdrom pciutil sexpr log stunnel http-svr rss xen-utils netdev tapctl vhd xenstore rpc-light
OCAML_LIBS    = ../util/version ../util/vm_memory_constraints ../util/sanitycheck ../util/stats \
	../idl/ocaml_backend/common ../idl/ocaml_backend/client ../idl/ocaml_backend/server ../util/ocamltest
OCAMLINCLUDES = ../idl ../idl/ocaml_backend \
	../autogen ../database/ \
	../xenops ../xva ../util \
	../auth ../license ../client_records ../rfb ../gpg

UseCamlp4(rpc-light.syntax, features rrd monitor_fake monitor_fake_common vdi_automaton storage_impl xapi_udhcpd)
UseCamlp4(rpc-light.idl, storage_interface)

CFLAGS += -std=gnu99 -Wall -Werror -I$(shell ocamlc -where)

XENLIGHT_LINK_FLAGS= -cclib -lxlutil -cclib -luuid -cclib -lblktapctl -cclib -lutil -cclib -lxenlight -cclib -lxenstore
# Since the section didn't work, link against the xen libs for everything if we are building
# xen stuff at all.
# NB order of libraries is important: OMake cannot determine dependencies between libraries
# (the same holds for OCaml packages)
XEN_OCAML_LIBS = ../xenops/xenops ../auth/pam
XEN_OCAMLINCLUDES =
XEN_OCAMLPACKS = xenctrl xenstore cpuid xenlight
OCAML_CLIBS = $(XEN_OCAML_CLIBS) $(OCAML_CLIBS)
OCAML_LINK_FLAGS = $(XEN_OCAML_LINK_FLAGS) $(OCAML_LINK_FLAGS) $(XENLIGHT_LINK_FLAGS)
CFLAGS = $(XEN_CFLAGS) $(CFLAGS)
OCAMLINCLUDES = $(XEN_OCAMLINCLUDES) $(OCAMLINCLUDES)
# xc.cma depends on uuid.cma
OCAML_LIBS = $(OCAML_LIBS) $(XEN_OCAML_LIBS)
OCAMLPACKS = $(XEN_OCAMLPACKS) $(OCAMLPACKS)

# -----------------------------------------------------------------------
# Build the server
# -----------------------------------------------------------------------

#OCAML_CLIBS += stubs

OCamlProgram(http_test, http_test)
OCamlProgram(sparse_dd, sparse_dd sparse_encoding)
OCamlProgram(show_bat, show_bat)
OCamlProgram(monitor_fake_plugin, monitor_fake_plugin monitor_fake_common rrd)

storage_interface.mli: storage_interface.ml vdi_automaton.cmi
	ocamlfind ocamlc -package rpc-light.idl -syntax camlp4o -i $< > $@

OCamlProgram(storage_impl_test, storage_interface vdi_automaton storage_impl storage_locks storage_impl_test)

COMMON = \
	xapi_templates \
	../idl/api_lowlevel \
	nm \
	xapi_mgmt_iface \
	smint \
	../gpg/gpg \
	helpers \
	at_least_once_more \
	fileserver

#OCamlProgram(upload_receive, $(COMMON) fileupload upload_receive)

OCamlProgram(quicktestbin, quicktest quicktest_common quicktest_ocamltest quicktest_storage quicktest_http quicktest_encodings quicktest_vm_placement vm_placement ../xenops/squeeze_test quicktest_vm_memory_constraints ../util/vm_memory_constraints quicktest_lifecycle)
OCamlProgram(fakeguestagent, fakeguestagent)

OCamlProgram(xenstore_copy, xenstore_dump xenstore_copy)

OCamlProgram(rrddump, rrddump rrd)

XAPI_MODULES = $(COMMON) \
	system_domains \
	local_work_queue \
	../xva/xva \
	../idl/ocaml_backend/json \
	../rfb/rfb \
	../rfb/rfb_randomtest \
	../client_records/records \
	../client_records/record_util \
	bootloader \
	storage_access \
	storage_mux \
	storage_proxy \
	xapi_services \
	sm_exec \
	sm \
	storage_interface \
	vdi_automaton \
	storage_impl \
	storage_locks \
	console \
	xen_helpers \
	importexport \
	sparse_encoding \
	create_storage \
	create_networks \
	xapi_db_upgrade \
	xapi_fist \
	xapi_udhcpd \
	xapi_network_types \
	xapi_network_real \
	xapi_network \
	xapi_network_attach_helpers \
	xapi_event \
	xapi_alert \
	xapi_cli \
	xapi_task \
	xapi_crashdump \
	xapi_pbd \
	xapi_user \
	xapi_host_cpu \
	xapi_host_helpers \
	xapi_host_crashdump \
	xapi_guest_agent \
	xapi_pv_driver_version \
	xapi_http \
	xapi_host_patch \
	xapi_pool_patch \
	xapi_support \
	xapi_xenops_errors \
	xapi_session \
	xapi_auth \
	../auth/auth_signature \
	../auth/authx \
	../auth/extauth \
	../auth/extauth_plugin_ADlikewise \
	../auth/parse_likewise \
	xapi_subject \
	audit_log \
	xapi_vmpp \
	xapi_vm_appliance \
	xapi_vm_appliance_lifecycle \
	xapi_vm_lifecycle \
	xapi_vm_clone \
	xapi_vm_snapshot \
	vm_placement \
	xapi_vm_placement \
	xapi_vm_helpers \
	memory_check \
	xapi_vm_memory_constraints \
	xapi_vbd_helpers \
	xapi_vif_helpers \
	xapi_vdi_helpers \
	xapi_hooks \
	xapi_bond \
	xapi_vlan \
	xapi_tunnel \
	xapi_sr \
	xapi_sm \
	xapi_pbd \
	xapi_vdi \
	pool_db_backup \
	xapi_sync \
	config_file_sync \
	config_file_io \
	slave_backup \
	sm_fs_ops \
	sparse_dd_wrapper \
	vmopshelpers \
	vm_config \
	vmops \
	pciops \
	vgpuops \
	memory_control \
	vbdops \
	attach_helpers \
	message_forwarding \
	cancel_tasks \
	xapi_pool_transition \
	thread_queue \
	xapi_ha \
	xapi_ha_stats \
	xapi_ha_vm_failover \
	binpack \
	xapi_local_session \
	xha_interface \
	xha_statefile \
	xha_metadata_vdi \
	xha_errno \
	static_vdis \
	monitor_self \
	monitor_transfer \
	monitor_master \
	rrd_shared \
	monitor_dbcalls \
	monitor_rrds \
	monitor_fake \
	monitor_fake_common \
	monitor \
	rrd \
	api_server \
	create_misc \
	xapi_host \
	xapi_plugins \
	xapi_fuse \
	db_gc \
	cli_protocol \
	cli_cmdtable \
	cli_frontend \
	cli_operations \
	cli_operations_geneva \
	cli_util \
	cli_key \
	cli_printer \
	ipq \
	xapi_periodic_scheduler \
	xapi_periodic_scheduler_init \
	dbsync \
	dbsync_slave \
	dbsync_master \
	sync_networking \
	storage_access \
	events \
	import_xva \
	import \
	import_raw_vdi \
	export \
	stream_vdi \
	fileupload \
	smint \
	sm_exec \
	sm \
	startup \
	system_status \
	license_check \
	xapi_vm \
	xapi_sr \
	xapi_vdi \
	xapi_vbd \
	xapi_vif \
	xapi_pif \
	xapi_pbd \
	xapi_user \
	xapi_host_cpu \
	xapi_task \
	xapi_vm_migrate \
	xapi_dr \
	xapi_dr_task \
	mtc \
	xapi_crashdump \
	xapi_templates_install \
	xapi_host_backup \
	xapi_logs_download \
	xapi_vncsnapshot \
	xapi_pool \
	xapi_upgrade \
	xapi_blob \
	xapi_message \
	../idl/datamodel_schema \
	debug_populate \
	ds \
	xapi_remotecmd \
	redo_log_usage \
	redo_log_alert \
	workload_balancing \
	wlb_reports \
	remote_requests \
	xapi_secret \
	certificates \
	../license/v6client \
	../license/v6rpc \
	../license/v6errors \
	bios_strings \
	xapi_config \
	features \
	pool_features \
	../license/license_init \
	xapi_pci \
	xapi_pgpu \
	xapi_gpu_group \
	xapi_vgpu

OCamlProgram(xapi, xapi $(XAPI_MODULES))
OCamlDocProgram(xapi, xapi $(XAPI_MODULES))

OCamlProgram(xapi_unit_test, xapi_unit_test xapi_db_upgrade_test pool_db_backup_test xapi_test_common $(XAPI_MODULES))

OCamlProgram(bootloader, bootloader bootloader_test)

OCamlProgram(binpack, binpack binpack_test xapi_fist)

OCamlProgram(at_least_once_more, at_least_once_more at_least_once_more_test)

.DEFAULT: xapi

.PHONY: generate_constants

generate_constants: config_constants.ml

config_constants.ml: config_constants.ml.in
	sed "s!@BASE_PATH@!\"$(RAW_BASE_PATH)\"!" $< > $@

.PHONY: install
install:
	mkdir -p $(BIN_PATH)
	cp -f xapi $(BIN_PATH)
	mkdir -p $(DEBUGDIST)
	$(IPROG) quicktest $(DEBUGDIST)
	cp -f quicktestbin $(DEBUGDIST)
	$(IPROG) rrddump $(DEBUGDIST)
	mkdir -p $(LIBEXEC)
	$(IPROG) sparse_dd $(LIBEXEC)
	mkdir -p $(DESTDIR)/etc/xapi.d/plugins
	$(IPROG) monitor_fake_plugin $(DESTDIR)/etc/xapi.d/plugins

.PHONY: sdk-install
sdk-install: install
	mkdir -p $(LIBEXEC)
	cp fakeguestagent $(LIBEXEC)/

.PHONY: clean
clean:
	rm -rf $(CLEAN_OBJS) *.aux *.log *.fig xapi
	rm -f config_constants.ml
	rm -f binpack xapi_unit_test sparse_dd fakeguestagent monitor_fake_plugin rrddump quicktestbin

