[Libguestfs] enable build for ocaml bytecode

Olaf Hering olaf at aepfle.de
Fri Feb 28 15:11:18 UTC 2014


On Fri, Feb 28, Olaf Hering wrote:

> On Fri, Feb 28, Richard W.M. Jones wrote:
> 
> > I believe this patch has now been superseded by Hilko's commit here:
> 
> I'm backporting it right now, will send my version once it actually
> builds.

This is the 1.24 version of f75142c577255b30f2a8e1d27baa5fd185594197,
passes my build test.

Olaf

---
 builder/Makefile.am        | 18 +++++++++++++++-
 configure.ac               |  2 ++
 mllib/Makefile.am          | 54 ++++++++++++++++++++++++++++++++--------------
 ocaml/Makefile.am          | 35 +++++++++++++++++++++---------
 ocaml/examples/Makefile.am | 13 +++++++++++
 resize/Makefile.am         | 18 +++++++++++++++-
 sparsify/Makefile.am       | 18 +++++++++++++++-
 sysprep/Makefile.am        | 18 +++++++++++++++-
 8 files changed, 146 insertions(+), 30 deletions(-)

diff --git a/builder/Makefile.am b/builder/Makefile.am
index b8bf6ac..80646c1 100644
--- a/builder/Makefile.am
+++ b/builder/Makefile.am
@@ -43,7 +43,7 @@ SOURCES = \
 if HAVE_OCAML
 
 # Note this list must be in dependency order.
-OBJECTS = \
+deps = \
 	$(top_builddir)/mllib/libdir.cmx \
 	$(top_builddir)/mllib/common_gettext.cmx \
 	$(top_builddir)/mllib/common_utils.cmx \
@@ -66,6 +66,12 @@ OBJECTS = \
 	cmdline.cmx \
 	builder.cmx
 
+if HAVE_OCAMLOPT
+OBJECTS = $(deps)
+else
+OBJECTS = $(patsubst %.cmx,%.cmo,$(deps))
+endif
+
 bin_SCRIPTS = virt-builder
 
 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -83,12 +89,22 @@ endif
 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
 OCAMLOPTFLAGS = $(OCAMLCFLAGS)
 
+if HAVE_OCAMLOPT
 virt-builder: $(OBJECTS)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '-lncurses -lcrypt' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@
+else
+virt-builder: $(OBJECTS)
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '-lncurses -lcrypt' \
+	  -custom \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+endif
 
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
diff --git a/configure.ac b/configure.ac
index d7430db..e57bbf7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1024,6 +1024,8 @@ AS_IF([test "x$enable_ocaml" != "xno"],[
 ])
 AM_CONDITIONAL([HAVE_OCAML],
                [test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno"])
+AM_CONDITIONAL([HAVE_OCAMLOPT],
+               [test "x$OCAMLOPT" != "xno" && test "x$OCAMLFIND" != "xno"])
 AM_CONDITIONAL([HAVE_OCAMLDOC],
                [test "x$OCAMLDOC" != "xno"])
 
diff --git a/mllib/Makefile.am b/mllib/Makefile.am
index 8c8d508..a685310 100644
--- a/mllib/Makefile.am
+++ b/mllib/Makefile.am
@@ -62,6 +62,22 @@ if HAVE_OCAML
 # - We're not actually building a functioning program here, we're just
 #   linking everything together to check all the modules build OK.
 # - This list must be in dependency order.
+ocaml_modules = config \
+	libdir \
+	common_gettext \
+	common_utils \
+	urandom \
+	random_seed \
+	hostname \
+	firstboot \
+	perl_edit \
+	tTY \
+	fsync \
+	progress \
+	uRI \
+	crypt \
+	password
+
 OBJECTS = \
 	$(top_builddir)/fish/guestfish-progress.o \
 	$(top_builddir)/fish/guestfish-uri.o \
@@ -69,22 +85,13 @@ OBJECTS = \
 	fsync-c.o \
 	progress-c.o \
 	uri-c.o \
-	crypt-c.o \
-	config.cmx \
-	libdir.cmx \
-	common_gettext.cmx \
-	common_utils.cmx \
-	urandom.cmx \
-	random_seed.cmx \
-	hostname.cmx \
-	firstboot.cmx \
-	perl_edit.cmx \
-	tTY.cmx \
-	fsync.cmx \
-	progress.cmx \
-	uRI.cmx \
-	crypt.cmx \
-	password.cmx
+	crypt-c.o
+
+if HAVE_OCAMLOPT
+OBJECTS += $(patsubst %,%.cmx,$(ocaml_modules))
+else
+OBJECTS += $(patsubst %,%.cmo,$(ocaml_modules))
+endif
 
 noinst_SCRIPTS = dummy
 
@@ -105,11 +112,20 @@ OCAMLCLIBS  = \
 	-L../gnulib/lib/.libs -lgnu
 
 dummy: $(OBJECTS)
+if HAVE_OCAMLOPT
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '$(OCAMLCLIBS)' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@
+else
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '$(OCAMLCLIBS)' \
+	  -custom \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+endif
 
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
@@ -142,9 +158,15 @@ DEFAULT_INCLUDES = \
 
 check_SCRIPTS = common_utils_tests
 
+if HAVE_OCAMLOPT
 common_utils_tests: common_gettext.cmx common_utils.cmx common_utils_tests.cmx
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ -cclib -lncurses -o $@
+else
+common_utils_tests: common_gettext.cmo common_utils.cmo common_utils_tests.cmo
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  mlguestfs.cma -linkpkg $^ -cclib -lncurses -o $@
+endif
 
 TESTS_ENVIRONMENT = $(top_builddir)/run --test
 
diff --git a/ocaml/Makefile.am b/ocaml/Makefile.am
index 5dd2c9b..698e13a 100644
--- a/ocaml/Makefile.am
+++ b/ocaml/Makefile.am
@@ -37,10 +37,18 @@ CLEANFILES += t/*.cmi t/*.cmo t/*.cmx t/*.o t/*.a t/*.so
 
 if HAVE_OCAML
 
+DATA_HOOK_FILES = META *.so *.a *.cma *.cmi $(srcdir)/*.mli
+if HAVE_OCAMLOPT
+DATA_HOOK_FILES += *.cmx *.cmxa
+endif
+
 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX
 OCAMLOPTFLAGS = $(OCAMLCFLAGS)
 
-noinst_DATA = mlguestfs.cma mlguestfs.cmxa META
+noinst_DATA = mlguestfs.cma META
+if HAVE_OCAMLOPT
+noinst_DATA +=  mlguestfs.cmxa
+endif
 
 # Build the C part into a library, so that automake handles the C
 # compilation step for us.  Note that we don't directly use this
@@ -51,18 +59,15 @@ noinst_LIBRARIES = libguestfsocaml.a
 # 'libmlguestfs.a' and if run at the same time, they will stomp on or
 # corrupt each others copy.  Hence we have to serialize the calls.
 
-CLEANFILES += stamp-mlguestfs
-
-mlguestfs.cma mlguestfs.cmxa: stamp-mlguestfs
-
-stamp-mlguestfs: libguestfsocaml.a guestfs.cmo guestfs.cmx
+mlguestfs.cma: libguestfsocaml.a guestfs.cmo
 	$(OCAMLMKLIB) -o mlguestfs \
 	  $(libguestfsocaml_a_OBJECTS) guestfs.cmo \
 	  -L$(top_builddir)/src/.libs -lguestfs
+
+mlguestfs.cmxa: libguestfsocaml.a guestfs.cmx
 	$(OCAMLMKLIB) -o mlguestfs \
 	  $(libguestfsocaml_a_OBJECTS) guestfs.cmx \
 	  -L$(top_builddir)/src/.libs -lguestfs
-	touch $@
 
 libguestfsocaml_a_CPPFLAGS = \
 	-DGUESTFS_PRIVATE=1 \
@@ -121,11 +126,17 @@ test_progs_opt += \
 	t/guestfs_430_progress_messages.opt
 endif
 
-test_progs_all = $(test_progs_bc) $(test_progs_opt)
+test_progs_all = $(test_progs_bc)
+if HAVE_OCAMLOPT
+test_progs_all += $(test_progs_opt)
+endif
 
 TESTS = run-bindtests $(test_progs_all)
 
-noinst_DATA += bindtests.bc bindtests.opt $(test_progs_all)
+noinst_DATA += bindtests.bc $(test_progs_all)
+if HAVE_OCAMLOPT
+noinst_DATA += bindtests.opt
+endif
 
 %.bc: %.cmo mlguestfs.cma
 	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la --mode=execute \
@@ -171,10 +182,14 @@ install-data-hook:
 	$(OCAMLFIND) install \
 	  -ldconf ignore -destdir $(DESTDIR)$(OCAMLLIB) \
 	  guestfs \
-	  META *.so *.a *.cma *.cmx *.cmxa *.cmi $(srcdir)/*.mli
+	  $(DATA_HOOK_FILES)
 	rm $(DESTDIR)$(OCAMLLIB)/guestfs/bindtests.*
 	rm $(DESTDIR)$(OCAMLLIB)/guestfs/libguestfsocaml.a
 
 CLEANFILES += $(noinst_DATA)
 
 endif
+
+# Tell version 3.79 and up of GNU make to not build goals in this
+# directory in parallel.
+.NOTPARALLEL:
diff --git a/ocaml/examples/Makefile.am b/ocaml/examples/Makefile.am
index 200a0aa..472e180 100644
--- a/ocaml/examples/Makefile.am
+++ b/ocaml/examples/Makefile.am
@@ -49,6 +49,7 @@ noinst_SCRIPTS = create_disk inspect_vm
 
 OCAMLFINDFLAGS = -cclib -L$(top_builddir)/src/.libs
 
+if HAVE_OCAMLOPT
 create_disk: create_disk.ml
 	$(OCAMLFIND) ocamlopt $(OCAMLFINDFLAGS) -package unix -linkpkg \
           -warn-error A -I .. mlguestfs.cmxa $< -o $@
@@ -56,5 +57,17 @@ create_disk: create_disk.ml
 inspect_vm: inspect_vm.ml
 	$(OCAMLFIND) ocamlopt $(OCAMLFINDFLAGS) -package unix -linkpkg \
           -warn-error A -I .. mlguestfs.cmxa $< -o $@
+else
+
+# This avoids:
+#   Error: Error on dynamically loaded library: ../dllmlguestfs.so: libguestfs.so.0: cannot open shared object file: No such file or directory
+create_disk: create_disk.ml
+	$(top_builddir)/run $(OCAMLFIND) ocamlc $(OCAMLFINDFLAGS) -package unix -linkpkg \
+          -warn-error A -I .. mlguestfs.cma $< -o $@
+
+inspect_vm: inspect_vm.ml
+	$(top_builddir)/run $(OCAMLFIND) ocamlc $(OCAMLFINDFLAGS) -package unix -linkpkg \
+          -warn-error A -I .. mlguestfs.cma $< -o $@
+endif
 
 endif
diff --git a/resize/Makefile.am b/resize/Makefile.am
index 76c26ee..ef35bf9 100644
--- a/resize/Makefile.am
+++ b/resize/Makefile.am
@@ -31,7 +31,7 @@ SOURCES = \
 if HAVE_OCAML
 
 # Note this list must be in dependency order.
-OBJECTS = \
+deps = \
 	$(top_builddir)/mllib/tty-c.o \
 	$(top_builddir)/mllib/tTY.cmx \
 	$(top_builddir)/mllib/fsync-c.o \
@@ -47,6 +47,12 @@ OBJECTS = \
 	$(top_builddir)/mllib/config.cmx \
 	resize.cmx
 
+if HAVE_OCAMLOPT
+OBJECTS = $(deps)
+else
+OBJECTS = $(patsubst %.cmx,%.cmo,$(deps))
+endif
+
 bin_SCRIPTS = virt-resize
 
 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -69,12 +75,22 @@ OCAMLCLIBS  = \
 	-L../src/.libs -lutils \
 	-L../gnulib/lib/.libs -lgnu
 
+if HAVE_OCAMLOPT
 virt-resize: $(OBJECTS)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '$(OCAMLCLIBS)' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@
+else
+virt-resize: $(OBJECTS)
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '$(OCAMLCLIBS)' \
+	  -custom \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+endif
 
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
diff --git a/sparsify/Makefile.am b/sparsify/Makefile.am
index 98d9c70..bf6caf0 100644
--- a/sparsify/Makefile.am
+++ b/sparsify/Makefile.am
@@ -32,7 +32,7 @@ SOURCES = \
 if HAVE_OCAML
 
 # Note this list must be in dependency order.
-OBJECTS = \
+deps = \
 	$(top_builddir)/fish/guestfish-progress.o \
 	$(top_builddir)/mllib/tty-c.o \
 	$(top_builddir)/mllib/progress-c.o \
@@ -44,6 +44,12 @@ OBJECTS = \
 	statvfs-c.o \
 	sparsify.cmx
 
+if HAVE_OCAMLOPT
+OBJECTS = $(deps)
+else
+OBJECTS = $(patsubst %.cmx,%.cmo,$(deps))
+endif
+
 bin_SCRIPTS = virt-sparsify
 
 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -61,12 +67,22 @@ endif
 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
 OCAMLOPTFLAGS = $(OCAMLCFLAGS)
 
+if HAVE_OCAMLOPT
 virt-sparsify: $(OBJECTS)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib -lncurses \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@
+else
+virt-sparsify: $(OBJECTS)
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib -lncurses \
+	  -custom \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+endif
 
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am
index 24654cb..352735b 100644
--- a/sysprep/Makefile.am
+++ b/sysprep/Makefile.am
@@ -81,7 +81,7 @@ SOURCES = \
 if HAVE_OCAML
 
 # Note this list must be in dependency order.
-OBJECTS = \
+deps = \
 	$(top_builddir)/mllib/common_gettext.cmx \
 	$(top_builddir)/mllib/common_utils.cmx \
 	$(top_builddir)/fish/guestfish-uri.o \
@@ -99,6 +99,12 @@ OBJECTS = \
 	$(patsubst %,sysprep_operation_%.cmx,$(operations)) \
 	main.cmx
 
+if HAVE_OCAMLOPT
+OBJECTS = $(deps)
+else
+OBJECTS = $(patsubst %.cmx,%.cmo,$(deps))
+endif
+
 bin_SCRIPTS = virt-sysprep
 
 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -121,12 +127,22 @@ OCAMLCLIBS  = \
 	-L../src/.libs -lutils \
 	-L../gnulib/lib/.libs -lgnu
 
+if HAVE_OCAMLOPT
 virt-sysprep: $(OBJECTS)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '$(OCAMLCLIBS)' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@
+else
+virt-sysprep: $(OBJECTS)
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '$(OCAMLCLIBS)' \
+	  -custom \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+endif
 
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@




More information about the Libguestfs mailing list