diff --git a/qtest/Makefile b/qtest/Makefile index 39705a4..48a2984 100644 --- a/qtest/Makefile +++ b/qtest/Makefile @@ -1,6 +1,6 @@ QTEST_PREAMBLE='' -DONTTEST=../src/iterLabels.ml ../src/mkflags.ml +DONTTEST=../src/iterLabels.ml ../src/mkflags.ml ../src/mkshims.ml ../src/bigarray/mkshims.ml QTESTABLE=$(filter-out $(DONTTEST), \ $(wildcard ../src/*.ml) \ $(wildcard ../src/*.mli) \ diff --git a/src/Iter.ml b/src/Iter.ml index 40fd47d..71789df 100644 --- a/src/Iter.ml +++ b/src/Iter.ml @@ -3,6 +3,8 @@ (** {1 Simple and Efficient Iterators} *) +open Iter_shims_ + (** Iter abstract iterator type *) type 'a t = ('a -> unit) -> unit diff --git a/src/bigarray/IterBigarray.ml b/src/bigarray/IterBigarray.ml index 716f12c..903d437 100644 --- a/src/bigarray/IterBigarray.ml +++ b/src/bigarray/IterBigarray.ml @@ -3,7 +3,7 @@ (** {1 Interface and Helpers for bigarrays} *) -open! Bigarray +open! IterBigarrayShims_ let of_bigarray b yield = let len = Bigarray.Array1.dim b in @@ -16,7 +16,7 @@ let mmap filename = let fd = Unix.openfile filename [Unix.O_RDONLY] 0 in let len = Unix.lseek fd 0 Unix.SEEK_END in let _ = Unix.lseek fd 0 Unix.SEEK_SET in - let b = Bigarray.Array1.map_file fd Bigarray.char Bigarray.c_layout false len in + let b = bigarray_map_file fd Bigarray.char Bigarray.c_layout false len in try of_bigarray b yield; Unix.close fd diff --git a/src/bigarray/dune b/src/bigarray/dune index 0c5d849..67aea21 100644 --- a/src/bigarray/dune +++ b/src/bigarray/dune @@ -3,8 +3,18 @@ (name iter_bigarray) (public_name iter.bigarray) (libraries iter bigarray) + (modules IterBigarray IterBigarrayShims_) (wrapped false) (optional) (flags :standard -w +a-4-42-44-48-50-58-32-60@8 -safe-string) - (ocamlopt_flags :standard (:include ../flambda.flags)) - ) + (ocamlopt_flags :standard (:include ../flambda.flags))) + +(executable + (name mkshims) + (modules mkshims) + (libraries dune.configurator)) + +(rule + (targets IterBigarrayShims_.ml) + (deps mkshims.exe) + (action (with-stdout-to %{targets} (run ./mkshims.exe)))) diff --git a/src/bigarray/mkshims.ml b/src/bigarray/mkshims.ml new file mode 100644 index 0000000..d24e42d --- /dev/null +++ b/src/bigarray/mkshims.ml @@ -0,0 +1,17 @@ + +module C = Configurator.V1 + +let shims_pre_408 = " +open! Bigarray +let bigarray_map_file = Bigarray.Array1.map_file +" +let shims_post_408 = " +let bigarray_map_file fd ty lay b len = + Unix.map_file fd ty lay b [| len |] |> Bigarray.array1_of_genarray +" + +let () = + C.main ~name:"mkshims" (fun c -> + let version = C.ocaml_config_var_exn c "version" in + let major, minor = Scanf.sscanf version "%u.%u" (fun maj min -> maj, min) in + print_endline (if (major, minor) >= (4,8) then shims_post_408 else shims_post_408)) diff --git a/src/dune b/src/dune index 7fc8a02..b8396d2 100644 --- a/src/dune +++ b/src/dune @@ -2,17 +2,24 @@ (targets flambda.flags) (deps mkflags.ml) (mode fallback) - (action - (run ocaml ./mkflags.ml)) - ) + (action (run ocaml ./mkflags.ml))) + +(executable + (name mkshims) + (modules mkshims) + (libraries dune.configurator)) + +(rule + (targets Iter_shims_.ml) + (deps mkshims.exe) + (action (with-stdout-to %{targets} (run ./mkshims.exe)))) (library (name iter) (public_name iter) (wrapped false) - (modules Iter IterLabels) + (modules Iter IterLabels Iter_shims_) (flags :standard -w +a-4-42-44-48-50-58-32-60@8 -safe-string -nolabels) (ocamlopt_flags :standard (:include flambda.flags)) - (libraries bytes result) - ) + (libraries bytes result)) diff --git a/src/mkshims.ml b/src/mkshims.ml new file mode 100644 index 0000000..fb99ffe --- /dev/null +++ b/src/mkshims.ml @@ -0,0 +1,11 @@ + +module C = Configurator.V1 + +let shims_pre_408 = "module Pervasives = Pervasives" +let shims_post_408 = "module Pervasives = Stdlib" + +let () = + C.main ~name:"mkshims" (fun c -> + let version = C.ocaml_config_var_exn c "version" in + let major, minor = Scanf.sscanf version "%u.%u" (fun maj min -> maj, min) in + print_endline (if (major, minor) >= (4,8) then shims_post_408 else shims_post_408))