Detecta la versión de OCaml al compilar C

Estoy trabajando en un código que mezcla OCaml y C, las funciones caml_release_runtime_system() y caml_acquire_runtime_system() se introdujeron en OCaml 3.12 (se llamaban de otra manera en versiones anteriores) pero me gustaría volver a ser compatible con 3.10 si es posible, ¿hay una #ifdef ¿Puedo usar para eso? He echado un vistazo a los encabezados (en /usr/lib/ocaml/caml en mi sistema Debian) y no puedo encontrar nada que se parezca. ¡Gracias!

ACTUALIZACIÓN: Esto es lo que hice

Esto es lo que hice:

#if OCAML_VERSION_MINOR >= 12
#include <caml/threads.h>
#else
#include <caml/signals.h>
#endif 

#ifndef caml_acquire_runtime_system
#define caml_acquire_runtime_system caml_leave_blocking_section
#define caml_release_runtime_system caml_enter_blocking_section
#endif

preguntado el 16 de mayo de 11 a las 17:05

2 Respuestas

La ocamlopt y ocamlc soportes binarios -vnum y -version interruptores para obtener el número de versión:

-vnum o -version Imprima el número de versión del compilador en forma abreviada (por ejemplo, 3.11.0), luego salga.

Este modificador es compatible con 3.12.0 y el texto de ejemplo en la documentación sugiere que 3.11.0 también lo admite. No tengo 3.10.0 a mano pero nlucaroni (cuyo OCaml Fu parece más fuerte que el mío) indica en los comentarios que 3.10.0 tiene ocamplopt -version.

Entonces podrías agregar algo como esto a tu Makefile:

OCAML_VERSION_MAJOR = `ocamlopt -version | cut -f1 -d.`
OCAML_VERSION_MINOR = `ocamlopt -version | cut -f2 -d.`
OCAML_VERSION_POINT = `ocamlopt -version | cut -f3 -d.`

Y luego páselos a su compilador usando -DOCAML_VERSION_MAJOR=$(OCAML_VERSION_MAJOR), -DOCAML_VERSION_MINOR=$(OCAML_VERSION_MINOR)...

contestado el 17 de mayo de 11 a las 00:05

Esto no me funciona en 3.11.2. Funciona en mi versión de 3.12.0. ocamlopt -version es lo que uso en mi script de configuración y funciona en 3.10.0 hasta ahora. - nlucaroni

Hmm, necesita funcionar en OCaml desde 3.10 hasta, bueno, cualquier versión anterior que supongo ... - Gayo

@nlucaroni, @Gaius: lo actualicé para usar ocamlopt -version, ¿eso funciona para todos con 3.10? - mu es demasiado corto

agregó ocamlc como soporte para ese cambio también. - nlucaroni

@nlucaroni: Gracias, muy apreciado. - mu es demasiado corto

caml / threads.h:

#define caml_acquire_runtime_system caml_leave_blocking_section
#define caml_release_runtime_system caml_enter_blocking_section

Así que simplemente agregue las mismas líneas a su código C (protegido con #ifndef caml_acquire_runtime_system) y evite que su sistema de compilación (y usuarios) dependa de utilidades externas y números de versión.

contestado el 17 de mayo de 11 a las 11:05

¡Agradable! Los vi cuando estaba mirando a través de los encabezados, pero ni siquiera se me ocurrió hacer eso. Gayo

Ah, pero parece que compilando con 3.11 obtengo error: caml/threads.h: No such file or directory así que eso no funciona desafortunadamente - Gayo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.