[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] tools/ocaml: Gitlab CI test for bindings


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Andrii Sultanov <andriy.sultanov@xxxxxxxxxx>
  • Date: Mon, 26 Oct 2026 16:26:36 +0000
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=vates.tech header.i="@vates.tech" header.h="From:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:In-Reply-To:References:Feedback-ID"
  • Cc: Guillaume Thouvenin <guillaume.thouvenin@xxxxxxxxxx>, Julian Vetter <julian.vetter@xxxxxxxxxx>
  • Delivery-date: Mon, 26 Oct 2026 16:27:00 +0000
  • Feedback-id: default:8631fc262581453bbf619ec5b2062170:Sweego
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 10/26/26 16:20, Andrew Cooper wrote:

... as building and interpreting Ocaml objects in C is rather fragile.

For C producing objects for Ocaml to consume, one trick to check validity is
Gc.compact() which forces a major sweep, walking all objects.  If this doesn't
segfault, then we at least got the pointer <-> integer aspect right.

For now, start with a very simple version call.  (Re)introduce
tools/ocaml/tests and add test-ocaml-bindings which is installed into
$(DESTDIR)$(LIBEXEC)/tests to be picked up automatically with the other dom0
tests.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Andrii Sultanov <andriy.sultanov@xxxxxxxxxx>
CC: Guillaume Thouvenin <guillaume.thouvenin@xxxxxxxxxx>
CC: Julian Vetter <julian.vetter@xxxxxxxxxx>

https://gitlab.com/xen-project/hardware/xen-staging/-/pipelines/2990559670/test_report
---
  tools/ocaml/Makefile                  |  1 +
  tools/ocaml/tests/Makefile            |  8 +++++++
  tools/ocaml/tests/bindings/.gitignore |  1 +
  tools/ocaml/tests/bindings/Makefile   | 34 +++++++++++++++++++++++++++
  tools/ocaml/tests/bindings/main.ml    | 19 +++++++++++++++
  5 files changed, 63 insertions(+)
  create mode 100644 tools/ocaml/tests/Makefile
  create mode 100644 tools/ocaml/tests/bindings/.gitignore
  create mode 100644 tools/ocaml/tests/bindings/Makefile
  create mode 100644 tools/ocaml/tests/bindings/main.ml

diff --git a/tools/ocaml/Makefile b/tools/ocaml/Makefile
index 7252eb23d798..e570e30a6e8d 100644
--- a/tools/ocaml/Makefile
+++ b/tools/ocaml/Makefile
@@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
SUBDIRS := libs
  SUBDIRS += xenstored
+SUBDIRS += tests
.NOTPARALLEL:
  # targets here must be run in order, otherwise we can try
diff --git a/tools/ocaml/tests/Makefile b/tools/ocaml/tests/Makefile
new file mode 100644
index 000000000000..e9f3557f1219
--- /dev/null
+++ b/tools/ocaml/tests/Makefile
@@ -0,0 +1,8 @@
+XEN_ROOT = $(CURDIR)/../../..
+include $(XEN_ROOT)/tools/Rules.mk
+
+SUBDIRS-y :=
+SUBDIRS-y += bindings
+
+.PHONY: all clean install distclean uninstall
+all clean distclean install uninstall: %: subdirs-%
diff --git a/tools/ocaml/tests/bindings/.gitignore 
b/tools/ocaml/tests/bindings/.gitignore
new file mode 100644
index 000000000000..6e9a7f429b49
--- /dev/null
+++ b/tools/ocaml/tests/bindings/.gitignore
@@ -0,0 +1 @@
+test-ocaml-bindings
diff --git a/tools/ocaml/tests/bindings/Makefile 
b/tools/ocaml/tests/bindings/Makefile
new file mode 100644
index 000000000000..75f8babbafca
--- /dev/null
+++ b/tools/ocaml/tests/bindings/Makefile
@@ -0,0 +1,34 @@
+XEN_ROOT = $(CURDIR)/../../../..
+OCAML_TOPLEVEL = $(CURDIR)/../..
+include $(OCAML_TOPLEVEL)/common.make
+
+OBJS = main
+
+OCAMLINCLUDE += \
+       -I $(OCAML_TOPLEVEL)/libs/xb \
+       -I $(OCAML_TOPLEVEL)/libs/mmap \
+       -I $(OCAML_TOPLEVEL)/libs/xc \
+       -I $(OCAML_TOPLEVEL)/libs/eventchn
+
+LIBS = \
+       unix.cmxa \
+       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap 
$(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
+       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn 
$(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
+       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc 
$(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \
+       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb 
$(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \
+       -ccopt -L -ccopt $(XEN_ROOT)/tools/libs/ctrl
+
+PROGRAMS = test-ocaml-bindings
+OCAML_PROGRAM = test-ocaml-bindings
+
+test-ocaml-bindings_LIBS = $(LIBS)
+test-ocaml-bindings_MLSORTED = $(shell $(OCAMLDEP) -sort $(OBJS:=.ml))
+test-ocaml-bindings_OBJS = $(test-ocaml-bindings_MLSORTED:.ml=)
+
+all: test-ocaml-bindings
+
+install: all
+       $(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests
+       $(INSTALL_PROG) test-ocaml-bindings $(DESTDIR)$(LIBEXEC)/tests
+
+include $(OCAML_TOPLEVEL)/Makefile.rules
diff --git a/tools/ocaml/tests/bindings/main.ml 
b/tools/ocaml/tests/bindings/main.ml
new file mode 100644
index 000000000000..785837e270ad
--- /dev/null
+++ b/tools/ocaml/tests/bindings/main.ml
@@ -0,0 +1,19 @@
+open Printf
+
+let xch = Xenctrl.interface_open ()
+
+let test_xenversion () =
+  let ver = Xenctrl.version xch in
+  printf "Xen version: %d.%d%s\n" ver.major ver.minor ver.extra
+
+
+let () =
+  printf "Test Ocaml Bindings\n%!";
+
+  test_xenversion ();
+
+  printf "Starting GC.compact()\n%!";
+  Gc.compact ();
+  printf "GC done\n";
+
+  ()

base-commit: 46678752be2d97f61317d793408a59927a429847
Acked-by: Andrii Sultanov <andriy.sultanov@xxxxxxxxxx>



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.