On Monday, 24 July 2017 15:13:52 CEST Richard W.M. Jones wrote:
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 | 13 ++++++++++---
generator/Makefile.am | 10 ++++++----
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/common/mlstdutils/Makefile.am b/common/mlstdutils/Makefile.am
index 3c1f13e18..968a03d01 100644
--- a/common/mlstdutils/Makefile.am
+++ b/common/mlstdutils/Makefile.am
@@ -48,7 +48,9 @@ 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 mlstdutils.cmxa
Should this keep HAVE_OCAMLOPT into account as well? i.e.:
noinst_DATA = mlstdutils.cma
if HAVE_OCAMLOPT
noinst_DATA += mlstdutils.cmxa
endif
The rest LGTM.
Thanks,
--
Pino Toscano