From: Richard Jones Date: Tue, 7 Apr 2009 12:08:50 +0000 (+0100) Subject: Added framework for the language bindings. X-Git-Tag: 0.5~14 X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=acf9000252da7f4f3fde693ecc03461007cf0bf9;p=libguestfs.git Added framework for the language bindings. --- diff --git a/HACKING b/HACKING index cdcca68..e0b0f0f 100644 --- a/HACKING +++ b/HACKING @@ -15,6 +15,9 @@ You will need to run src/generator.ml (from the top directory) which regenerates all the auto-generated files, and then continue with the ordinary build process. +PLEASE LOOK AT THE TOP OF EACH FILE BEFORE EDITING to see whether it +is automatically generated or not. + Formatting ---------------------------------------------------------------------- @@ -23,11 +26,45 @@ used elsewhere in the source. Please make sure that the code compiles without warnings. -Please test any changes +Please test any changes. + +Directories +---------------------------------------------------------------------- + +daemon/ + The daemon that runs inside the guest and carries out actions. + +examples/ + The examples. + +fish/ + Guestfish (the command-line program / shell) + +images/ + Some guest images to test against. These are gzipped to save + space. You have to unzip them before use. + +m4/ + M4 macros used by autoconf. + +ocaml/ + OCaml bindings. + +perl/ + Perl bindings. + +python/ + Python bindings. + +src/ + Source code to the C library. + Also contains the crucial generator program. Debugging ---------------------------------------------------------------------- +It's a good idea to use guestfish to try out new commands. + Use 'guestfish -v', which will show error messages etc from the daemon. diff --git a/Makefile.am b/Makefile.am index 39cf86c..d34b942 100644 --- a/Makefile.am +++ b/Makefile.am @@ -17,7 +17,17 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = src daemon fish examples +SUBDIRS = src daemon fish examples images + +if HAVE_OCAML +SUBDIRS += ocaml +endif +if HAVE_PERL +SUBDIRS += perl +endif +if HAVE_PYTHON +SUBDIRS += python +endif EXTRA_DIST = \ make-initramfs.sh update-initramfs.sh \ diff --git a/README b/README index fe3de96..906da00 100644 --- a/README +++ b/README @@ -39,10 +39,14 @@ Requirements other documentation. - (Optional) OCaml if you want to modify the code or rebuild certain -generated files. +generated files, and also to build the OCaml bindings - (Optional) local Fedora mirror +- (Optional) Perl if you want to build the perl bindings + +- (Optional) Python if you want to build the python bindings + Running ./configure will check you have all the requirements installed on your machine. diff --git a/configure.ac b/configure.ac index 689c548..0a0a450 100644 --- a/configure.ac +++ b/configure.ac @@ -15,7 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -AC_INIT([libguestfs],[0.4]) +AC_INIT([libguestfs],[0.5]) AM_INIT_AUTOMAKE AC_CONFIG_MACRO_DIR([m4]) @@ -40,7 +40,7 @@ AC_CHECK_HEADERS([errno.h sys/types.h sys/un.h sys/wait.h sys/socket.h]) dnl Check for rpcgen and XDR library. rpcgen is optional. AC_CHECK_PROG([RPCGEN],[rpcgen],[rpcgen],[no]) -AM_CONDITIONAL([RPCGEN],[test "x$RPCGEN" != "xno"]) +AM_CONDITIONAL([HAVE_RPCGEN],[test "x$RPCGEN" != "xno"]) AC_CHECK_LIB([portablexdr],[xdrmem_create],[],[ AC_SEARCH_LIBS([xdrmem_create],[rpc xdr nsl]) ]) @@ -99,12 +99,28 @@ AC_ARG_WITH([mirror], MIRROR="$with_mirror" AC_SUBST(MIRROR) +dnl Check for OCaml (optional, for OCaml bindings). +AC_PROG_OCAML +AM_CONDITIONAL([HAVE_OCAML],[test "x$OCAMLC" != "xno"]) + +dnl Check for Perl (optional, for Perl bindings). +dnl XXX This isn't quite right, we should check for devel libraries. +AC_CHECK_PROG([PERL],[perl],[perl],[no]) +AM_CONDITIONAL([HAVE_PERL],[test "x$PERL" != "xno"]) + +dnl Check for Python (optional, for Python bindings). +dnl XXX This isn't quite right, we should check for devel libraries. +AC_CHECK_PROG([PYTHON],[python],[python],[no]) +AM_CONDITIONAL([HAVE_PYTHON],[test "x$PYTHON" != "xno"]) + dnl Run in subdirs. AC_CONFIG_SUBDIRS([daemon]) dnl Produce output files. AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/Makefile fish/Makefile examples/Makefile + images/Makefile ocaml/Makefile perl/Makefile + python/Makefile make-initramfs.sh update-initramfs.sh libguestfs.spec]) AC_OUTPUT diff --git a/images/Makefile.am b/images/Makefile.am new file mode 100644 index 0000000..99266ad --- /dev/null +++ b/images/Makefile.am @@ -0,0 +1,18 @@ +# libguestfs test images +# Copyright (C) 2009 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +EXTRA_DIST = mbr-ext2-empty.img.gz diff --git a/m4/ocaml.m4 b/m4/ocaml.m4 new file mode 100644 index 0000000..fa8c4ce --- /dev/null +++ b/m4/ocaml.m4 @@ -0,0 +1,217 @@ +dnl autoconf macros for OCaml +dnl +dnl Copyright © 2009 Richard W.M. Jones +dnl Copyright © 2009 Stefano Zacchiroli +dnl Copyright © 2000-2005 Olivier Andrieu +dnl Copyright © 2000-2005 Jean-Christophe Filliâtre +dnl Copyright © 2000-2005 Georges Mariano +dnl +dnl For documentation, please read the ocaml.m4 man page. + +AC_DEFUN([AC_PROG_OCAML], +[dnl + # checking for ocamlc + AC_CHECK_TOOL([OCAMLC],[ocamlc],[no]) + + if test "$OCAMLC" != "no"; then + OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'` + AC_MSG_RESULT([OCaml version is $OCAMLVERSION]) + OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4` + AC_MSG_RESULT([OCaml library path is $OCAMLLIB]) + + AC_SUBST([OCAMLVERSION]) + AC_SUBST([OCAMLLIB]) + + # checking for ocamlopt + AC_CHECK_TOOL([OCAMLOPT],[ocamlopt],[no]) + OCAMLBEST=byte + if test "$OCAMLOPT" = "no"; then + AC_MSG_WARN([Cannot find ocamlopt; bytecode compilation only.]) + else + TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc; ocamlopt discarded.]) + OCAMLOPT=no + else + OCAMLBEST=opt + fi + fi + + AC_SUBST([OCAMLBEST]) + + # checking for ocamlc.opt + AC_CHECK_TOOL([OCAMLCDOTOPT],[ocamlc.opt],[no]) + if test "$OCAMLCDOTOPT" != "no"; then + TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc; ocamlc.opt discarded.]) + else + OCAMLC=$OCAMLCDOTOPT + fi + fi + + # checking for ocamlopt.opt + if test "$OCAMLOPT" != "no" ; then + AC_CHECK_TOOL([OCAMLOPTDOTOPT],[ocamlopt.opt],[no]) + if test "$OCAMLOPTDOTOPT" != "no"; then + TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([version differs from ocamlc; ocamlopt.opt discarded.]) + else + OCAMLOPT=$OCAMLOPTDOTOPT + fi + fi + fi + + AC_SUBST([OCAMLOPT]) + fi + + AC_SUBST([OCAMLC]) + + # checking for ocamldep + AC_CHECK_TOOL([OCAMLDEP],[ocamldep],[no]) + + # checking for ocamlmktop + AC_CHECK_TOOL([OCAMLMKTOP],[ocamlmktop],[no]) + + # checking for ocamlmklib + AC_CHECK_TOOL([OCAMLMKLIB],[ocamlmklib],[no]) + + # checking for ocamldoc + AC_CHECK_TOOL([OCAMLDOC],[ocamldoc],[no]) + + # checking for ocamlbuild + AC_CHECK_TOOL([OCAMLBUILD],[ocamlbuild],[no]) +]) + + +AC_DEFUN([AC_PROG_OCAMLLEX], +[dnl + # checking for ocamllex + AC_CHECK_TOOL([OCAMLLEX],[ocamllex],[no]) + if test "$OCAMLLEX" != "no"; then + AC_CHECK_TOOL([OCAMLLEXDOTOPT],[ocamllex.opt],[no]) + if test "$OCAMLLEXDOTOPT" != "no"; then + OCAMLLEX=$OCAMLLEXDOTOPT + fi + fi + AC_SUBST([OCAMLLEX]) +]) + +AC_DEFUN([AC_PROG_OCAMLYACC], +[dnl + AC_CHECK_TOOL([OCAMLYACC],[ocamlyacc],[no]) + AC_SUBST([OCAMLYACC]) +]) + + +AC_DEFUN([AC_PROG_CAMLP4], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + + # checking for camlp4 + AC_CHECK_TOOL([CAMLP4],[camlp4],[no]) + if test "$CAMLP4" != "no"; then + TMPVERSION=`$CAMLP4 -v 2>&1| sed -n -e 's|.*version *\(.*\)$|\1|p'` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc]) + CAMLP4=no + fi + fi + AC_SUBST([CAMLP4]) + + # checking for companion tools + AC_CHECK_TOOL([CAMLP4BOOT],[camlp4boot],[no]) + AC_CHECK_TOOL([CAMLP4O],[camlp4o],[no]) + AC_CHECK_TOOL([CAMLP4OF],[camlp4of],[no]) + AC_CHECK_TOOL([CAMLP4OOF],[camlp4oof],[no]) + AC_CHECK_TOOL([CAMLP4ORF],[camlp4orf],[no]) + AC_CHECK_TOOL([CAMLP4PROF],[camlp4prof],[no]) + AC_CHECK_TOOL([CAMLP4R],[camlp4r],[no]) + AC_CHECK_TOOL([CAMLP4RF],[camlp4rf],[no]) + AC_SUBST([CAMLP4BOOT]) + AC_SUBST([CAMLP4O]) + AC_SUBST([CAMLP4OF]) + AC_SUBST([CAMLP4OOF]) + AC_SUBST([CAMLP4ORF]) + AC_SUBST([CAMLP4PROF]) + AC_SUBST([CAMLP4R]) + AC_SUBST([CAMLP4RF]) +]) + + +AC_DEFUN([AC_PROG_FINDLIB], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + + # checking for ocamlfind + AC_CHECK_TOOL([OCAMLFIND],[ocamlfind],[no]) + AC_SUBST([OCAMLFIND]) +]) + + +dnl Thanks to Jim Meyering for working this next bit out for us. +dnl XXX We should define AS_TR_SH if it's not defined already +dnl (eg. for old autoconf). +AC_DEFUN([AC_CHECK_OCAML_PKG], +[dnl + AC_REQUIRE([AC_PROG_FINDLIB])dnl + + AC_MSG_CHECKING([for OCaml findlib package $1]) + + unset found + unset pkg + found=no + for pkg in $1 $2 ; do + if $OCAMLFIND query $pkg >/dev/null 2>/dev/null; then + AC_MSG_RESULT([found]) + AS_TR_SH([OCAML_PKG_$1])=$pkg + found=yes + break + fi + done + if test "$found" = "no" ; then + AC_MSG_RESULT([not found]) + AS_TR_SH([OCAML_PKG_$1])=no + fi + + AC_SUBST(AS_TR_SH([OCAML_PKG_$1])) +]) + + +AC_DEFUN([AC_CHECK_OCAML_MODULE], +[dnl + AC_MSG_CHECKING([for OCaml module $2]) + + cat > conftest.ml <&5 2>&5 ; then + found=yes + break + fi + done + + if test "$found" ; then + AC_MSG_RESULT([$$1]) + else + AC_MSG_RESULT([not found]) + $1=no + fi + AC_SUBST([$1]) +]) + + +dnl XXX Cross-compiling +AC_DEFUN([AC_CHECK_OCAML_WORD_SIZE], +[dnl + AC_MSG_CHECKING([for OCaml compiler word size]) + cat > conftest.ml <