compiling the libxen api on mac and linux

February 13, 2010

in linux,mac,software

Xen is a pretty huge library, and the build process is rather long. While a lot of it doesn’t work with Mac OSX, libxen (the c api bindings for the libxen api) should. The only prerequisites are libxml (and libcurl if you want to be able to run the tests). However, there isn’t really a portable build configuration included in the Xen source repository for *just* libxen. So I decided to make one. If you follow these steps, you should be able to compile libxen (aka libxenapi) on both linux and OSX. I’ve tested it on OS 10.6.2, and Ubuntu 9.10. If you run into problems, and have suggestions to aid in making it more portable, let me know!

You’ll need a copy of the libxen source, and the autotools (autoconf, automake, libtool, etc). I’m assuming that if you are even attempting this, you know about autotools, and stuff like git, and where to find the xen source code. I won’t go into it here. Suffice to say that we’re going to concern ourselves only with the tools/libxen folder. So get into that dir, or a copy you’ve made, then add the two files i have at the bottom of the post (configure.ac, and Makefile.am). I placed them at the bottom of this post as they’re rather long.

Then, in that directory, just execute a normal auto-configure / build / install:

autoreconf --force --install
./configure --prefix=/usr/local
make
sudo make install

You may notice that in the makefile there are targets named “curl-patch-test-bindings” and “curl-patch-test-event-handling”. The developer of the test files apparently is using an outdated version of libcurl, as more recent ones (including those on MacOS10.6 and Ubuntu9.10) don’t support the option CURLOPT_MUTE. There’s two little “sed” statements to just pull them out — doesn’t appear to be of consequence. You could also edit the source directly, but I wanted to try get everything done with just these two new files.

Here are the two files that you’ll need to create, mentioned earlier:

configure.ac:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
 
# get rid of outdated curl config option
sed 's/curl_easy_setopt(curl, CURLOPT_MUTE, 1);//g' test/test_bindings.c > TMPFILE && mv TMPFILE test/test_bindings.c
sed 's/curl_easy_setopt(curl, CURLOPT_MUTE, 1);//g' test/test_event_handling.c > TMPFILE && mv TMPFILE test/test_event_handling.c
 
AC_PREREQ(2.61)
AC_INIT([libxenapi],[1.0],[foo@bar.com])
AC_CONFIG_AUX_DIR(config)
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([src/xen_acmpolicy.c])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
 
# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_PROG_LN_S
 
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lxenapi':
# AC_CHECK_LIB([xenapi], [main])
 
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([inttypes.h stddef.h stdint.h stdlib.h string.h])
 
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_TYPE_INT64_T
AC_TYPE_SIZE_T
AC_STRUCT_TM
 
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_MKTIME
AC_FUNC_STRFTIME
AC_CHECK_FUNCS([memset strdup])
 
AC_CONFIG_FILES([Makefile])
 
AC_OUTPUT

and Makefile.am:

ACLOCAL_AMFLAGS := -I m4
 
# get rid of outdated curl config option
test/test_bindings.c: curl-patch-test-bindings
 
test/test_event_handling.c: curl-patch-test-event-handling
 
curl-patch-test-bindings:
	sed 's/curl_easy_setopt(curl, CURLOPT_MUTE, 1);//g' test/test_bindings.c > TMPFILE && mv TMPFILE test/test_bindings.c;
 
curl-patch-test-event-handling:
	sed 's/curl_easy_setopt(curl, CURLOPT_MUTE, 1);//g' test/test_event_handling.c > TMPFILE && mv TMPFILE test/test_event_handling.c;
 
lib_LTLIBRARIES = libxenapi.la
 
libxenheadersdir =  $(includedir)/xen/api
 
CFLAGS = \
	-Iinclude \
	$(shell xml2-config --cflags) \
	$(shell curl-config --cflags) \
	-W -Wall -Wmissing-prototypes -std=c99 -O2 -fPIC
 
LDFLAGS = $(shell xml2-config --libs) \
	$(shell curl-config --libs)
 
libxenapi_la_SOURCES = \
	include/xen_console_protocol_internal.h \
	include/xen_event_operation_internal.h \
	include/xen_internal.h \
	include/xen_on_crash_behaviour_internal.h \
	include/xen_on_normal_exit_internal.h \
	include/xen_vbd_mode_internal.h \
	include/xen_vbd_type_internal.h \
	include/xen_vdi_type_internal.h \
	include/xen_vm_power_state_internal.h \
	include/xen/api/xen_acmpolicy.h \
	include/xen/api/xen_all.h \
	include/xen/api/xen_common.h \
	include/xen/api/xen_console.h \
	include/xen/api/xen_console_decl.h \
	include/xen/api/xen_console_protocol.h \
	include/xen/api/xen_crashdump.h \
	include/xen/api/xen_crashdump_decl.h \
	include/xen/api/xen_event.h \
	include/xen/api/xen_event_decl.h \
	include/xen/api/xen_event_operation.h \
	include/xen/api/xen_host.h \
	include/xen/api/xen_host_cpu.h \
	include/xen/api/xen_host_cpu_decl.h \
	include/xen/api/xen_host_decl.h \
	include/xen/api/xen_host_metrics.h \
	include/xen/api/xen_host_metrics_decl.h \
	include/xen/api/xen_int_float_map.h \
	include/xen/api/xen_int_int_map.h \
	include/xen/api/xen_int_string_set_map.h \
	include/xen/api/xen_network.h \
	include/xen/api/xen_network_decl.h \
	include/xen/api/xen_on_crash_behaviour.h \
	include/xen/api/xen_on_normal_exit.h \
	include/xen/api/xen_pbd.h \
	include/xen/api/xen_pbd_decl.h \
	include/xen/api/xen_pif.h \
	include/xen/api/xen_pif_decl.h \
	include/xen/api/xen_pif_metrics.h \
	include/xen/api/xen_pif_metrics_decl.h \
	include/xen/api/xen_sr.h \
	include/xen/api/xen_sr_decl.h \
	include/xen/api/xen_string_set.h \
	include/xen/api/xen_string_string_map.h \
	include/xen/api/xen_user.h \
	include/xen/api/xen_user_decl.h \
	include/xen/api/xen_vbd.h \
	include/xen/api/xen_vbd_decl.h \
	include/xen/api/xen_vbd_metrics.h \
	include/xen/api/xen_vbd_metrics_decl.h \
	include/xen/api/xen_vbd_mode.h \
	include/xen/api/xen_vbd_type.h \
	include/xen/api/xen_vdi.h \
	include/xen/api/xen_vdi_decl.h \
	include/xen/api/xen_vdi_type.h \
	include/xen/api/xen_vif.h \
	include/xen/api/xen_vif_decl.h \
	include/xen/api/xen_vif_metrics.h \
	include/xen/api/xen_vif_metrics_decl.h \
	include/xen/api/xen_vm.h \
	include/xen/api/xen_vm_decl.h \
	include/xen/api/xen_vm_guest_metrics.h \
	include/xen/api/xen_vm_guest_metrics_decl.h \
	include/xen/api/xen_vm_metrics.h \
	include/xen/api/xen_vm_metrics_decl.h \
	include/xen/api/xen_vm_power_state.h \
	include/xen/api/xen_vtpm.h \
	include/xen/api/xen_vtpm_decl.h \
	include/xen/api/xen_xspolicy.h \
	include/xen/api/xen_xspolicy_decl.h \
	src/xen_acmpolicy.c \
	src/xen_common.c \
	src/xen_console.c \
	src/xen_console_protocol.c \
	src/xen_crashdump.c \
	src/xen_event.c \
	src/xen_event_operation.c \
	src/xen_host.c \
	src/xen_host_cpu.c \
	src/xen_host_metrics.c \
	src/xen_int_float_map.c \
	src/xen_int_int_map.c \
	src/xen_int_string_set_map.c \
	src/xen_network.c \
	src/xen_on_crash_behaviour.c \
	src/xen_on_normal_exit.c \
	src/xen_pbd.c \
	src/xen_pif.c \
	src/xen_pif_metrics.c \
	src/xen_sr.c \
	src/xen_string_set.c \
	src/xen_string_set.h \
	src/xen_string_string_map.c \
	src/xen_user.c \
	src/xen_vbd.c \
	src/xen_vbd_metrics.c \
	src/xen_vbd_mode.c \
	src/xen_vbd_type.c \
	src/xen_vdi.c \
	src/xen_vdi_type.c \
	src/xen_vif.c \
	src/xen_vif_metrics.c \
	src/xen_vm.c \
	src/xen_vm_guest_metrics.c \
	src/xen_vm_metrics.c \
	src/xen_vm_power_state.c \
	src/xen_vtpm.c \
	src/xen_xspolicy.c
 
libxenheaders_HEADERS = \
	include/xen/api/xen_acmpolicy.h \
	include/xen/api/xen_all.h \
	include/xen/api/xen_common.h \
	include/xen/api/xen_console.h \
	include/xen/api/xen_console_decl.h \
	include/xen/api/xen_console_protocol.h \
	include/xen/api/xen_crashdump.h \
	include/xen/api/xen_crashdump_decl.h \
	include/xen/api/xen_event.h \
	include/xen/api/xen_event_decl.h \
	include/xen/api/xen_event_operation.h \
	include/xen/api/xen_host.h \
	include/xen/api/xen_host_cpu.h \
	include/xen/api/xen_host_cpu_decl.h \
	include/xen/api/xen_host_decl.h \
	include/xen/api/xen_host_metrics.h \
	include/xen/api/xen_host_metrics_decl.h \
	include/xen/api/xen_int_float_map.h \
	include/xen/api/xen_int_int_map.h \
	include/xen/api/xen_int_string_set_map.h \
	include/xen/api/xen_network.h \
	include/xen/api/xen_network_decl.h \
	include/xen/api/xen_on_crash_behaviour.h \
	include/xen/api/xen_on_normal_exit.h \
	include/xen/api/xen_pbd.h \
	include/xen/api/xen_pbd_decl.h \
	include/xen/api/xen_pif.h \
	include/xen/api/xen_pif_decl.h \
	include/xen/api/xen_pif_metrics.h \
	include/xen/api/xen_pif_metrics_decl.h \
	include/xen/api/xen_sr.h \
	include/xen/api/xen_sr_decl.h \
	include/xen/api/xen_string_set.h \
	include/xen/api/xen_string_string_map.h \
	include/xen/api/xen_user.h \
	include/xen/api/xen_user_decl.h \
	include/xen/api/xen_vbd.h \
	include/xen/api/xen_vbd_decl.h \
	include/xen/api/xen_vbd_metrics.h \
	include/xen/api/xen_vbd_metrics_decl.h \
	include/xen/api/xen_vbd_mode.h \
	include/xen/api/xen_vbd_type.h \
	include/xen/api/xen_vdi.h \
	include/xen/api/xen_vdi_decl.h \
	include/xen/api/xen_vdi_type.h \
	include/xen/api/xen_vif.h \
	include/xen/api/xen_vif_decl.h \
	include/xen/api/xen_vif_metrics.h \
	include/xen/api/xen_vif_metrics_decl.h \
	include/xen/api/xen_vm.h \
	include/xen/api/xen_vm_decl.h \
	include/xen/api/xen_vm_guest_metrics.h \
	include/xen/api/xen_vm_guest_metrics_decl.h \
	include/xen/api/xen_vm_metrics.h \
	include/xen/api/xen_vm_metrics_decl.h \
	include/xen/api/xen_vm_power_state.h \
	include/xen/api/xen_vtpm.h \
	include/xen/api/xen_vtpm_decl.h \
	include/xen/api/xen_xspolicy.h \
	include/xen/api/xen_xspolicy_decl.h
 
noinst_PROGRAMS = test/test_bindings test/test_event_handling
test_test_bindings_LDADD = libxenapi.la
test_test_event_handling_LDADD = libxenapi.la

cheers

Leave a Comment

Previous post:

Next post: