Re: [Libguestfs] enable build for ocaml bytecode

Olaf Hering
Wed, 26 Feb 2014 18:03:44 -0000

On Thu, Jan 17, Richard W.M. Jones wrote:

> On Wed, Jan 16, 2013 at 05:51:53PM +0100, Olaf Hering wrote:
> > On Mon, Jan 14, Olaf Hering wrote:
> > > This is a first attempt to build libguestfs with just a ocaml
bytecode
> > > compiler. The three tools written in ocaml will be build only
when an
> > > ocamlopt compiler is available.
> > Here is a more complete change which covers also resize, sysprep and
> > sparsify. ocaml/examples are still disabled.
> Generally looks good.  Did you want to submit this second version or
> should we wait for more?

So here is a 1.24.X version which appears to work, at least for the
bytecode case.

Olaf

---
 builder/Makefile.am        | 50 ++++++++++++++++++++++++++++++++++++++----
 configure.ac               |  2 ++
 mllib/Makefile.am          | 54 ++++++++++++++++++++++++++++++++++++++++++----
 ocaml/Makefile.am          | 32 ++++++++++++++++++++++-----
 ocaml/examples/Makefile.am | 25 +++++++++++++++++++--
 resize/Makefile.am         | 43 ++++++++++++++++++++++++++++++++----
 sparsify/Makefile.am       | 39 +++++++++++++++++++++++++++++----
 sysprep/Makefile.am        | 40 ++++++++++++++++++++++++++++++++--
 8 files changed, 260 insertions(+), 25 deletions(-)

diff --git a/builder/Makefile.am b/builder/Makefile.am
index b8bf6ac..83ef46b 100644
--- a/builder/Makefile.am
+++ b/builder/Makefile.am
@@ -43,7 +43,30 @@ SOURCES = \
 if HAVE_OCAML

 # Note this list must be in dependency order.
-OBJECTS = \
+OBJECTS_bc = \
+	$(top_builddir)/mllib/libdir.cmo \
+	$(top_builddir)/mllib/common_gettext.cmo \
+	$(top_builddir)/mllib/common_utils.cmo \
+	$(top_builddir)/mllib/urandom.cmo \
+	$(top_builddir)/mllib/random_seed.cmo \
+	$(top_builddir)/mllib/hostname.cmo \
+	$(top_builddir)/mllib/firstboot.cmo \
+	$(top_builddir)/mllib/perl_edit.cmo \
+	$(top_builddir)/mllib/crypt-c.o \
+	$(top_builddir)/mllib/crypt.cmo \
+	$(top_builddir)/mllib/fsync-c.o \
+	$(top_builddir)/mllib/fsync.cmo \
+	$(top_builddir)/mllib/password.cmo \
+	$(top_builddir)/mllib/config.cmo \
+	get_kernel.cmo \
+	downloader.cmo \
+	sigchecker.cmo \
+	index_parser.cmo \
+	list_entries.cmo \
+	cmdline.cmo \
+	builder.cmo
+
+OBJECTS_opt = \
 	$(top_builddir)/mllib/libdir.cmx \
 	$(top_builddir)/mllib/common_gettext.cmx \
 	$(top_builddir)/mllib/common_utils.cmx \
@@ -66,6 +89,12 @@ OBJECTS = \
 	cmdline.cmx \
 	builder.cmx

+if HAVE_OCAMLOPT
+FINAL_BINARY = virt-builder.opt
+else
+FINAL_BINARY = virt-builder.bc
+endif
+
 bin_SCRIPTS = virt-builder

 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -73,7 +102,6 @@ bin_SCRIPTS = virt-builder
 # installed copy of libguestfs.
 OCAMLPACKAGES = \
 	-package str,unix \
-	-I $(top_builddir)/src/.libs \
 	-I $(top_builddir)/ocaml \
 	-I $(top_builddir)/mllib
 if HAVE_OCAML_PKG_GETTEXT
@@ -81,15 +109,29 @@ OCAMLPACKAGES += -package gettext-stub
 endif

 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
-OCAMLOPTFLAGS = $(OCAMLCFLAGS)
+OCAMLOPTFLAGS = \
+	-I $(top_builddir)/src/.libs \
+	$(OCAMLCFLAGS)

-virt-builder: $(OBJECTS)
+virt-builder.bc: $(OBJECTS_bc)
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  -custom \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '-lncurses -lcrypt' \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+
+virt-builder.opt: $(OBJECTS_opt)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '-lncurses -lcrypt' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@

+virt-builder: $(FINAL_BINARY)
+	cp -vf $< $@
+
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
 .ml.cmo:
diff --git a/configure.ac b/configure.ac
index d7430db..d0063e8 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$OCAMLC" != "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..4312283 100644
--- a/mllib/Makefile.am
+++ b/mllib/Makefile.am
@@ -62,7 +62,31 @@ 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.
-OBJECTS = \
+OBJECTS_bc = \
+	$(top_builddir)/fish/guestfish-progress.o \
+	$(top_builddir)/fish/guestfish-uri.o \
+	tty-c.o \
+	fsync-c.o \
+	progress-c.o \
+	uri-c.o \
+	crypt-c.o \
+	config.cmo \
+	libdir.cmo \
+	common_gettext.cmo \
+	common_utils.cmo \
+	urandom.cmo \
+	random_seed.cmo \
+	hostname.cmo \
+	firstboot.cmo \
+	perl_edit.cmo \
+	tTY.cmo \
+	fsync.cmo \
+	progress.cmo \
+	uRI.cmo \
+	crypt.cmo \
+	password.cmo
+
+OBJECTS_opt = \
 	$(top_builddir)/fish/guestfish-progress.o \
 	$(top_builddir)/fish/guestfish-uri.o \
 	tty-c.o \
@@ -86,31 +110,53 @@ OBJECTS = \
 	crypt.cmx \
 	password.cmx

+if HAVE_OCAMLOPT
+FINAL_BINARY = dummy.opt
+else
+FINAL_BINARY = dummy.bc
+endif
 noinst_SCRIPTS = dummy

 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
 # option to be passed to gcc, so we don't try linking against an
 # installed copy of libguestfs.
-OCAMLPACKAGES = -package str,unix -I $(top_builddir)/src/.libs -I ../ocaml
+OCAMLPACKAGES = \
+	-package str,unix \
+	-I $(top_builddir)/ocaml
+
 if HAVE_OCAML_PKG_GETTEXT
 OCAMLPACKAGES += -package gettext-stub
 endif

 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
-OCAMLOPTFLAGS = $(OCAMLCFLAGS)
+OCAMLOPTFLAGS = \
+	-I $(top_builddir)/src/.libs \
+	$(OCAMLCFLAGS)

 OCAMLCLIBS  = \
 	$(LIBXML2_LIBS) -lncurses -lcrypt \
 	-L../src/.libs -lutils \
 	-L../gnulib/lib/.libs -lgnu

-dummy: $(OBJECTS)
+dummy.bc: $(OBJECTS_bc)
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  -custom \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '$(OCAMLCLIBS)' \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+
+dummy.opt: $(OBJECTS_opt)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '$(OCAMLCLIBS)' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@

+dummy: $(FINAL_BINARY)
+	cp -vf $< $@
+
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
 .ml.cmo:
diff --git a/ocaml/Makefile.am b/ocaml/Makefile.am
index 5dd2c9b..43e0c59 100644
--- a/ocaml/Makefile.am
+++ b/ocaml/Makefile.am
@@ -37,10 +37,25 @@ 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 = META
+if HAVE_OCAMLOPT
+noinst_DATA += mlguestfs.cma
+noinst_DATA += mlguestfs.cmxa
+endif
+
+guestfs_deps = guestfs.cmo
+if HAVE_OCAMLOPT
+guestfs_deps += guestfs.cmx
+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
@@ -55,13 +70,15 @@ CLEANFILES += stamp-mlguestfs

 mlguestfs.cma mlguestfs.cmxa: stamp-mlguestfs

-stamp-mlguestfs: libguestfsocaml.a guestfs.cmo guestfs.cmx
+stamp-mlguestfs: libguestfsocaml.a $(guestfs_deps)
 	$(OCAMLMKLIB) -o mlguestfs \
 	  $(libguestfsocaml_a_OBJECTS) guestfs.cmo \
 	  -L$(top_builddir)/src/.libs -lguestfs
+if HAVE_OCAMLOPT
 	$(OCAMLMKLIB) -o mlguestfs \
 	  $(libguestfsocaml_a_OBJECTS) guestfs.cmx \
 	  -L$(top_builddir)/src/.libs -lguestfs
+endif
 	touch $@

 libguestfsocaml_a_CPPFLAGS = \
@@ -121,11 +138,16 @@ 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)
+bindtests_all = bindtests.bc
+if HAVE_OCAMLOPT
+test_progs_all += $(test_progs_opt)
+bindtests_all += bindtests.opt
+endif

 TESTS = run-bindtests $(test_progs_all)

-noinst_DATA += bindtests.bc bindtests.opt $(test_progs_all)
+noinst_DATA += $(bindtests_all) $(test_progs_all)

 %.bc: %.cmo mlguestfs.cma
 	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
@@ -171,7 +193,7 @@ 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

diff --git a/ocaml/examples/Makefile.am b/ocaml/examples/Makefile.am
index 200a0aa..3dadf03 100644
--- a/ocaml/examples/Makefile.am
+++ b/ocaml/examples/Makefile.am
@@ -47,14 +47,35 @@ if HAVE_OCAML

 noinst_SCRIPTS = create_disk inspect_vm

+if HAVE_OCAMLOPT
+FINAL_BINARY_create_disk = create_disk.opt
+FINAL_BINARY_inspect_vm = inspect_vm.opt
+else
+FINAL_BINARY_create_disk = create_disk.bc
+FINAL_BINARY_inspect_vm = inspect_vm.bc
+endif
 OCAMLFINDFLAGS = -cclib -L$(top_builddir)/src/.libs

-create_disk: create_disk.ml
+create_disk.bc: create_disk.ml
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLFINDFLAGS) -package unix -linkpkg \
+	  -custom \
+          -warn-error A -I .. mlguestfs.cma $< -o $@
+create_disk.opt: create_disk.ml
 	$(OCAMLFIND) ocamlopt $(OCAMLFINDFLAGS) -package unix -linkpkg \
           -warn-error A -I .. mlguestfs.cmxa $< -o $@

-inspect_vm: inspect_vm.ml
+inspect_vm.bc: inspect_vm.ml
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLFINDFLAGS) -package unix -linkpkg \
+	  -custom \
+          -warn-error A -I .. mlguestfs.cma $< -o $@
+inspect_vm.opt: inspect_vm.ml
 	$(OCAMLFIND) ocamlopt $(OCAMLFINDFLAGS) -package unix -linkpkg \
           -warn-error A -I .. mlguestfs.cmxa $< -o $@

+create_disk: $(FINAL_BINARY_create_disk)
+	cp -vf $< $@
+inspect_vm: $(FINAL_BINARY_inspect_vm)
+	cp -vf $< $@
 endif
diff --git a/resize/Makefile.am b/resize/Makefile.am
index 76c26ee..b8a1209 100644
--- a/resize/Makefile.am
+++ b/resize/Makefile.am
@@ -31,7 +31,23 @@ SOURCES = \
 if HAVE_OCAML

 # Note this list must be in dependency order.
-OBJECTS = \
+OBJECTS_bc = \
+	$(top_builddir)/mllib/tty-c.o \
+	$(top_builddir)/mllib/tTY.cmo \
+	$(top_builddir)/mllib/fsync-c.o \
+	$(top_builddir)/mllib/fsync.cmo \
+	$(top_builddir)/fish/guestfish-progress.o \
+	$(top_builddir)/mllib/progress-c.o \
+	$(top_builddir)/mllib/progress.cmo \
+	$(top_builddir)/fish/guestfish-uri.o \
+	$(top_builddir)/mllib/uri-c.o \
+	$(top_builddir)/mllib/uRI.cmo \
+	$(top_builddir)/mllib/common_gettext.cmo \
+	$(top_builddir)/mllib/common_utils.cmo \
+	$(top_builddir)/mllib/config.cmo \
+	resize.cmo
+
+OBJECTS_opt = \
 	$(top_builddir)/mllib/tty-c.o \
 	$(top_builddir)/mllib/tTY.cmx \
 	$(top_builddir)/mllib/fsync-c.o \
@@ -47,6 +63,12 @@ OBJECTS = \
 	$(top_builddir)/mllib/config.cmx \
 	resize.cmx

+if HAVE_OCAMLOPT
+FINAL_BINARY = virt-resize.opt
+else
+FINAL_BINARY = virt-resize.bc
+endif
+
 bin_SCRIPTS = virt-resize

 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -54,7 +76,6 @@ bin_SCRIPTS = virt-resize
 # installed copy of libguestfs.
 OCAMLPACKAGES = \
 	-package str,unix \
-	-I $(top_builddir)/src/.libs \
 	-I $(top_builddir)/ocaml \
 	-I $(top_builddir)/mllib
 if HAVE_OCAML_PKG_GETTEXT
@@ -62,20 +83,34 @@ OCAMLPACKAGES += -package gettext-stub
 endif

 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
-OCAMLOPTFLAGS = $(OCAMLCFLAGS)
+OCAMLOPTFLAGS = \
+	-I $(top_builddir)/src/.libs \
+	$(OCAMLCFLAGS)

 OCAMLCLIBS  = \
 	$(LIBXML2_LIBS) -lncurses \
 	-L../src/.libs -lutils \
 	-L../gnulib/lib/.libs -lgnu

-virt-resize: $(OBJECTS)
+virt-resize.bc: $(OBJECTS_bc)
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  -custom \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '$(OCAMLCLIBS)' \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+
+virt-resize.opt: $(OBJECTS_opt)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '$(OCAMLCLIBS)' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@

+virt-resize: $(FINAL_BINARY)
+	cp -vf $< $@
+
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
 .ml.cmo:
diff --git a/sparsify/Makefile.am b/sparsify/Makefile.am
index 98d9c70..645eb11 100644
--- a/sparsify/Makefile.am
+++ b/sparsify/Makefile.am
@@ -32,7 +32,19 @@ SOURCES = \
 if HAVE_OCAML

 # Note this list must be in dependency order.
-OBJECTS = \
+OBJECTS_bc = \
+	$(top_builddir)/fish/guestfish-progress.o \
+	$(top_builddir)/mllib/tty-c.o \
+	$(top_builddir)/mllib/progress-c.o \
+	$(top_builddir)/mllib/common_gettext.cmo \
+	$(top_builddir)/mllib/common_utils.cmo \
+	$(top_builddir)/mllib/tTY.cmo \
+	$(top_builddir)/mllib/progress.cmo \
+	$(top_builddir)/mllib/config.cmo \
+	statvfs-c.o \
+	sparsify.cmo
+
+OBJECTS_opt = \
 	$(top_builddir)/fish/guestfish-progress.o \
 	$(top_builddir)/mllib/tty-c.o \
 	$(top_builddir)/mllib/progress-c.o \
@@ -44,6 +56,12 @@ OBJECTS = \
 	statvfs-c.o \
 	sparsify.cmx

+if HAVE_OCAMLOPT
+FINAL_BINARY = virt-sparsify.opt
+else
+FINAL_BINARY = virt-sparsify.bc
+endif
+
 bin_SCRIPTS = virt-sparsify

 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -51,7 +69,6 @@ bin_SCRIPTS = virt-sparsify
 # installed copy of libguestfs.
 OCAMLPACKAGES = \
 	-package str,unix \
-	-I $(top_builddir)/src/.libs \
 	-I $(top_builddir)/ocaml \
 	-I $(top_builddir)/mllib
 if HAVE_OCAML_PKG_GETTEXT
@@ -59,15 +76,29 @@ OCAMLPACKAGES += -package gettext-stub
 endif

 OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
-OCAMLOPTFLAGS = $(OCAMLCFLAGS)
+OCAMLOPTFLAGS = \
+	-I $(top_builddir)/src/.libs \
+	$(OCAMLCFLAGS)

-virt-sparsify: $(OBJECTS)
+virt-sparsify.bc: $(OBJECTS_bc)
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
+	  -custom \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib -lncurses \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+
+virt-sparsify.opt: $(OBJECTS_opt)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib -lncurses \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@

+virt-sparsify: $(FINAL_BINARY)
+	cp -vf $< $@
+
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
 .ml.cmo:
diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am
index 24654cb..cc9e958 100644
--- a/sysprep/Makefile.am
+++ b/sysprep/Makefile.am
@@ -81,7 +81,25 @@ SOURCES = \
 if HAVE_OCAML

 # Note this list must be in dependency order.
-OBJECTS = \
+OBJECTS_bc = \
+	$(top_builddir)/mllib/common_gettext.cmo \
+	$(top_builddir)/mllib/common_utils.cmo \
+	$(top_builddir)/fish/guestfish-uri.o \
+	$(top_builddir)/mllib/uri-c.o \
+	$(top_builddir)/mllib/uRI.cmo \
+	$(top_builddir)/mllib/crypt-c.o \
+	$(top_builddir)/mllib/crypt.cmo \
+	$(top_builddir)/mllib/urandom.cmo \
+	$(top_builddir)/mllib/password.cmo \
+	$(top_builddir)/mllib/random_seed.cmo \
+	$(top_builddir)/mllib/hostname.cmo \
+	$(top_builddir)/mllib/firstboot.cmo \
+	$(top_builddir)/mllib/config.cmo \
+	sysprep_operation.cmo \
+	$(patsubst %,sysprep_operation_%.cmo,$(operations)) \
+	main.cmo
+
+OBJECTS_opt = \
 	$(top_builddir)/mllib/common_gettext.cmx \
 	$(top_builddir)/mllib/common_utils.cmx \
 	$(top_builddir)/fish/guestfish-uri.o \
@@ -99,6 +117,12 @@ OBJECTS = \
 	$(patsubst %,sysprep_operation_%.cmx,$(operations)) \
 	main.cmx

+if HAVE_OCAMLOPT
+FINAL_BINARY = virt-sysprep.opt
+else
+FINAL_BINARY = virt-sysprep.bc
+endif
+
 bin_SCRIPTS = virt-sysprep

 # -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -121,13 +145,25 @@ OCAMLCLIBS  = \
 	-L../src/.libs -lutils \
 	-L../gnulib/lib/.libs -lgnu

-virt-sysprep: $(OBJECTS)
+virt-sysprep.bc: $(OBJECTS_bc)
+	$(top_builddir)/libtool -dlopen $(top_builddir)/src/.libs/libguestfs.la
--mode=execute \
+	$(OCAMLFIND) ocamlc $(OCAMLOPTFLAGS) \
+	  -custom \
+	  mlguestfs.cma -linkpkg $^ \
+	  -cclib '$(OCAMLCLIBS)' \
+	  $(OCAML_GCOV_LDFLAGS) \
+	  -o $@
+
+virt-sysprep.opt: $(OBJECTS_opt)
 	$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
 	  mlguestfs.cmxa -linkpkg $^ \
 	  -cclib '$(OCAMLCLIBS)' \
 	  $(OCAML_GCOV_LDFLAGS) \
 	  -o $@

+virt-sysprep: $(FINAL_BINARY)
+	cp -vf $< $@
+
 .mli.cmi:
 	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@