Browse Source

Move to jbuilder

Moving to jbuilder has the following consequences:

* We now have separate sub packages rather than optional dependencies (yay)
* Builds are much faster.
* Generated garbage doesn't need to be checked in.

That being said, there's a couple of downsides (for now):

* There's no good way to implement the build-test section of opam files.
* You can't check in the descr file anymore. However, opam 2.0 will make these
descr files obsolete by letting you set them directly as fields in the opam
file.

Also, it's important to review the META file jbuilder generates (somewhere in
_build)
Rudi Grinberg 5 years ago
parent
commit
de91814821

+ 2 - 0
.gitignore

@@ -8,3 +8,5 @@ setup.data
 *.native
 *.byte
 *.docdir
+*.install
+.merlin

+ 0 - 41
Makefile

@@ -1,41 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: a3c674b4239234cbbe53afe090018954)
-
-SETUP = ocaml setup.ml
-
-build: setup.data
-	$(SETUP) -build $(BUILDFLAGS)
-
-doc: setup.data build
-	$(SETUP) -doc $(DOCFLAGS)
-
-test: setup.data build
-	$(SETUP) -test $(TESTFLAGS)
-
-all:
-	$(SETUP) -all $(ALLFLAGS)
-
-install: setup.data
-	$(SETUP) -install $(INSTALLFLAGS)
-
-uninstall: setup.data
-	$(SETUP) -uninstall $(UNINSTALLFLAGS)
-
-reinstall: setup.data
-	$(SETUP) -reinstall $(REINSTALLFLAGS)
-
-clean:
-	$(SETUP) -clean $(CLEANFLAGS)
-
-distclean:
-	$(SETUP) -distclean $(DISTCLEANFLAGS)
-
-setup.data:
-	$(SETUP) -configure $(CONFIGUREFLAGS)
-
-configure:
-	$(SETUP) -configure $(CONFIGUREFLAGS)
-
-.PHONY: build doc test all install uninstall reinstall clean distclean configure
-
-# OASIS_STOP

+ 0 - 86
_tags

@@ -1,86 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: b41908a0630c42507cecfecb81f834a3)
-# Ignore VCS directories, you can use the same kind of rule outside
-# OASIS_START/STOP if you want to exclude directories that contains
-# useless stuff for the build process
-true: annot, bin_annot
-<**/.svn>: -traverse
-<**/.svn>: not_hygienic
-".bzr": -traverse
-".bzr": not_hygienic
-".hg": -traverse
-".hg": not_hygienic
-".git": -traverse
-".git": not_hygienic
-"_darcs": -traverse
-"_darcs": not_hygienic
-# Library angstrom
-"lib/angstrom.cmxs": use_angstrom
-<lib/*.ml{,i,y}>: package(cstruct)
-<lib/*.ml{,i,y}>: package(ocplib-endian)
-<lib/*.ml{,i,y}>: package(result)
-# Library angstrom_unix
-"unix/angstrom_unix.cmxs": use_angstrom_unix
-<unix/*.ml{,i,y}>: package(cstruct)
-<unix/*.ml{,i,y}>: package(ocplib-endian)
-<unix/*.ml{,i,y}>: package(result)
-<unix/*.ml{,i,y}>: use_angstrom
-# Library angstrom_lwt_unix
-"lwt/angstrom_lwt_unix.cmxs": use_angstrom_lwt_unix
-<lwt/*.ml{,i,y}>: package(cstruct)
-<lwt/*.ml{,i,y}>: package(lwt.unix)
-<lwt/*.ml{,i,y}>: package(ocplib-endian)
-<lwt/*.ml{,i,y}>: package(result)
-<lwt/*.ml{,i,y}>: use_angstrom
-# Library angstrom_async
-"async/angstrom_async.cmxs": use_angstrom_async
-<async/*.ml{,i,y}>: package(async)
-<async/*.ml{,i,y}>: package(cstruct)
-<async/*.ml{,i,y}>: package(ocplib-endian)
-<async/*.ml{,i,y}>: package(result)
-<async/*.ml{,i,y}>: package(threads)
-<async/*.ml{,i,y}>: use_angstrom
-# Executable test_angstrom
-<lib_test/test_angstrom.{native,byte}>: package(alcotest)
-<lib_test/test_angstrom.{native,byte}>: package(cstruct)
-<lib_test/test_angstrom.{native,byte}>: package(ocplib-endian)
-<lib_test/test_angstrom.{native,byte}>: package(result)
-<lib_test/test_angstrom.{native,byte}>: use_angstrom
-<lib_test/*.ml{,i,y}>: package(alcotest)
-<lib_test/*.ml{,i,y}>: package(cstruct)
-<lib_test/*.ml{,i,y}>: package(ocplib-endian)
-<lib_test/*.ml{,i,y}>: package(result)
-<lib_test/*.ml{,i,y}>: use_angstrom
-# Executable pure_benchmark
-<benchmarks/pure_benchmark.{native,byte}>: package(core_bench)
-<benchmarks/pure_benchmark.{native,byte}>: package(cstruct)
-<benchmarks/pure_benchmark.{native,byte}>: package(ocplib-endian)
-<benchmarks/pure_benchmark.{native,byte}>: package(result)
-<benchmarks/pure_benchmark.{native,byte}>: package(threads)
-<benchmarks/pure_benchmark.{native,byte}>: use_angstrom
-<benchmarks/*.ml{,i,y}>: package(core_bench)
-# Executable async_benchmark
-<benchmarks/async_benchmark.{native,byte}>: package(async)
-<benchmarks/async_benchmark.{native,byte}>: package(cstruct)
-<benchmarks/async_benchmark.{native,byte}>: package(ocplib-endian)
-<benchmarks/async_benchmark.{native,byte}>: package(result)
-<benchmarks/async_benchmark.{native,byte}>: package(threads)
-<benchmarks/async_benchmark.{native,byte}>: use_angstrom
-<benchmarks/async_benchmark.{native,byte}>: use_angstrom_async
-<benchmarks/*.ml{,i,y}>: package(async)
-<benchmarks/*.ml{,i,y}>: package(threads)
-<benchmarks/*.ml{,i,y}>: use_angstrom_async
-# Executable lwt_benchmark
-<benchmarks/lwt_benchmark.{native,byte}>: package(cstruct)
-<benchmarks/lwt_benchmark.{native,byte}>: package(lwt.unix)
-<benchmarks/lwt_benchmark.{native,byte}>: package(ocplib-endian)
-<benchmarks/lwt_benchmark.{native,byte}>: package(result)
-<benchmarks/lwt_benchmark.{native,byte}>: use_angstrom
-<benchmarks/lwt_benchmark.{native,byte}>: use_angstrom_lwt_unix
-<benchmarks/*.ml{,i,y}>: package(cstruct)
-<benchmarks/*.ml{,i,y}>: package(lwt.unix)
-<benchmarks/*.ml{,i,y}>: package(ocplib-endian)
-<benchmarks/*.ml{,i,y}>: package(result)
-<benchmarks/*.ml{,i,y}>: use_angstrom
-<benchmarks/*.ml{,i,y}>: use_angstrom_lwt_unix
-# OASIS_STOP

+ 17 - 0
angstrom-async.opam

@@ -0,0 +1,17 @@
+opam-version: "1.2"
+name: "angstrom-async"
+maintainer: "Spiros Eliopoulos <spiros@inhabitedtype.com>"
+authors: [ "Spiros Eliopoulos <spiros@inhabitedtype.com>" ]
+license: "BSD-3-clause"
+homepage: "https://github.com/inhabitedtype/angstrom"
+bug-reports: "https://github.com/inhabitedtype/angstrom/issues"
+dev-repo: "https://github.com/inhabitedtype/angstrom.git"
+build: [
+  ["jbuilder" "build" "--only-packages" "angstrom-async" "--root" "."
+   "-j" jobs "@install"]
+]
+depends: [
+  "angstrom"
+  "async"
+]
+available: [ ocaml-version >= "4.01.0" ]

+ 18 - 0
angstrom-lwt-unix.opam

@@ -0,0 +1,18 @@
+opam-version: "1.2"
+name: "angstrom-lwt-unix"
+maintainer: "Spiros Eliopoulos <spiros@inhabitedtype.com>"
+authors: [ "Spiros Eliopoulos <spiros@inhabitedtype.com>" ]
+license: "BSD-3-clause"
+homepage: "https://github.com/inhabitedtype/angstrom"
+bug-reports: "https://github.com/inhabitedtype/angstrom/issues"
+dev-repo: "https://github.com/inhabitedtype/angstrom.git"
+build: [
+  ["jbuilder" "build" "--only-packages" "angstrom-lwt-unix" "--root" "."
+   "-j" jobs "@install"]
+]
+depends: [
+  "angstrom"
+  "lwt"
+  "base-unix"
+]
+available: [ ocaml-version >= "4.01.0" ]

+ 3 - 20
opam/opam → angstrom-unix.opam

@@ -1,5 +1,5 @@
 opam-version: "1.2"
-name: "angstrom"
+name: "angstrom-unix"
 maintainer: "Spiros Eliopoulos <spiros@inhabitedtype.com>"
 authors: [ "Spiros Eliopoulos <spiros@inhabitedtype.com>" ]
 license: "BSD-3-clause"
@@ -13,25 +13,8 @@ build: [
     "--%{async:enable}%-async"]
   ["ocaml" "setup.ml" "-build"]
 ]
-install: ["ocaml" "setup.ml" "-install"]
-remove: [
-  ["ocamlfind" "remove" "angstrom"]
-]
-build-test: [
-  ["ocaml" "setup.ml" "-configure" "--enable-tests"]
-  ["ocaml" "setup.ml" "-build"]
-  ["ocaml" "setup.ml" "-test"]
-]
 depends: [
-  "alcotest" {test & >= "0.4.1" & < "0.8.0"}
-  "cstruct" {>= "0.7.0"}
-  "ocplib-endian" {>= "0.6"}
-  "ocamlfind" {build}
-  "result"
-]
-depopts: [
-  "async"
+  "angstrom"
   "base-unix"
-  "lwt"
 ]
-available: [ ocaml-version >= "4.03.0" ]
+available: [ ocaml-version >= "4.03.0" ]

+ 20 - 0
angstrom.opam

@@ -0,0 +1,20 @@
+opam-version: "1.2"
+name: "angstrom"
+maintainer: "Spiros Eliopoulos <spiros@inhabitedtype.com>"
+authors: [ "Spiros Eliopoulos <spiros@inhabitedtype.com>" ]
+license: "BSD-3-clause"
+homepage: "https://github.com/inhabitedtype/angstrom"
+bug-reports: "https://github.com/inhabitedtype/angstrom/issues"
+dev-repo: "https://github.com/inhabitedtype/angstrom.git"
+build: [
+  ["jbuilder" "build" "--only-packages" "angstrom" "--root" "."
+   "-j" jobs "@install"]
+]
+depends: [
+  "jbuilder" {build}
+  "alcotest" {test & >= "0.4.1"}
+  "cstruct" {>= "0.7.0"}
+  "ocplib-endian" {>= "0.6"}
+  "result"
+]
+available: [ ocaml-version >= "4.01.0" ]

+ 0 - 4
async/angstrom_async.mldylib

@@ -1,4 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 36325cdae20e2c570e95ebbc4cd636c3)
-Angstrom_async
-# OASIS_STOP

+ 0 - 4
async/angstrom_async.mllib

@@ -1,4 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 36325cdae20e2c570e95ebbc4cd636c3)
-Angstrom_async
-# OASIS_STOP

+ 5 - 0
async/jbuild

@@ -0,0 +1,5 @@
+(library
+ ((name angstrom_async)
+  (public_name angstrom.async)
+  (wrapped false)
+  (libraries (angstrom async))))

+ 26 - 0
benchmarks/jbuild

@@ -0,0 +1,26 @@
+(library
+ ((name RFC7159)
+  (wrapped false)
+  (modules RFC7159)
+  (libraries (angstrom))))
+
+(library
+ ((name RFC2616)
+  (wrapped false)
+  (modules RFC2616)
+  (libraries (angstrom))))
+
+(executables
+ ((libraries (angstrom core_bench threads))
+  (modules (pure_benchmark))
+  (names (pure_benchmark))))
+
+(executables
+ ((libraries (angstrom.async RFC2616 RFC7159))
+  (modules (async_benchmark))
+  (names (async_benchmark))))
+
+(executables
+ ((libraries (angstrom.lwt-unix RFC2616 RFC7159))
+  (modules (lwt_benchmark))
+  (names (lwt_benchmark))))

+ 0 - 27
configure

@@ -1,27 +0,0 @@
-#!/bin/sh
-
-# OASIS_START
-# DO NOT EDIT (digest: dc86c2ad450f91ca10c931b6045d0499)
-set -e
-
-FST=true
-for i in "$@"; do
-  if $FST; then
-    set --
-    FST=false
-  fi
-
-  case $i in
-    --*=*)
-      ARG=${i%%=*}
-      VAL=${i##*=}
-      set -- "$@" "$ARG" "$VAL"
-      ;;
-    *)
-      set -- "$@" "$i"
-      ;;
-  esac
-done
-
-ocaml setup.ml -configure "$@"
-# OASIS_STOP

+ 1 - 0
jbuild

@@ -0,0 +1 @@
+(jbuild_version 1)

+ 0 - 44
lib/META

@@ -1,44 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 57c96af16cb4b5f9180a6e9c61e4d7ea)
-version = "dev"
-description = "Parser combinators built for speed and memory-efficiency"
-requires = "cstruct ocplib-endian result"
-archive(byte) = "angstrom.cma"
-archive(byte, plugin) = "angstrom.cma"
-archive(native) = "angstrom.cmxa"
-archive(native, plugin) = "angstrom.cmxs"
-exists_if = "angstrom.cma"
-package "unix" (
- version = "dev"
- description = "Parser combinators built for speed and memory-efficiency"
- requires = "angstrom result"
- archive(byte) = "angstrom_unix.cma"
- archive(byte, plugin) = "angstrom_unix.cma"
- archive(native) = "angstrom_unix.cmxa"
- archive(native, plugin) = "angstrom_unix.cmxs"
- exists_if = "angstrom_unix.cma"
-)
-
-package "lwt-unix" (
- version = "dev"
- description = "Parser combinators built for speed and memory-efficiency"
- requires = "angstrom lwt.unix result"
- archive(byte) = "angstrom_lwt_unix.cma"
- archive(byte, plugin) = "angstrom_lwt_unix.cma"
- archive(native) = "angstrom_lwt_unix.cmxa"
- archive(native, plugin) = "angstrom_lwt_unix.cmxs"
- exists_if = "angstrom_lwt_unix.cma"
-)
-
-package "async" (
- version = "dev"
- description = "Parser combinators built for speed and memory-efficiency"
- requires = "angstrom async result threads"
- archive(byte) = "angstrom_async.cma"
- archive(byte, plugin) = "angstrom_async.cma"
- archive(native) = "angstrom_async.cmxa"
- archive(native, plugin) = "angstrom_async.cmxs"
- exists_if = "angstrom_async.cma"
-)
-# OASIS_STOP
-

+ 0 - 4
lib/angstrom.mldylib

@@ -1,4 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 101b1bc4549b55eff7cd72a37bf05289)
-Angstrom
-# OASIS_STOP

+ 0 - 4
lib/angstrom.mllib

@@ -1,4 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 101b1bc4549b55eff7cd72a37bf05289)
-Angstrom
-# OASIS_STOP

+ 5 - 0
lib/jbuild

@@ -0,0 +1,5 @@
+(library
+ ((name angstrom)
+  (public_name angstrom)
+  (wrapped false)
+  (libraries (cstruct ocplib-endian result))))

+ 9 - 0
lib_test/jbuild

@@ -0,0 +1,9 @@
+(executables
+ ((libraries (alcotest angstrom))
+  (modules (test_angstrom))
+  (names (test_angstrom))))
+
+(alias
+ ((name   runtest)
+  (deps   (test_angstrom.exe))
+  (action (run ${<}))))

+ 0 - 4
lwt/angstrom_lwt_unix.mldylib

@@ -1,4 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 370490b6d2c41d0869fc54dbed054b4e)
-Angstrom_lwt_unix
-# OASIS_STOP

+ 0 - 4
lwt/angstrom_lwt_unix.mllib

@@ -1,4 +0,0 @@
-# OASIS_START
-# DO NOT EDIT (digest: 370490b6d2c41d0869fc54dbed054b4e)
-Angstrom_lwt_unix
-# OASIS_STOP

+ 5 - 0
lwt/jbuild

@@ -0,0 +1,5 @@
+(library
+ ((name angstrom_lwt_unix)
+  (public_name angstrom.lwt-unix)
+  (wrapped false)
+  (libraries (angstrom lwt.unix))))

+ 0 - 914
myocamlbuild.ml

@@ -1,914 +0,0 @@
-(* OASIS_START *)
-(* DO NOT EDIT (digest: 624314ded12ead90ce94031570cabb94) *)
-module OASISGettext = struct
-(* # 22 "src/oasis/OASISGettext.ml" *)
-
-
-  let ns_ str = str
-  let s_ str = str
-  let f_ (str: ('a, 'b, 'c, 'd) format4) = str
-
-
-  let fn_ fmt1 fmt2 n =
-    if n = 1 then
-      fmt1^^""
-    else
-      fmt2^^""
-
-
-  let init = []
-end
-
-module OASISString = struct
-(* # 22 "src/oasis/OASISString.ml" *)
-
-
-  (** Various string utilities.
-
-      Mostly inspired by extlib and batteries ExtString and BatString libraries.
-
-      @author Sylvain Le Gall
-  *)
-
-
-  let nsplitf str f =
-    if str = "" then
-      []
-    else
-      let buf = Buffer.create 13 in
-      let lst = ref [] in
-      let push () =
-        lst := Buffer.contents buf :: !lst;
-        Buffer.clear buf
-      in
-      let str_len = String.length str in
-      for i = 0 to str_len - 1 do
-        if f str.[i] then
-          push ()
-        else
-          Buffer.add_char buf str.[i]
-      done;
-      push ();
-      List.rev !lst
-
-
-  (** [nsplit c s] Split the string [s] at char [c]. It doesn't include the
-      separator.
-  *)
-  let nsplit str c =
-    nsplitf str ((=) c)
-
-
-  let find ~what ?(offset=0) str =
-    let what_idx = ref 0 in
-    let str_idx = ref offset in
-    while !str_idx < String.length str &&
-          !what_idx < String.length what do
-      if str.[!str_idx] = what.[!what_idx] then
-        incr what_idx
-      else
-        what_idx := 0;
-      incr str_idx
-    done;
-    if !what_idx <> String.length what then
-      raise Not_found
-    else
-      !str_idx - !what_idx
-
-
-  let sub_start str len =
-    let str_len = String.length str in
-    if len >= str_len then
-      ""
-    else
-      String.sub str len (str_len - len)
-
-
-  let sub_end ?(offset=0) str len =
-    let str_len = String.length str in
-    if len >= str_len then
-      ""
-    else
-      String.sub str 0 (str_len - len)
-
-
-  let starts_with ~what ?(offset=0) str =
-    let what_idx = ref 0 in
-    let str_idx = ref offset in
-    let ok = ref true in
-    while !ok &&
-          !str_idx < String.length str &&
-          !what_idx < String.length what do
-      if str.[!str_idx] = what.[!what_idx] then
-        incr what_idx
-      else
-        ok := false;
-      incr str_idx
-    done;
-    if !what_idx = String.length what then
-      true
-    else
-      false
-
-
-  let strip_starts_with ~what str =
-    if starts_with ~what str then
-      sub_start str (String.length what)
-    else
-      raise Not_found
-
-
-  let ends_with ~what ?(offset=0) str =
-    let what_idx = ref ((String.length what) - 1) in
-    let str_idx = ref ((String.length str) - 1) in
-    let ok = ref true in
-    while !ok &&
-          offset <= !str_idx &&
-          0 <= !what_idx do
-      if str.[!str_idx] = what.[!what_idx] then
-        decr what_idx
-      else
-        ok := false;
-      decr str_idx
-    done;
-    if !what_idx = -1 then
-      true
-    else
-      false
-
-
-  let strip_ends_with ~what str =
-    if ends_with ~what str then
-      sub_end str (String.length what)
-    else
-      raise Not_found
-
-
-  let replace_chars f s =
-    let buf = Buffer.create (String.length s) in
-    String.iter (fun c -> Buffer.add_char buf (f c)) s;
-    Buffer.contents buf
-
-  let lowercase_ascii =
-    replace_chars
-      (fun c ->
-         if (c >= 'A' && c <= 'Z') then
-           Char.chr (Char.code c + 32)
-         else
-           c)
-
-  let uncapitalize_ascii s =
-    if s <> "" then
-      (lowercase_ascii (String.sub s 0 1)) ^ (String.sub s 1 ((String.length s) - 1))
-    else
-      s
-
-  let uppercase_ascii =
-    replace_chars
-      (fun c ->
-         if (c >= 'a' && c <= 'z') then
-           Char.chr (Char.code c - 32)
-         else
-           c)
-
-  let capitalize_ascii s =
-    if s <> "" then
-      (uppercase_ascii (String.sub s 0 1)) ^ (String.sub s 1 ((String.length s) - 1))
-    else
-      s
-
-end
-
-module OASISUtils = struct
-(* # 22 "src/oasis/OASISUtils.ml" *)
-
-
-  open OASISGettext
-
-
-  module MapExt =
-  struct
-    module type S =
-    sig
-      include Map.S
-      val add_list: 'a t -> (key * 'a) list -> 'a t
-      val of_list: (key * 'a) list -> 'a t
-      val to_list: 'a t -> (key * 'a) list
-    end
-
-    module Make (Ord: Map.OrderedType) =
-    struct
-      include Map.Make(Ord)
-
-      let rec add_list t =
-        function
-          | (k, v) :: tl -> add_list (add k v t) tl
-          | [] -> t
-
-      let of_list lst = add_list empty lst
-
-      let to_list t = fold (fun k v acc -> (k, v) :: acc) t []
-    end
-  end
-
-
-  module MapString = MapExt.Make(String)
-
-
-  module SetExt  =
-  struct
-    module type S =
-    sig
-      include Set.S
-      val add_list: t -> elt list -> t
-      val of_list: elt list -> t
-      val to_list: t -> elt list
-    end
-
-    module Make (Ord: Set.OrderedType) =
-    struct
-      include Set.Make(Ord)
-
-      let rec add_list t =
-        function
-          | e :: tl -> add_list (add e t) tl
-          | [] -> t
-
-      let of_list lst = add_list empty lst
-
-      let to_list = elements
-    end
-  end
-
-
-  module SetString = SetExt.Make(String)
-
-
-  let compare_csl s1 s2 =
-    String.compare (OASISString.lowercase_ascii s1) (OASISString.lowercase_ascii s2)
-
-
-  module HashStringCsl =
-    Hashtbl.Make
-      (struct
-         type t = string
-         let equal s1 s2 = (compare_csl s1 s2) = 0
-         let hash s = Hashtbl.hash (OASISString.lowercase_ascii s)
-       end)
-
-  module SetStringCsl =
-    SetExt.Make
-      (struct
-         type t = string
-         let compare = compare_csl
-       end)
-
-
-  let varname_of_string ?(hyphen='_') s =
-    if String.length s = 0 then
-      begin
-        invalid_arg "varname_of_string"
-      end
-    else
-      begin
-        let buf =
-          OASISString.replace_chars
-            (fun c ->
-               if ('a' <= c && c <= 'z')
-                 ||
-                  ('A' <= c && c <= 'Z')
-                 ||
-                  ('0' <= c && c <= '9') then
-                 c
-               else
-                 hyphen)
-            s;
-        in
-        let buf =
-          (* Start with a _ if digit *)
-          if '0' <= s.[0] && s.[0] <= '9' then
-            "_"^buf
-          else
-            buf
-        in
-          OASISString.lowercase_ascii buf
-      end
-
-
-  let varname_concat ?(hyphen='_') p s =
-    let what = String.make 1 hyphen in
-    let p =
-      try
-        OASISString.strip_ends_with ~what p
-      with Not_found ->
-        p
-    in
-    let s =
-      try
-        OASISString.strip_starts_with ~what s
-      with Not_found ->
-        s
-    in
-      p^what^s
-
-
-  let is_varname str =
-    str = varname_of_string str
-
-
-  let failwithf fmt = Printf.ksprintf failwith fmt
-
-
-  let rec file_location ?pos1 ?pos2 ?lexbuf () =
-      match pos1, pos2, lexbuf with
-      | Some p, None, _ | None, Some p, _ ->
-        file_location ~pos1:p ~pos2:p ?lexbuf ()
-      | Some p1, Some p2, _ ->
-        let open Lexing in
-        let fn, lineno = p1.pos_fname, p1.pos_lnum in
-        let c1 = p1.pos_cnum - p1.pos_bol in
-        let c2 = c1 + (p2.pos_cnum - p1.pos_cnum) in
-        Printf.sprintf (f_ "file %S, line %d, characters %d-%d")  fn lineno c1 c2
-      | _, _, Some lexbuf ->
-        file_location
-          ~pos1:(Lexing.lexeme_start_p lexbuf)
-          ~pos2:(Lexing.lexeme_end_p lexbuf)
-          ()
-      | None, None, None ->
-        s_ "<position undefined>"
-
-
-  let failwithpf ?pos1 ?pos2 ?lexbuf fmt =
-    let loc = file_location ?pos1 ?pos2 ?lexbuf () in
-    Printf.ksprintf (fun s -> failwith (Printf.sprintf "%s: %s" loc s)) fmt
-
-
-end
-
-module OASISExpr = struct
-(* # 22 "src/oasis/OASISExpr.ml" *)
-
-
-  open OASISGettext
-  open OASISUtils
-
-
-  type test = string
-  type flag = string
-
-
-  type t =
-    | EBool of bool
-    | ENot of t
-    | EAnd of t * t
-    | EOr of t * t
-    | EFlag of flag
-    | ETest of test * string
-
-
-  type 'a choices = (t * 'a) list
-
-
-  let eval var_get t =
-    let rec eval' =
-      function
-        | EBool b ->
-            b
-
-        | ENot e ->
-            not (eval' e)
-
-        | EAnd (e1, e2) ->
-            (eval' e1) && (eval' e2)
-
-        | EOr (e1, e2) ->
-            (eval' e1) || (eval' e2)
-
-        | EFlag nm ->
-            let v =
-              var_get nm
-            in
-              assert(v = "true" || v = "false");
-              (v = "true")
-
-        | ETest (nm, vl) ->
-            let v =
-              var_get nm
-            in
-              (v = vl)
-    in
-      eval' t
-
-
-  let choose ?printer ?name var_get lst =
-    let rec choose_aux =
-      function
-        | (cond, vl) :: tl ->
-            if eval var_get cond then
-              vl
-            else
-              choose_aux tl
-        | [] ->
-            let str_lst =
-              if lst = [] then
-                s_ "<empty>"
-              else
-                String.concat
-                  (s_ ", ")
-                  (List.map
-                     (fun (cond, vl) ->
-                        match printer with
-                          | Some p -> p vl
-                          | None -> s_ "<no printer>")
-                     lst)
-            in
-              match name with
-                | Some nm ->
-                    failwith
-                      (Printf.sprintf
-                         (f_ "No result for the choice list '%s': %s")
-                         nm str_lst)
-                | None ->
-                    failwith
-                      (Printf.sprintf
-                         (f_ "No result for a choice list: %s")
-                         str_lst)
-    in
-      choose_aux (List.rev lst)
-
-
-end
-
-
-# 443 "myocamlbuild.ml"
-module BaseEnvLight = struct
-(* # 22 "src/base/BaseEnvLight.ml" *)
-
-
-  module MapString = Map.Make(String)
-
-
-  type t = string MapString.t
-
-
-  let default_filename = Filename.concat (Sys.getcwd ()) "setup.data"
-
-
-  let load ?(allow_empty=false) ?(filename=default_filename) ?stream () =
-    let line = ref 1 in
-    let lexer st =
-      let st_line =
-        Stream.from
-          (fun _ ->
-             try
-               match Stream.next st with
-               | '\n' -> incr line; Some '\n'
-               | c -> Some c
-             with Stream.Failure -> None)
-      in
-      Genlex.make_lexer ["="] st_line
-    in
-    let rec read_file lxr mp =
-      match Stream.npeek 3 lxr with
-      | [Genlex.Ident nm; Genlex.Kwd "="; Genlex.String value] ->
-        Stream.junk lxr; Stream.junk lxr; Stream.junk lxr;
-        read_file lxr (MapString.add nm value mp)
-      | [] -> mp
-      | _ ->
-        failwith
-          (Printf.sprintf "Malformed data file '%s' line %d" filename !line)
-    in
-    match stream with
-    | Some st -> read_file (lexer st) MapString.empty
-    | None ->
-      if Sys.file_exists filename then begin
-        let chn = open_in_bin filename in
-        let st = Stream.of_channel chn in
-        try
-          let mp = read_file (lexer st) MapString.empty in
-          close_in chn; mp
-        with e ->
-          close_in chn; raise e
-      end else if allow_empty then begin
-        MapString.empty
-      end else begin
-        failwith
-          (Printf.sprintf
-             "Unable to load environment, the file '%s' doesn't exist."
-             filename)
-      end
-
-  let rec var_expand str env =
-    let buff = Buffer.create ((String.length str) * 2) in
-    Buffer.add_substitute
-      buff
-      (fun var ->
-         try
-           var_expand (MapString.find var env) env
-         with Not_found ->
-           failwith
-             (Printf.sprintf
-                "No variable %s defined when trying to expand %S."
-                var
-                str))
-      str;
-    Buffer.contents buff
-
-
-  let var_get name env = var_expand (MapString.find name env) env
-  let var_choose lst env = OASISExpr.choose (fun nm -> var_get nm env) lst
-end
-
-
-# 523 "myocamlbuild.ml"
-module MyOCamlbuildFindlib = struct
-(* # 22 "src/plugins/ocamlbuild/MyOCamlbuildFindlib.ml" *)
-
-
-  (** OCamlbuild extension, copied from
-    * https://ocaml.org/learn/tutorials/ocamlbuild/Using_ocamlfind_with_ocamlbuild.html
-    * by N. Pouillard and others
-    *
-    * Updated on 2016-06-02
-    *
-    * Modified by Sylvain Le Gall
-  *)
-  open Ocamlbuild_plugin
-
-
-  type conf = {no_automatic_syntax: bool}
-
-
-  let run_and_read = Ocamlbuild_pack.My_unix.run_and_read
-
-
-  let blank_sep_strings = Ocamlbuild_pack.Lexers.blank_sep_strings
-
-
-  let exec_from_conf exec =
-    let exec =
-      let env = BaseEnvLight.load ~allow_empty:true () in
-      try
-        BaseEnvLight.var_get exec env
-      with Not_found ->
-        Printf.eprintf "W: Cannot get variable %s\n" exec;
-        exec
-    in
-    let fix_win32 str =
-      if Sys.os_type = "Win32" then begin
-        let buff = Buffer.create (String.length str) in
-        (* Adapt for windowsi, ocamlbuild + win32 has a hard time to handle '\\'.
-        *)
-        String.iter
-          (fun c -> Buffer.add_char buff (if c = '\\' then '/' else c))
-          str;
-        Buffer.contents buff
-      end else begin
-        str
-      end
-    in
-    fix_win32 exec
-
-
-  let split s ch =
-    let buf = Buffer.create 13 in
-    let x = ref [] in
-    let flush () =
-      x := (Buffer.contents buf) :: !x;
-      Buffer.clear buf
-    in
-    String.iter
-      (fun c ->
-         if c = ch then
-           flush ()
-         else
-           Buffer.add_char buf c)
-      s;
-    flush ();
-    List.rev !x
-
-
-  let split_nl s = split s '\n'
-
-
-  let before_space s =
-    try
-      String.before s (String.index s ' ')
-    with Not_found -> s
-
-  (* ocamlfind command *)
-  let ocamlfind x = S[Sh (exec_from_conf "ocamlfind"); x]
-
-  (* This lists all supported packages. *)
-  let find_packages () =
-    List.map before_space (split_nl & run_and_read (exec_from_conf "ocamlfind" ^ " list"))
-
-
-  (* Mock to list available syntaxes. *)
-  let find_syntaxes () = ["camlp4o"; "camlp4r"]
-
-
-  let well_known_syntax = [
-    "camlp4.quotations.o";
-    "camlp4.quotations.r";
-    "camlp4.exceptiontracer";
-    "camlp4.extend";
-    "camlp4.foldgenerator";
-    "camlp4.listcomprehension";
-    "camlp4.locationstripper";
-    "camlp4.macro";
-    "camlp4.mapgenerator";
-    "camlp4.metagenerator";
-    "camlp4.profiler";
-    "camlp4.tracer"
-  ]
-
-
-  let dispatch conf =
-    function
-      | After_options ->
-        (* By using Before_options one let command line options have an higher
-         * priority on the contrary using After_options will guarantee to have
-         * the higher priority override default commands by ocamlfind ones *)
-        Options.ocamlc     := ocamlfind & A"ocamlc";
-        Options.ocamlopt   := ocamlfind & A"ocamlopt";
-        Options.ocamldep   := ocamlfind & A"ocamldep";
-        Options.ocamldoc   := ocamlfind & A"ocamldoc";
-        Options.ocamlmktop := ocamlfind & A"ocamlmktop";
-        Options.ocamlmklib := ocamlfind & A"ocamlmklib"
-
-      | After_rules ->
-
-        (* Avoid warnings for unused tag *)
-        flag ["tests"] N;
-
-        (* When one link an OCaml library/binary/package, one should use
-         * -linkpkg *)
-        flag ["ocaml"; "link"; "program"] & A"-linkpkg";
-
-        (* For each ocamlfind package one inject the -package option when
-         * compiling, computing dependencies, generating documentation and
-         * linking. *)
-        List.iter
-          begin fun pkg ->
-            let base_args = [A"-package"; A pkg] in
-            (* TODO: consider how to really choose camlp4o or camlp4r. *)
-            let syn_args = [A"-syntax"; A "camlp4o"] in
-            let (args, pargs) =
-              (* Heuristic to identify syntax extensions: whether they end in
-                 ".syntax"; some might not.
-              *)
-              if not (conf.no_automatic_syntax) &&
-                 (Filename.check_suffix pkg "syntax" ||
-                  List.mem pkg well_known_syntax) then
-                (syn_args @ base_args, syn_args)
-              else
-                (base_args, [])
-            in
-            flag ["ocaml"; "compile";  "pkg_"^pkg] & S args;
-            flag ["ocaml"; "ocamldep"; "pkg_"^pkg] & S args;
-            flag ["ocaml"; "doc";      "pkg_"^pkg] & S args;
-            flag ["ocaml"; "link";     "pkg_"^pkg] & S base_args;
-            flag ["ocaml"; "infer_interface"; "pkg_"^pkg] & S args;
-
-            (* TODO: Check if this is allowed for OCaml < 3.12.1 *)
-            flag ["ocaml"; "compile";  "package("^pkg^")"] & S pargs;
-            flag ["ocaml"; "ocamldep"; "package("^pkg^")"] & S pargs;
-            flag ["ocaml"; "doc";      "package("^pkg^")"] & S pargs;
-            flag ["ocaml"; "infer_interface"; "package("^pkg^")"] & S pargs;
-          end
-          (find_packages ());
-
-        (* Like -package but for extensions syntax. Morover -syntax is useless
-         * when linking. *)
-        List.iter begin fun syntax ->
-          flag ["ocaml"; "compile";  "syntax_"^syntax] & S[A"-syntax"; A syntax];
-          flag ["ocaml"; "ocamldep"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
-          flag ["ocaml"; "doc";      "syntax_"^syntax] & S[A"-syntax"; A syntax];
-          flag ["ocaml"; "infer_interface"; "syntax_"^syntax] &
-          S[A"-syntax"; A syntax];
-        end (find_syntaxes ());
-
-        (* The default "thread" tag is not compatible with ocamlfind.
-         * Indeed, the default rules add the "threads.cma" or "threads.cmxa"
-         * options when using this tag. When using the "-linkpkg" option with
-         * ocamlfind, this module will then be added twice on the command line.
-         *
-         * To solve this, one approach is to add the "-thread" option when using
-         * the "threads" package using the previous plugin.
-        *)
-        flag ["ocaml"; "pkg_threads"; "compile"] (S[A "-thread"]);
-        flag ["ocaml"; "pkg_threads"; "doc"] (S[A "-I"; A "+threads"]);
-        flag ["ocaml"; "pkg_threads"; "link"] (S[A "-thread"]);
-        flag ["ocaml"; "pkg_threads"; "infer_interface"] (S[A "-thread"]);
-        flag ["c"; "pkg_threads"; "compile"] (S[A "-thread"]);
-        flag ["ocaml"; "package(threads)"; "compile"] (S[A "-thread"]);
-        flag ["ocaml"; "package(threads)"; "doc"] (S[A "-I"; A "+threads"]);
-        flag ["ocaml"; "package(threads)"; "link"] (S[A "-thread"]);
-        flag ["ocaml"; "package(threads)"; "infer_interface"] (S[A "-thread"]);
-        flag ["c"; "package(threads)"; "compile"] (S[A "-thread"]);
-
-      | _ ->
-        ()
-end
-
-module MyOCamlbuildBase = struct
-(* # 22 "src/plugins/ocamlbuild/MyOCamlbuildBase.ml" *)
-
-
-  (** Base functions for writing myocamlbuild.ml
-      @author Sylvain Le Gall
-    *)
-
-
-  open Ocamlbuild_plugin
-  module OC = Ocamlbuild_pack.Ocaml_compiler
-
-
-  type dir = string
-  type file = string
-  type name = string
-  type tag = string
-
-
-  type t =
-      {
-        lib_ocaml: (name * dir list * string list) list;
-        lib_c:     (name * dir * file list) list;
-        flags:     (tag list * (spec OASISExpr.choices)) list;
-        (* Replace the 'dir: include' from _tags by a precise interdepends in
-         * directory.
-         *)
-        includes:  (dir * dir list) list;
-      }
-
-
-(* # 110 "src/plugins/ocamlbuild/MyOCamlbuildBase.ml" *)
-
-
-  let env_filename = Pathname.basename BaseEnvLight.default_filename
-
-
-  let dispatch_combine lst =
-    fun e ->
-      List.iter
-        (fun dispatch -> dispatch e)
-        lst
-
-
-  let tag_libstubs nm =
-    "use_lib"^nm^"_stubs"
-
-
-  let nm_libstubs nm =
-    nm^"_stubs"
-
-
-  let dispatch t e =
-    let env = BaseEnvLight.load ~allow_empty:true () in
-      match e with
-        | Before_options ->
-            let no_trailing_dot s =
-              if String.length s >= 1 && s.[0] = '.' then
-                String.sub s 1 ((String.length s) - 1)
-              else
-                s
-            in
-              List.iter
-                (fun (opt, var) ->
-                   try
-                     opt := no_trailing_dot (BaseEnvLight.var_get var env)
-                   with Not_found ->
-                     Printf.eprintf "W: Cannot get variable %s\n" var)
-                [
-                  Options.ext_obj, "ext_obj";
-                  Options.ext_lib, "ext_lib";
-                  Options.ext_dll, "ext_dll";
-                ]
-
-        | After_rules ->
-            (* Declare OCaml libraries *)
-            List.iter
-              (function
-                 | nm, [], intf_modules ->
-                     ocaml_lib nm;
-                     let cmis =
-                       List.map (fun m -> (OASISString.uncapitalize_ascii m) ^ ".cmi")
-                                intf_modules in
-                     dep ["ocaml"; "link"; "library"; "file:"^nm^".cma"] cmis
-                 | nm, dir :: tl, intf_modules ->
-                     ocaml_lib ~dir:dir (dir^"/"^nm);
-                     List.iter
-                       (fun dir ->
-                          List.iter
-                            (fun str ->
-                               flag ["ocaml"; "use_"^nm; str] (S[A"-I"; P dir]))
-                            ["compile"; "infer_interface"; "doc"])
-                       tl;
-                     let cmis =
-                       List.map (fun m -> dir^"/"^(OASISString.uncapitalize_ascii m)^".cmi")
-                                intf_modules in
-                     dep ["ocaml"; "link"; "library"; "file:"^dir^"/"^nm^".cma"]
-                         cmis)
-              t.lib_ocaml;
-
-            (* Declare directories dependencies, replace "include" in _tags. *)
-            List.iter
-              (fun (dir, include_dirs) ->
-                 Pathname.define_context dir include_dirs)
-              t.includes;
-
-            (* Declare C libraries *)
-            List.iter
-              (fun (lib, dir, headers) ->
-                   (* Handle C part of library *)
-                   flag ["link"; "library"; "ocaml"; "byte"; tag_libstubs lib]
-                     (S[A"-dllib"; A("-l"^(nm_libstubs lib)); A"-cclib";
-                        A("-l"^(nm_libstubs lib))]);
-
-                   flag ["link"; "library"; "ocaml"; "native"; tag_libstubs lib]
-                     (S[A"-cclib"; A("-l"^(nm_libstubs lib))]);
-
-                   if bool_of_string (BaseEnvLight.var_get "native_dynlink" env) then
-                     flag ["link"; "program"; "ocaml"; "byte"; tag_libstubs lib]
-                         (S[A"-dllib"; A("dll"^(nm_libstubs lib))]);
-
-                   (* When ocaml link something that use the C library, then one
-                      need that file to be up to date.
-                      This holds both for programs and for libraries.
-                    *)
-                   dep ["link"; "ocaml"; tag_libstubs lib]
-                     [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
-
-                   dep  ["compile"; "ocaml"; tag_libstubs lib]
-                     [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
-
-                   (* TODO: be more specific about what depends on headers *)
-                   (* Depends on .h files *)
-                   dep ["compile"; "c"]
-                     headers;
-
-                   (* Setup search path for lib *)
-                   flag ["link"; "ocaml"; "use_"^lib]
-                     (S[A"-I"; P(dir)]);
-              )
-              t.lib_c;
-
-              (* Add flags *)
-              List.iter
-              (fun (tags, cond_specs) ->
-                 let spec = BaseEnvLight.var_choose cond_specs env in
-                 let rec eval_specs =
-                   function
-                     | S lst -> S (List.map eval_specs lst)
-                     | A str -> A (BaseEnvLight.var_expand str env)
-                     | spec -> spec
-                 in
-                   flag tags & (eval_specs spec))
-              t.flags
-        | _ ->
-            ()
-
-
-  let dispatch_default conf t =
-    dispatch_combine
-      [
-        dispatch t;
-        MyOCamlbuildFindlib.dispatch conf;
-      ]
-
-
-end
-
-
-# 884 "myocamlbuild.ml"
-open Ocamlbuild_plugin;;
-let package_default =
-  {
-     MyOCamlbuildBase.lib_ocaml =
-       [
-          ("angstrom", ["lib"], []);
-          ("angstrom_unix", ["unix"], []);
-          ("angstrom_lwt_unix", ["lwt"], []);
-          ("angstrom_async", ["async"], [])
-       ];
-     lib_c = [];
-     flags = [];
-     includes =
-       [
-          ("unix", ["lib"]);
-          ("lwt", ["lib"]);
-          ("lib_test", ["lib"]);
-          ("benchmarks", ["async"; "lib"; "lwt"]);
-          ("async", ["lib"])
-       ]
-  }
-  ;;
-
-let conf = {MyOCamlbuildFindlib.no_automatic_syntax = false}
-
-let dispatch_default = MyOCamlbuildBase.dispatch_default conf package_default;;
-
-# 913 "myocamlbuild.ml"
-(* OASIS_STOP *)
-Ocamlbuild_plugin.dispatch dispatch_default;;

+ 0 - 9
opam/descr

@@ -1,9 +0,0 @@
-Parser combinators built for speed and memory-efficiency
-
-Angstrom is a parser-combinator library that makes it easy to write efficient,
-expressive, and reusable parsers suitable for high-performance applications. It
-exposes monadic and applicative interfaces for composition, and supports
-incremental input through buffered and unbuffered interfaces. Both interfaces
-give the user total control over the blocking behavior of their application,
-with the unbuffered interface enabling zero-copy IO. Parsers are backtracking
-by default and support unbounded lookahead.

+ 0 - 1
opam/findlib

@@ -1 +0,0 @@
-angstrom

+ 0 - 8427
setup.ml

@@ -1,8427 +0,0 @@
-(* setup.ml generated for the first time by OASIS v0.4.5 *)
-
-(* OASIS_START *)
-(* DO NOT EDIT (digest: 928bdedd5db6db56b7873d5e43d253cb) *)
-(*
-   Regenerated by OASIS v0.4.8
-   Visit http://oasis.forge.ocamlcore.org for more information and
-   documentation about functions used in this file.
-*)
-module OASISGettext = struct
-(* # 22 "src/oasis/OASISGettext.ml" *)
-
-
-  let ns_ str = str
-  let s_ str = str
-  let f_ (str: ('a, 'b, 'c, 'd) format4) = str
-
-
-  let fn_ fmt1 fmt2 n =
-    if n = 1 then
-      fmt1^^""
-    else
-      fmt2^^""
-
-
-  let init = []
-end
-
-module OASISString = struct
-(* # 22 "src/oasis/OASISString.ml" *)
-
-
-  (** Various string utilities.
-
-      Mostly inspired by extlib and batteries ExtString and BatString libraries.
-
-      @author Sylvain Le Gall
-  *)
-
-
-  let nsplitf str f =
-    if str = "" then
-      []
-    else
-      let buf = Buffer.create 13 in
-      let lst = ref [] in
-      let push () =
-        lst := Buffer.contents buf :: !lst;
-        Buffer.clear buf
-      in
-      let str_len = String.length str in
-      for i = 0 to str_len - 1 do
-        if f str.[i] then
-          push ()
-        else
-          Buffer.add_char buf str.[i]
-      done;
-      push ();
-      List.rev !lst
-
-
-  (** [nsplit c s] Split the string [s] at char [c]. It doesn't include the
-      separator.
-  *)
-  let nsplit str c =
-    nsplitf str ((=) c)
-
-
-  let find ~what ?(offset=0) str =
-    let what_idx = ref 0 in
-    let str_idx = ref offset in
-    while !str_idx < String.length str &&
-          !what_idx < String.length what do
-      if str.[!str_idx] = what.[!what_idx] then
-        incr what_idx
-      else
-        what_idx := 0;
-      incr str_idx
-    done;
-    if !what_idx <> String.length what then
-      raise Not_found
-    else
-      !str_idx - !what_idx
-
-
-  let sub_start str len =
-    let str_len = String.length str in
-    if len >= str_len then
-      ""
-    else
-      String.sub str len (str_len - len)
-
-
-  let sub_end ?(offset=0) str len =
-    let str_len = String.length str in
-    if len >= str_len then
-      ""
-    else
-      String.sub str 0 (str_len - len)
-
-
-  let starts_with ~what ?(offset=0) str =
-    let what_idx = ref 0 in
-    let str_idx = ref offset in
-    let ok = ref true in
-    while !ok &&
-          !str_idx < String.length str &&
-          !what_idx < String.length what do
-      if str.[!str_idx] = what.[!what_idx] then
-        incr what_idx
-      else
-        ok := false;
-      incr str_idx
-    done;
-    if !what_idx = String.length what then
-      true
-    else
-      false
-
-
-  let strip_starts_with ~what str =
-    if starts_with ~what str then
-      sub_start str (String.length what)
-    else
-      raise Not_found
-
-
-  let ends_with ~what ?(offset=0) str =
-    let what_idx = ref ((String.length what) - 1) in
-    let str_idx = ref ((String.length str) - 1) in
-    let ok = ref true in
-    while !ok &&
-          offset <= !str_idx &&
-          0 <= !what_idx do
-      if str.[!str_idx] = what.[!what_idx] then
-        decr what_idx
-      else
-        ok := false;
-      decr str_idx
-    done;
-    if !what_idx = -1 then
-      true
-    else
-      false
-
-
-  let strip_ends_with ~what str =
-    if ends_with ~what str then
-      sub_end str (String.length what)
-    else
-      raise Not_found
-
-
-  let replace_chars f s =
-    let buf = Buffer.create (String.length s) in
-    String.iter (fun c -> Buffer.add_char buf (f c)) s;
-    Buffer.contents buf
-
-  let lowercase_ascii =
-    replace_chars
-      (fun c ->
-         if (c >= 'A' && c <= 'Z') then
-           Char.chr (Char.code c + 32)
-         else
-           c)
-
-  let uncapitalize_ascii s =
-    if s <> "" then
-      (lowercase_ascii (String.sub s 0 1)) ^ (String.sub s 1 ((String.length s) - 1))
-    else
-      s
-
-  let uppercase_ascii =
-    replace_chars
-      (fun c ->
-         if (c >= 'a' && c <= 'z') then
-           Char.chr (Char.code c - 32)
-         else
-           c)
-
-  let capitalize_ascii s =
-    if s <> "" then
-      (uppercase_ascii (String.sub s 0 1)) ^ (String.sub s 1 ((String.length s) - 1))
-    else
-      s
-
-end
-
-module OASISUtils = struct
-(* # 22 "src/oasis/OASISUtils.ml" *)
-
-
-  open OASISGettext
-
-
-  module MapExt =
-  struct
-    module type S =
-    sig
-      include Map.S
-      val add_list: 'a t -> (key * 'a) list -> 'a t
-      val of_list: (key * 'a) list -> 'a t
-      val to_list: 'a t -> (key * 'a) list
-    end
-
-    module Make (Ord: Map.OrderedType) =
-    struct
-      include Map.Make(Ord)
-
-      let rec add_list t =
-        function
-          | (k, v) :: tl -> add_list (add k v t) tl
-          | [] -> t
-
-      let of_list lst = add_list empty lst
-
-      let to_list t = fold (fun k v acc -> (k, v) :: acc) t []
-    end
-  end
-
-
-  module MapString = MapExt.Make(String)
-
-
-  module SetExt  =
-  struct
-    module type S =
-    sig
-      include Set.S
-      val add_list: t -> elt list -> t
-      val of_list: elt list -> t
-      val to_list: t -> elt list
-    end
-
-    module Make (Ord: Set.OrderedType) =
-    struct
-      include Set.Make(Ord)
-
-      let rec add_list t =
-        function
-          | e :: tl -> add_list (add e t) tl
-          | [] -> t
-
-      let of_list lst = add_list empty lst
-
-      let to_list = elements
-    end
-  end
-
-
-  module SetString = SetExt.Make(String)
-
-
-  let compare_csl s1 s2 =
-    String.compare (OASISString.lowercase_ascii s1) (OASISString.lowercase_ascii s2)
-
-
-  module HashStringCsl =
-    Hashtbl.Make
-      (struct
-         type t = string
-         let equal s1 s2 = (compare_csl s1 s2) = 0
-         let hash s = Hashtbl.hash (OASISString.lowercase_ascii s)
-       end)
-
-  module SetStringCsl =
-    SetExt.Make
-      (struct
-         type t = string
-         let compare = compare_csl
-       end)
-
-
-  let varname_of_string ?(hyphen='_') s =
-    if String.length s = 0 then
-      begin
-        invalid_arg "varname_of_string"
-      end
-    else
-      begin
-        let buf =
-          OASISString.replace_chars
-            (fun c ->
-               if ('a' <= c && c <= 'z')
-                 ||
-                  ('A' <= c && c <= 'Z')
-                 ||
-                  ('0' <= c && c <= '9') then
-                 c
-               else
-                 hyphen)
-            s;
-        in
-        let buf =
-          (* Start with a _ if digit *)
-          if '0' <= s.[0] && s.[0] <= '9' then
-            "_"^buf
-          else
-            buf
-        in
-          OASISString.lowercase_ascii buf
-      end
-
-
-  let varname_concat ?(hyphen='_') p s =
-    let what = String.make 1 hyphen in
-    let p =
-      try
-        OASISString.strip_ends_with ~what p
-      with Not_found ->
-        p
-    in
-    let s =
-      try
-        OASISString.strip_starts_with ~what s
-      with Not_found ->
-        s
-    in
-      p^what^s
-
-
-  let is_varname str =
-    str = varname_of_string str
-
-
-  let failwithf fmt = Printf.ksprintf failwith fmt
-
-
-  let rec file_location ?pos1 ?pos2 ?lexbuf () =
-      match pos1, pos2, lexbuf with
-      | Some p, None, _ | None, Some p, _ ->
-        file_location ~pos1:p ~pos2:p ?lexbuf ()
-      | Some p1, Some p2, _ ->
-        let open Lexing in
-        let fn, lineno = p1.pos_fname, p1.pos_lnum in
-        let c1 = p1.pos_cnum - p1.pos_bol in
-        let c2 = c1 + (p2.pos_cnum - p1.pos_cnum) in
-        Printf.sprintf (f_ "file %S, line %d, characters %d-%d")  fn lineno c1 c2
-      | _, _, Some lexbuf ->
-        file_location
-          ~pos1:(Lexing.lexeme_start_p lexbuf)
-          ~pos2:(Lexing.lexeme_end_p lexbuf)
-          ()
-      | None, None, None ->
-        s_ "<position undefined>"
-
-
-  let failwithpf ?pos1 ?pos2 ?lexbuf fmt =
-    let loc = file_location ?pos1 ?pos2 ?lexbuf () in
-    Printf.ksprintf (fun s -> failwith (Printf.sprintf "%s: %s" loc s)) fmt
-
-
-end
-
-module OASISUnixPath = struct
-(* # 22 "src/oasis/OASISUnixPath.ml" *)
-
-
-  type unix_filename = string
-  type unix_dirname = string
-
-
-  type host_filename = string
-  type host_dirname = string
-
-
-  let current_dir_name = "."
-
-
-  let parent_dir_name = ".."
-
-
-  let is_current_dir fn =
-    fn = current_dir_name || fn = ""
-
-
-  let concat f1 f2 =
-    if is_current_dir f1 then
-      f2
-    else
-      let f1' =
-        try OASISString.strip_ends_with ~what:"/" f1 with Not_found -> f1
-      in
-      f1'^"/"^f2
-
-
-  let make =
-    function
-      | hd :: tl ->
-        List.fold_left
-          (fun f p -> concat f p)
-          hd
-          tl
-      | [] ->
-        invalid_arg "OASISUnixPath.make"
-
-
-  let dirname f =
-    try
-      String.sub f 0 (String.rindex f '/')
-    with Not_found ->
-      current_dir_name
-
-
-  let basename f =
-    try
-      let pos_start =
-        (String.rindex f '/') + 1
-      in
-      String.sub f pos_start ((String.length f) - pos_start)
-    with Not_found ->
-      f
-
-
-  let chop_extension f =
-    try
-      let last_dot =
-        String.rindex f '.'
-      in
-      let sub =
-        String.sub f 0 last_dot
-      in
-      try
-        let last_slash =
-          String.rindex f '/'
-        in
-        if last_slash < last_dot then
-          sub
-        else
-          f
-      with Not_found ->
-        sub
-
-    with Not_found ->
-      f
-
-
-  let capitalize_file f =
-    let dir = dirname f in
-    let base = basename f in
-    concat dir (OASISString.capitalize_ascii base)
-
-
-  let uncapitalize_file f =
-    let dir = dirname f in
-    let base = basename f in
-    concat dir (OASISString.uncapitalize_ascii base)
-
-
-end
-
-module OASISHostPath = struct
-(* # 22 "src/oasis/OASISHostPath.ml" *)
-
-
-  open Filename
-  open OASISGettext
-
-
-  module Unix = OASISUnixPath
-
-
-  let make =
-    function
-      | [] ->
-        invalid_arg "OASISHostPath.make"
-      | hd :: tl ->
-        List.fold_left Filename.concat hd tl
-
-
-  let of_unix ufn =
-    match Sys.os_type with
-    | "Unix" | "Cygwin" -> ufn
-    | "Win32" ->
-      make
-        (List.map
-           (fun p ->
-              if p = Unix.current_dir_name then
-                current_dir_name
-              else if p = Unix.parent_dir_name then
-                parent_dir_name
-              else
-                p)
-           (OASISString.nsplit ufn '/'))
-    | os_type ->
-      OASISUtils.failwithf
-        (f_ "Don't know the path format of os_type %S when translating unix \
-             filename. %S")
-        os_type ufn
-
-
-end
-
-module OASISFileSystem = struct
-(* # 22 "src/oasis/OASISFileSystem.ml" *)
-
-  (** File System functions
-
-      @author Sylvain Le Gall
-  *)
-
-  type 'a filename = string
-
-  class type closer =
-    object
-      method close: unit
-    end
-
-  class type reader =
-    object
-      inherit closer
-      method input: Buffer.t -> int -> unit
-    end
-
-  class type writer =
-    object
-      inherit closer
-      method output: Buffer.t -> unit
-    end
-
-  class type ['a] fs =
-    object
-      method string_of_filename: 'a filename -> string
-      method open_out: ?mode:(open_flag list) -> ?perm:int -> 'a filename -> writer
-      method open_in: ?mode:(open_flag list) -> ?perm:int -> 'a filename -> reader
-      method file_exists: 'a filename -> bool
-      method remove: 'a filename -> unit
-    end
-
-
-  module Mode =
-  struct
-    let default_in = [Open_rdonly]
-    let default_out = [Open_wronly; Open_creat; Open_trunc]
-
-    let text_in = Open_text :: default_in
-    let text_out = Open_text :: default_out
-
-    let binary_in = Open_binary :: default_in
-    let binary_out = Open_binary :: default_out
-  end
-
-  let std_length = 4096 (* Standard buffer/read length. *)
-  let binary_out = Mode.binary_out
-  let binary_in = Mode.binary_in
-
-  let of_unix_filename ufn = (ufn: 'a filename)
-  let to_unix_filename fn = (fn: string)
-
-
-  let defer_close o f =
-    try
-      let r = f o in o#close; r
-    with e ->
-      o#close; raise e
-
-
-  let stream_of_reader rdr =
-    let buf = Buffer.create std_length in
-    let pos = ref 0 in
-    let eof = ref false in
-    let rec next idx =
-      let bpos = idx - !pos in
-      if !eof then begin
-        None
-      end else if bpos < Buffer.length buf then begin
-        Some (Buffer.nth buf bpos)
-      end else begin
-        pos := !pos + Buffer.length buf;
-        Buffer.clear buf;
-        begin
-          try
-            rdr#input buf std_length;
-          with End_of_file ->
-            if Buffer.length buf = 0 then
-              eof := true
-        end;
-        next idx
-      end
-    in
-    Stream.from next
-
-
-  let read_all buf rdr =
-    try
-      while true do
-        rdr#input buf std_length
-      done
-    with End_of_file ->
-      ()
-
-  class ['a] host_fs rootdir : ['a] fs =
-    object (self)
-      method private host_filename fn = Filename.concat rootdir fn
-      method string_of_filename = self#host_filename
-
-      method open_out ?(mode=Mode.text_out)  ?(perm=0o666) fn =
-        let chn = open_out_gen mode perm (self#host_filename fn) in
-        object
-          method close = close_out chn
-          method output buf = Buffer.output_buffer chn buf
-        end
-
-      method open_in ?(mode=Mode.text_in) ?(perm=0o666) fn =
-        (* TODO: use Buffer.add_channel when minimal version of OCaml will
-         * be >= 4.03.0 (previous version was discarding last chars).
-         *)
-        let chn = open_in_gen mode perm (self#host_filename fn) in
-        let strm = Stream.of_channel chn in
-        object
-          method close = close_in chn
-          method input buf len =
-            let read = ref 0 in
-            try
-              for _i = 0 to len do
-                Buffer.add_char buf (Stream.next strm);
-                incr read
-              done
-            with Stream.Failure ->
-              if !read = 0 then
-                raise End_of_file
-        end
-
-      method file_exists fn = Sys.file_exists (self#host_filename fn)
-      method remove fn = Sys.remove (self#host_filename fn)
-    end
-
-end
-
-module OASISContext = struct
-(* # 22 "src/oasis/OASISContext.ml" *)
-
-
-  open OASISGettext
-
-
-  type level =
-    [ `Debug
-    | `Info
-    | `Warning
-    | `Error]
-
-
-  type source
-  type source_filename = source OASISFileSystem.filename
-
-
-  let in_srcdir ufn = OASISFileSystem.of_unix_filename ufn
-
-
-  type t =
-    {
-      (* TODO: replace this by a proplist. *)
-      quiet:                 bool;
-      info:                  bool;
-      debug:                 bool;
-      ignore_plugins:        bool;
-      ignore_unknown_fields: bool;
-      printf:                level -> string -> unit;
-      srcfs:                 source OASISFileSystem.fs;
-      load_oasis_plugin:     string -> bool;
-    }
-
-
-  let printf lvl str =
-    let beg =
-      match lvl with
-        | `Error -> s_ "E: "
-        | `Warning -> s_ "W: "
-        | `Info  -> s_ "I: "
-        | `Debug -> s_ "D: "
-    in
-    prerr_endline (beg^str)
-
-
-  let default =
-    ref
-      {
-        quiet                 = false;
-        info                  = false;
-        debug                 = false;
-        ignore_plugins        = false;
-        ignore_unknown_fields = false;
-        printf                = printf;
-        srcfs                 = new OASISFileSystem.host_fs(Sys.getcwd ());
-        load_oasis_plugin     = (fun _ -> false);
-      }
-
-
-  let quiet =
-    {!default with quiet = true}
-
-
-  let fspecs () =
-    (* TODO: don't act on default. *)
-    let ignore_plugins = ref false in
-    ["-quiet",
-     Arg.Unit (fun () -> default := {!default with quiet = true}),
-     s_ " Run quietly";
-
-     "-info",
-     Arg.Unit (fun () -> default := {!default with info = true}),
-     s_ " Display information message";
-
-
-     "-debug",
-     Arg.Unit (fun () -> default := {!default with debug = true}),
-     s_ " Output debug message";
-
-     "-ignore-plugins",
-     Arg.Set ignore_plugins,
-     s_ " Ignore plugin's field.";
-
-     "-C",
-     Arg.String
-       (fun str ->
-          Sys.chdir str;
-          default := {!default with srcfs = new OASISFileSystem.host_fs str}),
-     s_ "dir Change directory before running (affects setup.{data,log})."],
-    fun () -> {!default with ignore_plugins = !ignore_plugins}
-end
-
-module PropList = struct
-(* # 22 "src/oasis/PropList.ml" *)
-
-
-  open OASISGettext
-
-
-  type name = string
-
-
-  exception Not_set of name * string option
-  exception No_printer of name
-  exception Unknown_field of name * name
-
-
-  let () =
-    Printexc.register_printer
-      (function
-        | Not_set (nm, Some rsn) ->
-          Some
-            (Printf.sprintf (f_ "Field '%s' is not set: %s") nm rsn)
-        | Not_set (nm, None) ->
-          Some
-            (Printf.sprintf (f_ "Field '%s' is not set") nm)
-        | No_printer nm ->
-          Some
-            (Printf.sprintf (f_ "No default printer for value %s") nm)
-        | Unknown_field (nm, schm) ->
-          Some
-            (Printf.sprintf
-               (f_ "Field %s is not defined in schema %s") nm schm)
-        | _ ->
-          None)
-
-
-  module Data =
-  struct
-    type t =
-      (name, unit -> unit) Hashtbl.t
-
-    let create () =
-      Hashtbl.create 13
-
-    let clear t =
-      Hashtbl.clear t
-
-
-(* # 77 "src/oasis/PropList.ml" *)
-  end
-
-
-  module Schema =
-  struct
-    type ('ctxt, 'extra) value =
-      {
-        get:   Data.t -> string;
-        set:   Data.t -> ?context:'ctxt -> string -> unit;
-        help:  (unit -> string) option;
-        extra: 'extra;
-      }
-
-    type ('ctxt, 'extra) t =
-      {
-        name:      name;
-        fields:    (name, ('ctxt, 'extra) value) Hashtbl.t;
-        order:     name Queue.t;
-        name_norm: string -> string;
-      }
-
-    let create ?(case_insensitive=false) nm =
-      {
-        name      = nm;
-        fields    = Hashtbl.create 13;
-        order     = Queue.create ();
-        name_norm =
-          (if case_insensitive then
-             OASISString.lowercase_ascii
-           else
-             fun s -> s);
-      }
-
-    let add t nm set get extra help =
-      let key =
-        t.name_norm nm
-      in
-
-      if Hashtbl.mem t.fields key then
-        failwith
-          (Printf.sprintf
-             (f_ "Field '%s' is already defined in schema '%s'")
-             nm t.name);
-      Hashtbl.add
-        t.fields
-        key
-        {
-          set   = set;
-          get   = get;
-          help  = help;
-          extra = extra;
-        };
-      Queue.add nm t.order
-
-    let mem t nm =
-      Hashtbl.mem t.fields nm
-
-    let find t nm =
-      try
-        Hashtbl.find t.fields (t.name_norm nm)
-      with Not_found ->
-        raise (Unknown_field (nm, t.name))
-
-    let get t data nm =
-      (find t nm).get data
-
-    let set t data nm ?context x =
-      (find t nm).set
-        data
-        ?context
-        x
-
-    let fold f acc t =
-      Queue.fold
-        (fun acc k ->
-           let v =
-             find t k
-           in
-           f acc k v.extra v.help)
-        acc
-        t.order
-
-    let iter f t =
-      fold
-        (fun () -> f)
-        ()
-        t
-
-    let name t =
-      t.name
-  end
-
-
-  module Field =
-  struct
-    type ('ctxt, 'value, 'extra) t =
-      {
-        set:    Data.t -> ?context:'ctxt -> 'value -> unit;
-        get:    Data.t -> 'value;
-        sets:   Data.t -> ?context:'ctxt -> string -> unit;
-        gets:   Data.t -> string;
-        help:   (unit -> string) option;
-        extra:  'extra;
-      }
-
-    let new_id =
-      let last_id =
-        ref 0
-      in
-      fun () -> incr last_id; !last_id
-
-    let create ?schema ?name ?parse ?print ?default ?update ?help extra =
-      (* Default value container *)
-      let v =
-        ref None
-      in
-
-      (* If name is not given, create unique one *)
-      let nm =
-        match name with
-          | Some s -> s
-          | None -> Printf.sprintf "_anon_%d" (new_id ())
-      in
-
-      (* Last chance to get a value: the default *)
-      let default () =
-        match default with
-          | Some d -> d
-          | None -> raise (Not_set (nm, Some (s_ "no default value")))
-      in
-
-      (* Get data *)
-      let get data =
-        (* Get value *)
-        try
-          (Hashtbl.find data nm) ();
-          match !v with
-            | Some x -> x
-            | None -> default ()
-        with Not_found ->
-          default ()
-      in
-
-      (* Set data *)
-      let set data ?context x =
-        let x =
-          match update with
-            | Some f ->
-              begin
-                try
-                  f ?context (get data) x
-                with Not_set _ ->
-                  x
-              end
-            | None ->
-              x
-        in
-        Hashtbl.replace
-          data
-          nm
-          (fun () -> v := Some x)
-      in
-
-      (* Parse string value, if possible *)
-      let parse =
-        match parse with
-          | Some f ->
-            f
-          | None ->
-            fun ?context s ->
-              failwith
-                (Printf.sprintf
-                   (f_ "Cannot parse field '%s' when setting value %S")
-                   nm
-                   s)
-      in
-
-      (* Set data, from string *)
-      let sets data ?context s =
-        set ?context data (parse ?context s)
-      in
-
-      (* Output value as string, if possible *)
-      let print =
-        match print with
-          | Some f ->
-            f
-          | None ->
-            fun _ -> raise (No_printer nm)
-      in
-
-      (* Get data, as a string *)
-      let gets data =
-        print (get data)
-      in
-
-      begin
-        match schema with
-          | Some t ->
-            Schema.add t nm sets gets extra help
-          | None ->
-            ()
-      end;
-
-      {
-        set   = set;
-        get   = get;
-        sets  = sets;
-        gets  = gets;
-        help  = help;
-        extra = extra;
-      }
-
-    let fset data t ?context x =
-      t.set data ?context x
-
-    let fget data t =
-      t.get data
-
-    let fsets data t ?context s =
-      t.sets data ?context s
-
-    let fgets data t =
-      t.gets data
-  end
-
-
-  module FieldRO =
-  struct
-    let create ?schema ?name ?parse ?print ?default ?update ?help extra =
-      let fld =
-        Field.create ?schema ?name ?parse ?print ?default ?update ?help extra
-      in
-      fun data -> Field.fget data fld
-  end
-end
-
-module OASISMessage = struct
-(* # 22 "src/oasis/OASISMessage.ml" *)
-
-
-  open OASISGettext
-  open OASISContext
-
-
-  let generic_message ~ctxt lvl fmt =
-    let cond =
-      if ctxt.quiet then
-        false
-      else
-        match lvl with
-          | `Debug -> ctxt.debug
-          | `Info  -> ctxt.info
-          | _ -> true
-    in
-    Printf.ksprintf
-      (fun str ->
-         if cond then
-           begin
-             ctxt.printf lvl str
-           end)
-      fmt
-
-
-  let debug ~ctxt fmt =
-    generic_message ~ctxt `Debug fmt
-
-
-  let info ~ctxt fmt =
-    generic_message ~ctxt `Info fmt
-
-
-  let warning ~ctxt fmt =
-    generic_message ~ctxt `Warning fmt
-
-
-  let error ~ctxt fmt =
-    generic_message ~ctxt `Error fmt
-
-end
-
-module OASISVersion = struct
-(* # 22 "src/oasis/OASISVersion.ml" *)
-
-
-  open OASISGettext
-
-
-  type t = string
-
-
-  type comparator =
-    | VGreater of t
-    | VGreaterEqual of t
-    | VEqual of t
-    | VLesser of t
-    | VLesserEqual of t
-    | VOr of  comparator * comparator
-    | VAnd of comparator * comparator
-
-
-  (* Range of allowed characters *)
-  let is_digit c = '0' <= c && c <= '9'
-  let is_alpha c = ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
-  let is_special = function | '.' | '+' | '-' | '~' -> true | _ -> false
-
-
-  let rec version_compare v1 v2 =
-    if v1 <> "" || v2 <> "" then
-      begin
-        (* Compare ascii string, using special meaning for version
-         * related char
-        *)
-        let val_ascii c =
-          if c = '~' then -1
-          else if is_digit c then 0
-          else if c = '\000' then 0
-          else if is_alpha c then Char.code c
-          else (Char.code c) + 256
-        in
-
-        let len1 = String.length v1 in
-        let len2 = String.length v2 in
-
-        let p = ref 0 in
-
-        (** Compare ascii part *)
-        let compare_vascii () =
-          let cmp = ref 0 in
-          while !cmp = 0 &&
-                !p < len1 && !p < len2 &&
-                not (is_digit v1.[!p] && is_digit v2.[!p]) do
-            cmp := (val_ascii v1.[!p]) - (val_ascii v2.[!p]);
-            incr p
-          done;
-          if !cmp = 0 && !p < len1 && !p = len2 then
-            val_ascii v1.[!p]
-          else if !cmp = 0 && !p = len1 && !p < len2 then
-            - (val_ascii v2.[!p])
-          else
-            !cmp
-        in
-
-        (** Compare digit part *)
-        let compare_digit () =
-          let extract_int v p =
-            let start_p = !p in
-            while !p < String.length v && is_digit v.[!p] do
-              incr p
-            done;
-            let substr =
-              String.sub v !p ((String.length v) - !p)
-            in
-            let res =
-              match String.sub v start_p (!p - start_p) with
-                | "" -> 0
-                | s -> int_of_string s
-            in
-            res, substr
-          in
-          let i1, tl1 = extract_int v1 (ref !p) in
-          let i2, tl2 = extract_int v2 (ref !p) in
-          i1 - i2, tl1, tl2
-        in
-
-        match compare_vascii () with
-          | 0 ->
-            begin
-              match compare_digit () with
-                | 0, tl1, tl2 ->
-                  if tl1 <> "" && is_digit tl1.[0] then
-                    1
-                  else if tl2 <> "" && is_digit tl2.[0] then
-                    -1
-                  else
-                    version_compare tl1 tl2
-                | n, _, _ ->
-                  n
-            end
-          | n ->
-            n
-      end
-    else begin
-      0
-    end
-
-
-  let version_of_string str = str
-
-
-  let string_of_version t = t
-
-
-  let chop t =
-    try
-      let pos =
-        String.rindex t '.'
-      in
-      String.sub t 0 pos
-    with Not_found ->
-      t
-
-
-  let rec comparator_apply v op =
-    match op with
-      | VGreater cv ->
-        (version_compare v cv) > 0
-      | VGreaterEqual cv ->
-        (version_compare v cv) >= 0
-      | VLesser cv ->
-        (version_compare v cv) < 0
-      | VLesserEqual cv ->
-        (version_compare v cv) <= 0
-      | VEqual cv ->
-        (version_compare v cv) = 0
-      | VOr (op1, op2) ->
-        (comparator_apply v op1) || (comparator_apply v op2)
-      | VAnd (op1, op2) ->
-        (comparator_apply v op1) && (comparator_apply v op2)
-
-
-  let rec string_of_comparator =
-    function
-      | VGreater v  -> "> "^(string_of_version v)
-      | VEqual v    -> "= "^(string_of_version v)
-      | VLesser v   -> "< "^(string_of_version v)
-      | VGreaterEqual v -> ">= "^(string_of_version v)
-      | VLesserEqual v  -> "<= "^(string_of_version v)
-      | VOr (c1, c2)  ->
-        (string_of_comparator c1)^" || "^(string_of_comparator c2)
-      | VAnd (c1, c2) ->
-        (string_of_comparator c1)^" && "^(string_of_comparator c2)
-
-
-  let rec varname_of_comparator =
-    let concat p v =
-      OASISUtils.varname_concat
-        p
-        (OASISUtils.varname_of_string
-           (string_of_version v))
-    in
-    function
-      | VGreater v -> concat "gt" v
-      | VLesser v  -> concat "lt" v
-      | VEqual v   -> concat "eq" v
-      | VGreaterEqual v -> concat "ge" v
-      | VLesserEqual v  -> concat "le" v
-      | VOr (c1, c2) ->
-        (varname_of_comparator c1)^"_or_"^(varname_of_comparator c2)
-      | VAnd (c1, c2) ->
-        (varname_of_comparator c1)^"_and_"^(varname_of_comparator c2)
-
-
-end
-
-module OASISLicense = struct
-(* # 22 "src/oasis/OASISLicense.ml" *)
-
-
-  (** License for _oasis fields
-      @author Sylvain Le Gall
-  *)
-
-
-  type license = string
-  type license_exception = string
-
-
-  type license_version =
-    | Version of OASISVersion.t
-    | VersionOrLater of OASISVersion.t
-    | NoVersion
-
-
-  type license_dep_5_unit =
-    {
-      license:   license;
-      excption:  license_exception option;
-      version:   license_version;
-    }
-
-
-  type license_dep_5 =
-    | DEP5Unit of license_dep_5_unit
-    | DEP5Or of license_dep_5 list
-    | DEP5And of license_dep_5 list
-
-
-  type t =
-    | DEP5License of license_dep_5
-    | OtherLicense of string (* URL *)
-
-
-end
-
-module OASISExpr = struct
-(* # 22 "src/oasis/OASISExpr.ml" *)
-
-
-  open OASISGettext
-  open OASISUtils
-
-
-  type test = string
-  type flag = string
-
-
-  type t =
-    | EBool of bool
-    | ENot of t
-    | EAnd of t * t
-    | EOr of t * t
-    | EFlag of flag
-    | ETest of test * string
-
-
-  type 'a choices = (t * 'a) list
-
-
-  let eval var_get t =
-    let rec eval' =
-      function
-        | EBool b ->
-            b
-
-        | ENot e ->
-            not (eval' e)
-
-        | EAnd (e1, e2) ->
-            (eval' e1) && (eval' e2)
-
-        | EOr (e1, e2) ->
-            (eval' e1) || (eval' e2)
-
-        | EFlag nm ->
-            let v =
-              var_get nm
-            in
-              assert(v = "true" || v = "false");
-              (v = "true")
-
-        | ETest (nm, vl) ->
-            let v =
-              var_get nm
-            in
-              (v = vl)
-    in
-      eval' t
-
-
-  let choose ?printer ?name var_get lst =
-    let rec choose_aux =
-      function
-        | (cond, vl) :: tl ->
-            if eval var_get cond then
-              vl
-            else
-              choose_aux tl
-        | [] ->
-            let str_lst =
-              if lst = [] then
-                s_ "<empty>"
-              else
-                String.concat
-                  (s_ ", ")
-                  (List.map
-                     (fun (cond, vl) ->
-                        match printer with
-                          | Some p -> p vl
-                          | None -> s_ "<no printer>")
-                     lst)
-            in
-              match name with
-                | Some nm ->
-                    failwith
-                      (Printf.sprintf
-                         (f_ "No result for the choice list '%s': %s")
-                         nm str_lst)
-                | None ->
-                    failwith
-                      (Printf.sprintf
-                         (f_ "No result for a choice list: %s")
-                         str_lst)
-    in
-      choose_aux (List.rev lst)
-
-
-end
-
-module OASISText = struct
-(* # 22 "src/oasis/OASISText.ml" *)
-
-  type elt =
-    | Para of string
-    | Verbatim of string
-    | BlankLine
-
-  type t = elt list
-
-end
-
-module OASISSourcePatterns = struct
-(* # 22 "src/oasis/OASISSourcePatterns.ml" *)
-
-  open OASISUtils
-  open OASISGettext
-
-  module Templater =
-  struct
-    (* TODO: use this module in BaseEnv.var_expand and BaseFileAB, at least. *)
-    type t =
-      {
-        atoms: atom list;
-        origin: string
-      }
-    and atom =
-      | Text of string
-      | Expr of expr
-    and expr =
-      | Ident of string
-      | String of string
-      | Call of string * expr
-
-
-    type env =
-      {
-        variables: string MapString.t;
-        functions: (string -> string) MapString.t;
-      }
-
-
-    let eval env t =
-      let rec eval_expr env =
-        function
-        | String str -> str
-        | Ident nm ->
-          begin
-            try
-              MapString.find nm env.variables
-            with Not_found ->
-              (* TODO: add error location within the string. *)
-              failwithf
-                (f_ "Unable to find variable %S in source pattern %S")
-                nm t.origin
-          end
-
-        | Call (fn, expr) ->
-          begin
-            try
-              (MapString.find fn env.functions) (eval_expr env expr)
-            with Not_found ->
-              (* TODO: add error location within the string. *)
-              failwithf
-                (f_ "Unable to find function %S in source pattern %S")
-                fn t.origin
-          end
-      in
-      String.concat ""
-        (List.map
-           (function
-             | Text str -> str
-             | Expr expr -> eval_expr env expr)
-           t.atoms)
-
-
-    let parse env s =
-      let lxr = Genlex.make_lexer [] in
-      let parse_expr s =
-        let st = lxr (Stream.of_string s) in
-        match Stream.npeek 3 st with
-        | [Genlex.Ident fn; Genlex.Ident nm] -> Call(fn, Ident nm)
-        | [Genlex.Ident fn; Genlex.String str] -> Call(fn, String str)
-        | [Genlex.String str] -> String str
-        | [Genlex.Ident nm] -> Ident nm
-        (* TODO: add error location within the string. *)
-        | _ -> failwithf (f_ "Unable to parse expression %S") s
-      in
-      let parse s =
-        let lst_exprs = ref [] in
-        let ss =
-          let buff = Buffer.create (String.length s) in
-          Buffer.add_substitute
-            buff
-            (fun s -> lst_exprs := (parse_expr s) :: !lst_exprs; "\000")
-            s;
-          Buffer.contents buff
-        in
-        let rec join =
-          function
-          | hd1 :: tl1, hd2 :: tl2 -> Text hd1 :: Expr hd2 :: join (tl1, tl2)
-          | [], tl -> List.map (fun e -> Expr e) tl
-          | tl, [] -> List.map (fun e -> Text e) tl
-        in
-        join (OASISString.nsplit ss '\000', List.rev (!lst_exprs))
-      in
-      let t = {atoms = parse s; origin = s} in
-      (* We rely on a simple evaluation for checking variables/functions.
-         It works because there is no if/loop statement.
-      *)
-      let _s : string = eval env t in
-      t
-
-(* # 144 "src/oasis/OASISSourcePatterns.ml" *)
-  end
-
-
-  type t = Templater.t
-
-
-  let env ~modul () =
-    {
-      Templater.
-      variables = MapString.of_list ["module", modul];
-      functions = MapString.of_list
-          [
-            "capitalize_file", OASISUnixPath.capitalize_file;
-            "uncapitalize_file", OASISUnixPath.uncapitalize_file;
-          ];
-    }
-
-  let all_possible_files lst ~path ~modul =
-    let eval = Templater.eval (env ~modul ()) in
-    List.fold_left
-      (fun acc pat -> OASISUnixPath.concat path (eval pat) :: acc)
-      [] lst
-
-
-  let to_string t = t.Templater.origin
-
-
-end
-
-module OASISTypes = struct
-(* # 22 "src/oasis/OASISTypes.ml" *)
-
-
-  type name          = string
-  type package_name  = string
-  type url           = string
-  type unix_dirname  = string
-  type unix_filename = string (* TODO: replace everywhere. *)
-  type host_dirname  = string (* TODO: replace everywhere. *)
-  type host_filename = string (* TODO: replace everywhere. *)
-  type prog          = string
-  type arg           = string
-  type args          = string list
-  type command_line  = (prog * arg list)
-
-
-  type findlib_name = string
-  type findlib_full = string
-
-
-  type compiled_object =
-    | Byte
-    | Native
-    | Best
-
-
-  type dependency =
-    | FindlibPackage of findlib_full * OASISVersion.comparator option
-    | InternalLibrary of name
-
-
-  type tool =
-    | ExternalTool of name
-    | InternalExecutable of name
-
-
-  type vcs =
-    | Darcs
-    | Git
-    | Svn
-    | Cvs
-    | Hg
-    | Bzr
-    | Arch
-    | Monotone
-    | OtherVCS of url
-
-
-  type plugin_kind =
-    [  `Configure
-    | `Build
-    | `Doc
-    | `Test
-    | `Install
-    | `Extra
-    ]
-
-
-  type plugin_data_purpose =
-    [  `Configure
-    | `Build
-    | `Install
-    | `Clean
-    | `Distclean
-    | `Install
-    | `Uninstall
-    | `Test
-    | `Doc
-    | `Extra
-    | `Other of string
-    ]
-
-
-  type 'a plugin = 'a * name * OASISVersion.t option
-
-
-  type all_plugin = plugin_kind plugin
-
-
-  type plugin_data = (all_plugin * plugin_data_purpose * (unit -> unit)) list
-
-
-  type 'a conditional = 'a OASISExpr.choices
-
-
-  type custom =
-    {
-      pre_command:  (command_line option) conditional;
-      post_command: (command_line option) conditional;
-    }
-
-
-  type common_section =
-    {
-      cs_name: name;
-      cs_data: PropList.Data.t;
-      cs_plugin_data: plugin_data;
-    }
-
-
-  type build_section =
-    {
-      bs_build:                   bool conditional;
-      bs_install:                 bool conditional;
-      bs_path:                    unix_dirname;
-      bs_compiled_object:         compiled_object;
-      bs_build_depends:           dependency list;
-      bs_build_tools:             tool list;
-      bs_interface_patterns:      OASISSourcePatterns.t list;
-      bs_implementation_patterns: OASISSourcePatterns.t list;
-      bs_c_sources:               unix_filename list;
-      bs_data_files:              (unix_filename * unix_filename option) list;
-      bs_findlib_extra_files:     unix_filename list;
-      bs_ccopt:                   args conditional;
-      bs_cclib:                   args conditional;
-      bs_dlllib:                  args conditional;
-      bs_dllpath:                 args conditional;
-      bs_byteopt:                 args conditional;
-      bs_nativeopt:               args conditional;
-    }
-
-
-  type library =
-    {