From 8d09d716aa849e2ee539c73567756904c994ea2b Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 13 Jul 2017 13:36:41 +0100 Subject: [PATCH] common/mlstdutils: Build a bytecode version of this library. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Even if ocamlopt is available, always build a bytecode version of ‘common/mlstdutils’. Furthermore, because this library is pure OCaml, we should not be using ‘ocamlmklib’. We should use ‘ocaml{c,opt} -a’ instead. This doesn't make any difference for native code, but for bytecode it was building a broken library. The original reason for making this change is because the generator is always built as bytecode, and it depended on ‘../common/mlstdutils/guestfs_config.cmo’ and ‘../common/mlstdutils/std_utils.cmo’. On native code platforms these were not built before the generator and so the generator races to build the .cmi and .cmo files. Since the generator doesn't have correct dependencies covering the ‘common/mlstdutils’ directory you can get a broken link on fast machines: File "../common/mlstdutils/std_utils.ml", line 1: Error: Corrupted compiled interface ../common/mlstdutils/guestfs_config.cmi make[2]: *** [Makefile:1993: ../common/mlstdutils/std_utils.cmo] Error 2 make[2]: *** Waiting for unfinished jobs.... make[2]: Leaving directory '/builddir/build/BUILD/libguestfs-1.37.17/generator' --- common/mlstdutils/Makefile.am | 16 +++++++++++++--- generator/Makefile.am | 10 ++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/common/mlstdutils/Makefile.am b/common/mlstdutils/Makefile.am index 3c1f13e18..1e96fd8f5 100644 --- a/common/mlstdutils/Makefile.am +++ b/common/mlstdutils/Makefile.am @@ -48,7 +48,12 @@ else MLSTDUTILS_CMA = mlstdutils.cmxa endif -noinst_DATA = $(MLSTDUTILS_CMA) +# Just for this library, we need to build both bytecode and native +# code because the generator always requires the bytecode version. +noinst_DATA = mlstdutils.cma +if HAVE_OCAMLOPT +noinst_DATA += mlstdutils.cmxa +endif libmlstdutils_a_SOURCES = dummy.c libmlstdutils_a_CPPFLAGS = \ @@ -79,8 +84,13 @@ endif libmlstdutils_a_DEPENDENCIES = $(OBJECTS) -$(MLSTDUTILS_CMA): $(OBJECTS) - $(OCAMLFIND) mklib $(OCAMLPACKAGES) $(OBJECTS) -o mlstdutils +mlstdutils.cma: $(BOBJECTS) + $(OCAMLFIND) ocamlc $(OCAMLPACKAGES) -a $^ -o $@ + +if HAVE_OCAMLOPT +mlstdutils.cmxa: $(XOBJECTS) + $(OCAMLFIND) ocamlopt $(OCAMLPACKAGES) -a $^ -o $@ +endif # This OCaml module has to be generated by make (configure will put # unexpanded prefix macro in). diff --git a/generator/Makefile.am b/generator/Makefile.am index 344ba9bcb..1936d0898 100644 --- a/generator/Makefile.am +++ b/generator/Makefile.am @@ -114,9 +114,6 @@ sources = \ # In build dependency order. objects = \ - $(OCAML_BYTES_COMPAT_CMO) \ - ../common/mlstdutils/guestfs_config.cmo \ - ../common/mlstdutils/std_utils.cmo \ types.cmo \ utils.cmo \ proc_nr.cmo \ @@ -178,7 +175,12 @@ OCAMLFLAGS = $(OCAML_FLAGS) $(OCAML_WARN_ERROR) noinst_PROGRAM = generator generator: $(objects) - $(OCAMLFIND) ocamlc $(OCAMLFLAGS) $(OCAMLPACKAGES) -linkpkg $^ -o $@ +# We need the recursive make here because the generator is +# rebuilt in ‘make clean’. + $(MAKE) -C $(top_builddir)/common/mlstdutils mlstdutils.cma + $(OCAMLFIND) ocamlc $(OCAMLFLAGS) \ + $(OCAMLPACKAGES) -linkpkg mlstdutils.cma \ + $^ -o $@ # Dependencies. depend: .depend