diff options
author | jaapb <jaapb@pkgsrc.org> | 2018-01-10 16:19:00 +0000 |
---|---|---|
committer | jaapb <jaapb@pkgsrc.org> | 2018-01-10 16:19:00 +0000 |
commit | 6e21c54e27b5f453aad18c2a43064339ff1821ee (patch) | |
tree | d556bc31a1a88dacae8b017d89ef02feef8d157f | |
parent | 7120384101cd808bb22744b0ff8ef9d30e3968a8 (diff) | |
download | pkgsrc-6e21c54e27b5f453aad18c2a43064339ff1821ee.tar.gz |
Revision bump for package devel/ocamlmod.
No upstream changes, but the OASIS setup.ml file had to be regenerated
due to it no longer working with OCaml 4.06.
-rw-r--r-- | devel/ocamlmod/Makefile | 4 | ||||
-rw-r--r-- | devel/ocamlmod/buildlink3.mk | 6 | ||||
-rw-r--r-- | devel/ocamlmod/distinfo | 5 | ||||
-rw-r--r-- | devel/ocamlmod/patches/patch-__tags | 30 | ||||
-rw-r--r-- | devel/ocamlmod/patches/patch-myocamlbuild.ml | 915 | ||||
-rw-r--r-- | devel/ocamlmod/patches/patch-setup.ml | 8913 |
6 files changed, 9867 insertions, 6 deletions
diff --git a/devel/ocamlmod/Makefile b/devel/ocamlmod/Makefile index 1e2579a9efc..0772990108c 100644 --- a/devel/ocamlmod/Makefile +++ b/devel/ocamlmod/Makefile @@ -1,7 +1,7 @@ -# $NetBSD: Makefile,v 1.9 2017/09/08 09:51:23 jaapb Exp $ +# $NetBSD: Makefile,v 1.10 2018/01/10 16:19:00 jaapb Exp $ DISTNAME= ocamlmod-0.0.8 -PKGREVISION= 1 +PKGREVISION= 2 CATEGORIES= devel MASTER_SITES= http://forge.ocamlcore.org/frs/download.php/1544/ diff --git a/devel/ocamlmod/buildlink3.mk b/devel/ocamlmod/buildlink3.mk index e888a1c109b..33629733c60 100644 --- a/devel/ocamlmod/buildlink3.mk +++ b/devel/ocamlmod/buildlink3.mk @@ -1,4 +1,4 @@ -# $NetBSD: buildlink3.mk,v 1.4 2018/01/07 13:04:09 rillig Exp $ +# $NetBSD: buildlink3.mk,v 1.5 2018/01/10 16:19:00 jaapb Exp $ BUILDLINK_TREE+= ocamlmod @@ -6,8 +6,8 @@ BUILDLINK_TREE+= ocamlmod OCAMLMOD_BUILDLINK3_MK:= BUILDLINK_API_DEPENDS.ocamlmod+= ocamlmod>=0.0.7nb1 -BUILDLINK_ABI_DEPENDS.ocamlmod+= ocamlmod>=0.0.8 -BUILDLINK_PKGSRCDIR.ocamlmod?= ../../devel/ocamlmod +BUILDLINK_ABI_DEPENDS.ocamlmod+= ocamlmod>=0.0.8nb2 +BUILDLINK_PKGSRCDIR.ocamlmod?= ../../devel/ocamlmod .endif # OCAMLMOD_BUILDLINK3_MK BUILDLINK_TREE+= -ocamlmod diff --git a/devel/ocamlmod/distinfo b/devel/ocamlmod/distinfo index ae33651700d..857db99000f 100644 --- a/devel/ocamlmod/distinfo +++ b/devel/ocamlmod/distinfo @@ -1,6 +1,9 @@ -$NetBSD: distinfo,v 1.3 2017/07/11 14:11:14 jaapb Exp $ +$NetBSD: distinfo,v 1.4 2018/01/10 16:19:00 jaapb Exp $ SHA1 (ocamlmod-0.0.8.tar.gz) = 5c3d20f493ab9ae6d6f498f73fbe7a7135dbdc83 RMD160 (ocamlmod-0.0.8.tar.gz) = 0ac0def38a0e271e3759e2c6b41d47cff9a95db4 SHA512 (ocamlmod-0.0.8.tar.gz) = beb64c109c241965f33a60b4868f5215e6c112742a3be214d3b7a0503b9d29494c0453fa5f2551bbc1975cd4b123d0b917116aeeba968d2a7d2c6fb9651a64f4 Size (ocamlmod-0.0.8.tar.gz) = 48985 bytes +SHA1 (patch-__tags) = a92d60485688357270ee6fe562bd63d4c46f003d +SHA1 (patch-myocamlbuild.ml) = 8dd1340cf9cc40f9478d24063285b5a2c534a6f2 +SHA1 (patch-setup.ml) = 9f28eaaddc123b5bc649eb7820cfe80fefc1447e diff --git a/devel/ocamlmod/patches/patch-__tags b/devel/ocamlmod/patches/patch-__tags new file mode 100644 index 00000000000..d321a2d0c1a --- /dev/null +++ b/devel/ocamlmod/patches/patch-__tags @@ -0,0 +1,30 @@ +$NetBSD: patch-__tags,v 1.1 2018/01/10 16:19:01 jaapb Exp $ + +Regenerated Oasis files (don't compile with 4.06) +--- _tags.orig 2015-09-02 21:53:11.000000000 +0000 ++++ _tags +@@ -1,8 +1,9 @@ + # OASIS_START +-# DO NOT EDIT (digest: 624081c4aa54babe89f7a49402b5f68d) ++# DO NOT EDIT (digest: 7bfc612a7f85fad7a10e2cc4e4d0a0cc) + # 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 +@@ -15,10 +16,10 @@ + "_darcs": not_hygienic + # Executable ocamlmod + "src/ocamlmod.byte": pkg_str +-<src/*.ml{,i}>: pkg_str ++<src/*.ml{,i,y}>: pkg_str + # Executable test + "test/test.byte": pkg_oUnit + "test/test.byte": pkg_str +-<test/*.ml{,i}>: pkg_oUnit +-<test/*.ml{,i}>: pkg_str ++<test/*.ml{,i,y}>: pkg_oUnit ++<test/*.ml{,i,y}>: pkg_str + # OASIS_STOP diff --git a/devel/ocamlmod/patches/patch-myocamlbuild.ml b/devel/ocamlmod/patches/patch-myocamlbuild.ml new file mode 100644 index 00000000000..5cf9b249da0 --- /dev/null +++ b/devel/ocamlmod/patches/patch-myocamlbuild.ml @@ -0,0 +1,915 @@ +$NetBSD: patch-myocamlbuild.ml,v 1.1 2018/01/10 16:19:01 jaapb Exp $ + +Regenerated Oasis files (don't compile with 4.06) +--- myocamlbuild.ml.orig 2015-09-02 21:53:11.000000000 +0000 ++++ myocamlbuild.ml +@@ -1,19 +1,12 @@ + (* OASIS_START *) +-(* DO NOT EDIT (digest: 5a9a2168dcb86db37476d58b8c0e25b3) *) ++(* DO NOT EDIT (digest: 9bd78b75e5e0b109a1abb54bf043b292) *) + 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 ns_ str = str ++ let s_ str = str ++ let f_ (str: ('a, 'b, 'c, 'd) format4) = str + + + let fn_ fmt1 fmt2 n = +@@ -23,25 +16,338 @@ module OASISGettext = struct + fmt2^^"" + + +- let init = +- [] ++ let init = [] ++end + ++module OASISString = struct ++(* # 22 "src/oasis/OASISString.ml" *) + +-end + +-module OASISExpr = struct +-(* # 22 "src/oasis/OASISExpr.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; ++ !what_idx = String.length what ++ ++ ++ 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; ++ !what_idx = -1 ++ ++ ++ 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 + + +- type test = string ++ 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 + + +@@ -54,7 +360,6 @@ module OASISExpr = struct + | ETest of test * string + + +- + type 'a choices = (t * 'a) list + + +@@ -129,7 +434,7 @@ module OASISExpr = struct + end + + +-# 132 "myocamlbuild.ml" ++# 437 "myocamlbuild.ml" + module BaseEnvLight = struct + (* # 22 "src/base/BaseEnvLight.ml" *) + +@@ -140,129 +445,103 @@ module BaseEnvLight = struct + type t = string MapString.t + + +- let default_filename = +- Filename.concat +- (Sys.getcwd ()) +- "setup.data" ++ let default_filename = Filename.concat (Sys.getcwd ()) "setup.data" + + +- let load ?(allow_empty=false) ?(filename=default_filename) () = +- if Sys.file_exists filename then +- begin +- let chn = +- open_in_bin filename +- in +- let st = +- Stream.of_channel chn +- in +- let line = +- ref 1 +- in +- 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 +- let lexer = +- Genlex.make_lexer ["="] st_line +- in +- let rec read_file mp = +- match Stream.npeek 3 lexer with +- | [Genlex.Ident nm; Genlex.Kwd "="; Genlex.String value] -> +- Stream.junk lexer; +- Stream.junk lexer; +- Stream.junk lexer; +- read_file (MapString.add nm value mp) +- | [] -> +- mp +- | _ -> +- failwith +- (Printf.sprintf +- "Malformed data file '%s' line %d" +- filename !line) +- in +- let mp = +- read_file MapString.empty +- in +- close_in chn; +- mp +- end +- else if allow_empty then +- begin ++ 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 ++ 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 ++ 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 + + +-# 237 "myocamlbuild.ml" ++# 517 "myocamlbuild.ml" + module MyOCamlbuildFindlib = struct + (* # 22 "src/plugins/ocamlbuild/MyOCamlbuildFindlib.ml" *) + + + (** OCamlbuild extension, copied from +- * http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuild ++ * https://ocaml.org/learn/tutorials/ocamlbuild/Using_ocamlfind_with_ocamlbuild.html + * by N. Pouillard and others + * +- * Updated on 2009/02/28 ++ * Updated on 2016-06-02 + * + * Modified by Sylvain Le Gall +- *) ++ *) + open Ocamlbuild_plugin + + +- (* these functions are not really officially exported *) +- let run_and_read = +- Ocamlbuild_pack.My_unix.run_and_read ++ 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 blank_sep_strings = Ocamlbuild_pack.Lexers.blank_sep_strings + + + let exec_from_conf exec = + let exec = +- let env_filename = Pathname.basename BaseEnvLight.default_filename in +- let env = BaseEnvLight.load ~filename:env_filename ~allow_empty:true () in ++ let env = BaseEnvLight.load ~allow_empty:true () in + try + BaseEnvLight.var_get exec env + with Not_found -> +@@ -273,7 +552,7 @@ module MyOCamlbuildFindlib = struct + 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; +@@ -282,7 +561,8 @@ module MyOCamlbuildFindlib = struct + str + end + in +- fix_win32 exec ++ fix_win32 exec ++ + + let split s ch = + let buf = Buffer.create 13 in +@@ -291,15 +571,15 @@ module MyOCamlbuildFindlib = struct + 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 ++ 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' +@@ -315,7 +595,7 @@ module MyOCamlbuildFindlib = struct + + (* This lists all supported packages. *) + let find_packages () = +- List.map before_space (split_nl & run_and_read "ocamlfind list") ++ List.map before_space (split_nl & run_and_read (exec_from_conf "ocamlfind" ^ " list")) + + + (* Mock to list available syntaxes. *) +@@ -338,80 +618,92 @@ module MyOCamlbuildFindlib = struct + ] + + +- let dispatch = ++ 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" ++ (* 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 -> + +- (* 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 = ++ (* 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 Filename.check_suffix pkg "syntax" || +- List.mem pkg well_known_syntax then +- syn_args @ base_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; +- end +- (find_packages ()); +- +- (* Like -package but for extensions syntax. Morover -syntax is useless +- * when linking. *) +- List.iter begin fun syntax -> ++ *) ++ 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 ()); ++ 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 ["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"]); ++ (* 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 +@@ -423,9 +715,6 @@ module MyOCamlbuildBase = struct + *) + + +- +- +- + open Ocamlbuild_plugin + module OC = Ocamlbuild_pack.Ocaml_compiler + +@@ -436,9 +725,6 @@ module MyOCamlbuildBase = struct + type tag = string + + +-(* # 62 "src/plugins/ocamlbuild/MyOCamlbuildBase.ml" *) +- +- + type t = + { + lib_ocaml: (name * dir list * string list) list; +@@ -451,9 +737,10 @@ module MyOCamlbuildBase = struct + } + + +- let env_filename = +- Pathname.basename +- BaseEnvLight.default_filename ++(* # 110 "src/plugins/ocamlbuild/MyOCamlbuildBase.ml" *) ++ ++ ++ let env_filename = Pathname.basename BaseEnvLight.default_filename + + + let dispatch_combine lst = +@@ -472,12 +759,7 @@ module MyOCamlbuildBase = struct + + + let dispatch t e = +- let env = +- BaseEnvLight.load +- ~filename:env_filename +- ~allow_empty:true +- () +- in ++ let env = BaseEnvLight.load ~allow_empty:true () in + match e with + | Before_options -> + let no_trailing_dot s = +@@ -505,7 +787,7 @@ module MyOCamlbuildBase = struct + | nm, [], intf_modules -> + ocaml_lib nm; + let cmis = +- List.map (fun m -> (String.uncapitalize m) ^ ".cmi") ++ 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 -> +@@ -518,7 +800,7 @@ module MyOCamlbuildBase = struct + ["compile"; "infer_interface"; "doc"]) + tl; + let cmis = +- List.map (fun m -> dir^"/"^(String.uncapitalize m)^".cmi") ++ List.map (fun m -> dir^"/"^(OASISString.uncapitalize_ascii m)^".cmi") + intf_modules in + dep ["ocaml"; "link"; "library"; "file:"^dir^"/"^nm^".cma"] + cmis) +@@ -541,16 +823,18 @@ module MyOCamlbuildBase = struct + flag ["link"; "library"; "ocaml"; "native"; tag_libstubs lib] + (S[A"-cclib"; A("-l"^(nm_libstubs lib))]); + +- flag ["link"; "program"; "ocaml"; "byte"; tag_libstubs lib] +- (S[A"-dllib"; A("dll"^(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"; "program"; tag_libstubs lib] ++ dep ["link"; "ocaml"; tag_libstubs lib] + [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)]; + +- dep ["compile"; "ocaml"; "program"; tag_libstubs lib] ++ dep ["compile"; "ocaml"; tag_libstubs lib] + [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)]; + + (* TODO: be more specific about what depends on headers *) +@@ -580,25 +864,27 @@ module MyOCamlbuildBase = struct + () + + +- let dispatch_default t = ++ let dispatch_default conf t = + dispatch_combine + [ + dispatch t; +- MyOCamlbuildFindlib.dispatch; ++ MyOCamlbuildFindlib.dispatch conf; + ] + + + end + + +-# 594 "myocamlbuild.ml" ++# 878 "myocamlbuild.ml" + open Ocamlbuild_plugin;; + let package_default = + {MyOCamlbuildBase.lib_ocaml = []; lib_c = []; flags = []; includes = []} + ;; + +-let dispatch_default = MyOCamlbuildBase.dispatch_default package_default;; ++let conf = {MyOCamlbuildFindlib.no_automatic_syntax = false} ++ ++let dispatch_default = MyOCamlbuildBase.dispatch_default conf package_default;; + +-# 603 "myocamlbuild.ml" ++# 889 "myocamlbuild.ml" + (* OASIS_STOP *) + Ocamlbuild_plugin.dispatch dispatch_default;; diff --git a/devel/ocamlmod/patches/patch-setup.ml b/devel/ocamlmod/patches/patch-setup.ml new file mode 100644 index 00000000000..3b9ad994f37 --- /dev/null +++ b/devel/ocamlmod/patches/patch-setup.ml @@ -0,0 +1,8913 @@ +$NetBSD: patch-setup.ml,v 1.1 2018/01/10 16:19:01 jaapb Exp $ + +Regenerated Oasis files (don't compile with 4.06) +--- setup.ml.orig 2015-09-02 21:53:11.000000000 +0000 ++++ setup.ml +@@ -22,9 +22,9 @@ + (* setup.ml generated for the first time by OASIS v0.2.0 *) + + (* OASIS_START *) +-(* DO NOT EDIT (digest: 8698f2327aaed46d52935d2928c5d881) *) ++(* DO NOT EDIT (digest: bfc058e9e1cbe8c726b0b3bc56fbf834) *) + (* +- Regenerated by OASIS v0.4.4 ++ Regenerated by OASIS v0.4.10 + Visit http://oasis.forge.ocamlcore.org for more information and + documentation about functions used in this file. + *) +@@ -32,16 +32,9 @@ 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 ns_ str = str ++ let s_ str = str ++ let f_ (str: ('a, 'b, 'c, 'd) format4) = str + + + let fn_ fmt1 fmt2 n = +@@ -51,90 +44,7 @@ module OASISGettext = struct + fmt2^^"" + + +- let init = +- [] +- +- +-end +- +-module OASISContext = struct +-(* # 22 "src/oasis/OASISContext.ml" *) +- +- +- open OASISGettext +- +- +- type level = +- [ `Debug +- | `Info +- | `Warning +- | `Error] +- +- +- 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; +- } +- +- +- 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; +- } +- +- +- 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", +- (* TODO: remove this chdir. *) +- Arg.String (fun str -> Sys.chdir str), +- s_ "dir Change directory before running."], +- fun () -> {!default with ignore_plugins = !ignore_plugins} ++ let init = [] + end + + module OASISString = struct +@@ -146,7 +56,7 @@ module OASISString = struct + Mostly inspired by extlib and batteries ExtString and BatString libraries. + + @author Sylvain Le Gall +- *) ++ *) + + + let nsplitf str f = +@@ -160,19 +70,19 @@ module OASISString = struct + 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 ++ 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) + +@@ -180,18 +90,18 @@ module OASISString = struct + 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 ++ while !str_idx < String.length str && ++ !what_idx < String.length what do ++ if str.[!str_idx] = what.[!what_idx] then ++ incr what_idx + else +- !str_idx - !what_idx ++ 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 = +@@ -214,19 +124,16 @@ module OASISString = struct + 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 ++ 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 +- false ++ ok := false; ++ incr str_idx ++ done; ++ !what_idx = String.length what + + + let strip_starts_with ~what str = +@@ -240,19 +147,16 @@ module OASISString = struct + 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 ++ while !ok && ++ offset <= !str_idx && ++ 0 <= !what_idx do ++ if str.[!str_idx] = what.[!what_idx] then ++ decr what_idx + else +- false ++ ok := false; ++ decr str_idx ++ done; ++ !what_idx = -1 + + + let strip_ends_with ~what str = +@@ -263,12 +167,37 @@ module OASISString = struct + + + let replace_chars f s = +- let buf = String.make (String.length s) 'X' in +- for i = 0 to String.length s - 1 do +- buf.[i] <- f s.[i] +- done; +- buf ++ 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 + +@@ -338,19 +267,15 @@ module OASISUtils = struct + + + let compare_csl s1 s2 = +- String.compare (String.lowercase s1) (String.lowercase s2) ++ String.compare (OASISString.lowercase_ascii s1) (OASISString.lowercase_ascii s2) + + + module HashStringCsl = + Hashtbl.Make + (struct + type t = string +- +- let equal s1 s2 = +- (String.lowercase s1) = (String.lowercase s2) +- +- let hash s = +- Hashtbl.hash (String.lowercase s) ++ let equal s1 s2 = (compare_csl s1 s2) = 0 ++ let hash s = Hashtbl.hash (OASISString.lowercase_ascii s) + end) + + module SetStringCsl = +@@ -388,7 +313,7 @@ module OASISUtils = struct + else + buf + in +- String.lowercase buf ++ OASISString.lowercase_ascii buf + end + + +@@ -416,6 +341,398 @@ module OASISUtils = struct + 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 +@@ -436,27 +753,27 @@ module PropList = struct + 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) ++ | 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 ++ (name, unit -> unit) Hashtbl.t + + let create () = + Hashtbl.create 13 +@@ -465,27 +782,27 @@ module PropList = struct + Hashtbl.clear t + + +-(* # 78 "src/oasis/PropList.ml" *) ++(* # 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; +- } ++ { ++ 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; +- } ++ { ++ name: name; ++ fields: (name, ('ctxt, 'extra) value) Hashtbl.t; ++ order: name Queue.t; ++ name_norm: string -> string; ++ } + + let create ?(case_insensitive=false) nm = + { +@@ -494,7 +811,7 @@ module PropList = struct + order = Queue.create (); + name_norm = + (if case_insensitive then +- String.lowercase ++ OASISString.lowercase_ascii + else + fun s -> s); + } +@@ -504,21 +821,21 @@ module PropList = struct + 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 ++ 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 +@@ -544,7 +861,7 @@ module PropList = struct + let v = + find t k + in +- f acc k v.extra v.help) ++ f acc k v.extra v.help) + acc + t.order + +@@ -562,20 +879,20 @@ module PropList = struct + 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; +- } ++ { ++ 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 ++ fun () -> incr last_id; !last_id + + let create ?schema ?name ?parse ?print ?default ?update ?help extra = + (* Default value container *) +@@ -614,33 +931,33 @@ module PropList = struct + let x = + match update with + | Some f -> +- begin +- try +- f ?context (get data) x +- with Not_set _ -> +- x +- end ++ begin ++ try ++ f ?context (get data) x ++ with Not_set _ -> ++ x ++ end + | None -> +- x ++ x + in +- Hashtbl.replace +- data +- nm +- (fun () -> v := Some x) ++ Hashtbl.replace ++ data ++ nm ++ (fun () -> v := Some x) + in + + (* Parse string value, if possible *) + let parse = + match parse with + | Some f -> +- f ++ f + | None -> +- fun ?context s -> +- failwith +- (Printf.sprintf +- (f_ "Cannot parse field '%s' when setting value %S") +- nm +- s) ++ fun ?context s -> ++ failwith ++ (Printf.sprintf ++ (f_ "Cannot parse field '%s' when setting value %S") ++ nm ++ s) + in + + (* Set data, from string *) +@@ -652,9 +969,9 @@ module PropList = struct + let print = + match print with + | Some f -> +- f ++ f + | None -> +- fun _ -> raise (No_printer nm) ++ fun _ -> raise (No_printer nm) + in + + (* Get data, as a string *) +@@ -662,22 +979,22 @@ module PropList = struct + print (get data) + in + +- begin +- match schema with +- | Some t -> +- Schema.add t nm sets gets extra help +- | None -> +- () +- end; ++ 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; +- } ++ { ++ set = set; ++ get = get; ++ sets = sets; ++ gets = gets; ++ help = help; ++ extra = extra; ++ } + + let fset data t ?context x = + t.set data ?context x +@@ -699,7 +1016,7 @@ module PropList = struct + let fld = + Field.create ?schema ?name ?parse ?print ?default ?update ?help extra + in +- fun data -> Field.fget data fld ++ fun data -> Field.fget data fld + end + end + +@@ -721,13 +1038,13 @@ module OASISMessage = struct + | `Info -> ctxt.info + | _ -> true + in +- Printf.ksprintf +- (fun str -> +- if cond then +- begin +- ctxt.printf lvl str +- end) +- fmt ++ Printf.ksprintf ++ (fun str -> ++ if cond then ++ begin ++ ctxt.printf lvl str ++ end) ++ fmt + + + let debug ~ctxt fmt = +@@ -754,12 +1071,6 @@ module OASISVersion = struct + open OASISGettext + + +- +- +- +- type s = string +- +- + type t = string + + +@@ -773,20 +1084,10 @@ module OASISVersion = struct + | 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 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 = +@@ -794,7 +1095,7 @@ module OASISVersion = struct + 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 +@@ -829,45 +1130,44 @@ module OASISVersion = struct + 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 ++ 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 ++ 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 ++ 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 +@@ -876,16 +1176,12 @@ module OASISVersion = struct + let string_of_version t = t + + +- let version_compare_string s1 s2 = +- version_compare (version_of_string s1) (version_of_string s2) +- +- + let chop t = + try + let pos = + String.rindex t '.' + in +- String.sub t 0 pos ++ String.sub t 0 pos + with Not_found -> + t + +@@ -893,19 +1189,19 @@ module OASISVersion = struct + let rec comparator_apply v op = + match op with + | VGreater cv -> +- (version_compare v cv) > 0 ++ (version_compare v cv) > 0 + | VGreaterEqual cv -> +- (version_compare v cv) >= 0 ++ (version_compare v cv) >= 0 + | VLesser cv -> +- (version_compare v cv) < 0 ++ (version_compare v cv) < 0 + | VLesserEqual cv -> +- (version_compare v cv) <= 0 ++ (version_compare v cv) <= 0 + | VEqual cv -> +- (version_compare v cv) = 0 ++ (version_compare v cv) = 0 + | VOr (op1, op2) -> +- (comparator_apply v op1) || (comparator_apply v op2) ++ (comparator_apply v op1) || (comparator_apply v op2) + | VAnd (op1, op2) -> +- (comparator_apply v op1) && (comparator_apply v op2) ++ (comparator_apply v op1) && (comparator_apply v op2) + + + let rec string_of_comparator = +@@ -916,9 +1212,9 @@ module OASISVersion = struct + | VGreaterEqual v -> ">= "^(string_of_version v) + | VLesserEqual v -> "<= "^(string_of_version v) + | VOr (c1, c2) -> +- (string_of_comparator c1)^" || "^(string_of_comparator c2) ++ (string_of_comparator c1)^" || "^(string_of_comparator c2) + | VAnd (c1, c2) -> +- (string_of_comparator c1)^" && "^(string_of_comparator c2) ++ (string_of_comparator c1)^" && "^(string_of_comparator c2) + + + let rec varname_of_comparator = +@@ -928,28 +1224,16 @@ module OASISVersion = struct + (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) +- +- +- let rec comparator_ge v' = +- let cmp v = version_compare v v' >= 0 in + function +- | VEqual v +- | VGreaterEqual v +- | VGreater v -> cmp v +- | VLesserEqual _ +- | VLesser _ -> false +- | VOr (c1, c2) -> comparator_ge v' c1 || comparator_ge v' c2 +- | VAnd (c1, c2) -> comparator_ge v' c1 && comparator_ge v' c2 ++ | 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 +@@ -960,15 +1244,10 @@ module OASISLicense = struct + + (** License for _oasis fields + @author Sylvain Le Gall +- *) +- +- +- ++ *) + + + type license = string +- +- + type license_exception = string + + +@@ -978,7 +1257,6 @@ module OASISLicense = struct + | NoVersion + + +- + type license_dep_5_unit = + { + license: license; +@@ -987,7 +1265,6 @@ module OASISLicense = struct + } + + +- + type license_dep_5 = + | DEP5Unit of license_dep_5_unit + | DEP5Or of license_dep_5 list +@@ -999,22 +1276,17 @@ module OASISLicense = struct + | OtherLicense of string (* URL *) + + +- + end + + module OASISExpr = struct + (* # 22 "src/oasis/OASISExpr.ml" *) + + +- +- +- + open OASISGettext ++ open OASISUtils + + + type test = string +- +- + type flag = string + + +@@ -1027,7 +1299,6 @@ module OASISExpr = struct + | ETest of test * string + + +- + type 'a choices = (t * 'a) list + + +@@ -1099,20 +1370,148 @@ module OASISExpr = struct + choose_aux (List.rev lst) + + +-end ++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 ++ + +-module OASISText = struct +-(* # 22 "src/oasis/OASISText.ml" *) ++ 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; ++ ]; ++ } + +- type elt = +- | Para of string +- | Verbatim of string +- | BlankLine ++ 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 + + +- type t = elt list ++ let to_string t = t.Templater.origin ++ + + end + +@@ -1120,16 +1519,13 @@ 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 +- type host_dirname = string +- type host_filename = 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 +@@ -1146,19 +1542,16 @@ module OASISTypes = struct + | 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 +@@ -1171,30 +1564,29 @@ module OASISTypes = struct + | OtherVCS of url + + +- + type plugin_kind = +- [ `Configure +- | `Build +- | `Doc +- | `Test +- | `Install +- | `Extra +- ] ++ [ `Configure ++ | `Build ++ | `Doc ++ | `Test ++ | `Install ++ | `Extra ++ ] + + + type plugin_data_purpose = +- [ `Configure +- | `Build +- | `Install +- | `Clean +- | `Distclean +- | `Install +- | `Uninstall +- | `Test +- | `Doc +- | `Extra +- | `Other of string +- ] ++ [ `Configure ++ | `Build ++ | `Install ++ | `Clean ++ | `Distclean ++ | `Install ++ | `Uninstall ++ | `Test ++ | `Doc ++ | `Extra ++ | `Other of string ++ ] + + + type 'a plugin = 'a * name * OASISVersion.t option +@@ -1206,129 +1598,128 @@ module OASISTypes = struct + type plugin_data = (all_plugin * plugin_data_purpose * (unit -> unit)) list + + +-(* # 115 "src/oasis/OASISTypes.ml" *) +- +- + type 'a conditional = 'a OASISExpr.choices + + + type custom = +- { +- pre_command: (command_line option) conditional; +- post_command: (command_line option) conditional; +- } +- ++ { ++ 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; +- } +- ++ { ++ 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_c_sources: unix_filename list; +- bs_data_files: (unix_filename * unix_filename option) 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; +- } +- ++ { ++ 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 = +- { +- lib_modules: string list; +- lib_pack: bool; +- lib_internal_modules: string list; +- lib_findlib_parent: findlib_name option; +- lib_findlib_name: findlib_name option; +- lib_findlib_containers: findlib_name list; +- } ++ { ++ lib_modules: string list; ++ lib_pack: bool; ++ lib_internal_modules: string list; ++ lib_findlib_parent: findlib_name option; ++ lib_findlib_name: findlib_name option; ++ lib_findlib_directory: unix_dirname option; ++ lib_findlib_containers: findlib_name list; ++ } + + + type object_ = +- { +- obj_modules: string list; +- obj_findlib_fullname: findlib_name list option; +- } ++ { ++ obj_modules: string list; ++ obj_findlib_fullname: findlib_name list option; ++ obj_findlib_directory: unix_dirname option; ++ } + + + type executable = +- { +- exec_custom: bool; +- exec_main_is: unix_filename; +- } ++ { ++ exec_custom: bool; ++ exec_main_is: unix_filename; ++ } + + + type flag = +- { +- flag_description: string option; +- flag_default: bool conditional; +- } ++ { ++ flag_description: string option; ++ flag_default: bool conditional; ++ } + + + type source_repository = +- { +- src_repo_type: vcs; +- src_repo_location: url; +- src_repo_browser: url option; +- src_repo_module: string option; +- src_repo_branch: string option; +- src_repo_tag: string option; +- src_repo_subdir: unix_filename option; +- } ++ { ++ src_repo_type: vcs; ++ src_repo_location: url; ++ src_repo_browser: url option; ++ src_repo_module: string option; ++ src_repo_branch: string option; ++ src_repo_tag: string option; ++ src_repo_subdir: unix_filename option; ++ } + + + type test = +- { +- test_type: [`Test] plugin; +- test_command: command_line conditional; +- test_custom: custom; +- test_working_directory: unix_filename option; +- test_run: bool conditional; +- test_tools: tool list; +- } ++ { ++ test_type: [`Test] plugin; ++ test_command: command_line conditional; ++ test_custom: custom; ++ test_working_directory: unix_filename option; ++ test_run: bool conditional; ++ test_tools: tool list; ++ } + + + type doc_format = +- | HTML of unix_filename ++ | HTML of unix_filename (* TODO: source filename. *) + | DocText + | PDF + | PostScript +- | Info of unix_filename ++ | Info of unix_filename (* TODO: source filename. *) + | DVI + | OtherDoc + + +- + type doc = +- { +- doc_type: [`Doc] plugin; +- doc_custom: custom; +- doc_build: bool conditional; +- doc_install: bool conditional; +- doc_install_dir: unix_filename; +- doc_title: string; +- doc_authors: string list; +- doc_abstract: string option; +- doc_format: doc_format; +- doc_data_files: (unix_filename * unix_filename option) list; +- doc_build_tools: tool list; +- } ++ { ++ doc_type: [`Doc] plugin; ++ doc_custom: custom; ++ doc_build: bool conditional; ++ doc_install: bool conditional; ++ doc_install_dir: unix_filename; (* TODO: dest filename ?. *) ++ doc_title: string; ++ doc_authors: string list; ++ doc_abstract: string option; ++ doc_format: doc_format; ++ (* TODO: src filename. *) ++ doc_data_files: (unix_filename * unix_filename option) list; ++ doc_build_tools: tool list; ++ } + + + type section = +@@ -1341,50 +1732,51 @@ module OASISTypes = struct + | Doc of common_section * doc + + +- + type section_kind = +- [ `Library | `Object | `Executable | `Flag | `SrcRepo | `Test | `Doc ] ++ [ `Library | `Object | `Executable | `Flag | `SrcRepo | `Test | `Doc ] + + + type package = +- { +- oasis_version: OASISVersion.t; +- ocaml_version: OASISVersion.comparator option; +- findlib_version: OASISVersion.comparator option; +- alpha_features: string list; +- beta_features: string list; +- name: package_name; +- version: OASISVersion.t; +- license: OASISLicense.t; +- license_file: unix_filename option; +- copyrights: string list; +- maintainers: string list; +- authors: string list; +- homepage: url option; +- synopsis: string; +- description: OASISText.t option; +- categories: url list; +- +- conf_type: [`Configure] plugin; +- conf_custom: custom; +- +- build_type: [`Build] plugin; +- build_custom: custom; +- +- install_type: [`Install] plugin; +- install_custom: custom; +- uninstall_custom: custom; +- +- clean_custom: custom; +- distclean_custom: custom; +- +- files_ab: unix_filename list; +- sections: section list; +- plugins: [`Extra] plugin list; +- disable_oasis_section: unix_filename list; +- schema_data: PropList.Data.t; +- plugin_data: plugin_data; +- } ++ { ++ oasis_version: OASISVersion.t; ++ ocaml_version: OASISVersion.comparator option; ++ findlib_version: OASISVersion.comparator option; ++ alpha_features: string list; ++ beta_features: string list; ++ name: package_name; ++ version: OASISVersion.t; ++ license: OASISLicense.t; ++ license_file: unix_filename option; (* TODO: source filename. *) ++ copyrights: string list; ++ maintainers: string list; ++ authors: string list; ++ homepage: url option; ++ bugreports: url option; ++ synopsis: string; ++ description: OASISText.t option; ++ tags: string list; ++ categories: url list; ++ ++ conf_type: [`Configure] plugin; ++ conf_custom: custom; ++ ++ build_type: [`Build] plugin; ++ build_custom: custom; ++ ++ install_type: [`Install] plugin; ++ install_custom: custom; ++ uninstall_custom: custom; ++ ++ clean_custom: custom; ++ distclean_custom: custom; ++ ++ files_ab: unix_filename list; (* TODO: source filename. *) ++ sections: section list; ++ plugins: [`Extra] plugin list; ++ disable_oasis_section: unix_filename list; (* TODO: source filename. *) ++ schema_data: PropList.Data.t; ++ plugin_data: plugin_data; ++ } + + + end +@@ -1400,19 +1792,19 @@ module OASISFeatures = struct + module MapPlugin = + Map.Make + (struct +- type t = plugin_kind * name +- let compare = Pervasives.compare +- end) ++ type t = plugin_kind * name ++ let compare = Pervasives.compare ++ end) + + module Data = + struct + type t = +- { +- oasis_version: OASISVersion.t; +- plugin_versions: OASISVersion.t option MapPlugin.t; +- alpha_features: string list; +- beta_features: string list; +- } ++ { ++ oasis_version: OASISVersion.t; ++ plugin_versions: OASISVersion.t option MapPlugin.t; ++ alpha_features: string list; ++ beta_features: string list; ++ } + + let create oasis_version alpha_features beta_features = + { +@@ -1430,10 +1822,10 @@ module OASISFeatures = struct + + let add_plugin (plugin_kind, plugin_name, plugin_version) t = + {t with +- plugin_versions = MapPlugin.add +- (plugin_kind, plugin_name) +- plugin_version +- t.plugin_versions} ++ plugin_versions = MapPlugin.add ++ (plugin_kind, plugin_name) ++ plugin_version ++ t.plugin_versions} + + let plugin_version plugin_kind plugin_name t = + MapPlugin.find (plugin_kind, plugin_name) t.plugin_versions +@@ -1442,17 +1834,17 @@ module OASISFeatures = struct + Printf.sprintf + "oasis_version: %s; alpha_features: %s; beta_features: %s; \ + plugins_version: %s" +- (OASISVersion.string_of_version t.oasis_version) ++ (OASISVersion.string_of_version (t:t).oasis_version) + (String.concat ", " t.alpha_features) + (String.concat ", " t.beta_features) + (String.concat ", " + (MapPlugin.fold + (fun (_, plg) ver_opt acc -> + (plg^ +- (match ver_opt with +- | Some v -> +- " "^(OASISVersion.string_of_version v) +- | None -> "")) ++ (match ver_opt with ++ | Some v -> ++ " "^(OASISVersion.string_of_version v) ++ | None -> "")) + :: acc) + t.plugin_versions [])) + end +@@ -1467,24 +1859,24 @@ module OASISFeatures = struct + + let string_of_stage = + function +- | Alpha -> "alpha" +- | Beta -> "beta" ++ | Alpha -> "alpha" ++ | Beta -> "beta" + + + let field_of_stage = + function +- | Alpha -> "AlphaFeatures" +- | Beta -> "BetaFeatures" ++ | Alpha -> "AlphaFeatures" ++ | Beta -> "BetaFeatures" + + type publication = InDev of stage | SinceVersion of OASISVersion.t + + type t = +- { +- name: string; +- plugin: all_plugin option; +- publication: publication; +- description: unit -> string; +- } ++ { ++ name: string; ++ plugin: all_plugin option; ++ publication: publication; ++ description: unit -> string; ++ } + + (* TODO: mutex protect this. *) + let all_features = Hashtbl.create 13 +@@ -1498,35 +1890,35 @@ module OASISFeatures = struct + let to_string t = + Printf.sprintf + "feature: %s; plugin: %s; publication: %s" +- t.name ++ (t:t).name + (match t.plugin with +- | None -> "<none>" +- | Some (_, nm, _) -> nm) ++ | None -> "<none>" ++ | Some (_, nm, _) -> nm) + (match t.publication with +- | InDev stage -> string_of_stage stage +- | SinceVersion ver -> ">= "^(OASISVersion.string_of_version ver)) ++ | InDev stage -> string_of_stage stage ++ | SinceVersion ver -> ">= "^(OASISVersion.string_of_version ver)) + + let data_check t data origin = + let no_message = "no message" in + + let check_feature features stage = +- let has_feature = List.mem t.name features in ++ let has_feature = List.mem (t:t).name features in + if not has_feature then +- match origin with +- | Field (fld, where) -> +- Some +- (Printf.sprintf +- (f_ "Field %s in %s is only available when feature %s \ +- is in field %s.") +- fld where t.name (field_of_stage stage)) +- | Section sct -> +- Some +- (Printf.sprintf +- (f_ "Section %s is only available when features %s \ +- is in field %s.") +- sct t.name (field_of_stage stage)) +- | NoOrigin -> +- Some no_message ++ match (origin:origin) with ++ | Field (fld, where) -> ++ Some ++ (Printf.sprintf ++ (f_ "Field %s in %s is only available when feature %s \ ++ is in field %s.") ++ fld where t.name (field_of_stage stage)) ++ | Section sct -> ++ Some ++ (Printf.sprintf ++ (f_ "Section %s is only available when features %s \ ++ is in field %s.") ++ sct t.name (field_of_stage stage)) ++ | NoOrigin -> ++ Some no_message + else + None + in +@@ -1536,132 +1928,128 @@ module OASISFeatures = struct + OASISVersion.comparator_apply + version (OASISVersion.VGreaterEqual min_version) + in +- Printf.ksprintf +- (fun str -> +- if version_is_good then +- None +- else +- Some str) +- fmt ++ Printf.ksprintf ++ (fun str -> if version_is_good then None else Some str) ++ fmt + in + + match origin, t.plugin, t.publication with +- | _, _, InDev Alpha -> check_feature data.Data.alpha_features Alpha +- | _, _, InDev Beta -> check_feature data.Data.beta_features Beta +- | Field(fld, where), None, SinceVersion min_version -> +- version_is_good ~min_version data.Data.oasis_version +- (f_ "Field %s in %s is only valid since OASIS v%s, update \ +- OASISFormat field from '%s' to '%s' after checking \ +- OASIS changelog.") +- fld where (string_of_version min_version) +- (string_of_version data.Data.oasis_version) +- (string_of_version min_version) ++ | _, _, InDev Alpha -> check_feature data.Data.alpha_features Alpha ++ | _, _, InDev Beta -> check_feature data.Data.beta_features Beta ++ | Field(fld, where), None, SinceVersion min_version -> ++ version_is_good ~min_version data.Data.oasis_version ++ (f_ "Field %s in %s is only valid since OASIS v%s, update \ ++ OASISFormat field from '%s' to '%s' after checking \ ++ OASIS changelog.") ++ fld where (string_of_version min_version) ++ (string_of_version data.Data.oasis_version) ++ (string_of_version min_version) + +- | Field(fld, where), Some(plugin_knd, plugin_name, _), +- SinceVersion min_version -> +- begin ++ | Field(fld, where), Some(plugin_knd, plugin_name, _), ++ SinceVersion min_version -> ++ begin ++ try ++ let plugin_version_current = + try +- let plugin_version_current = +- try +- match Data.plugin_version plugin_knd plugin_name data with +- | Some ver -> ver +- | None -> +- failwithf +- (f_ "Field %s in %s is only valid for the OASIS \ +- plugin %s since v%s, but no plugin version is \ +- defined in the _oasis file, change '%s' to \ +- '%s (%s)' in your _oasis file.") +- fld where plugin_name (string_of_version min_version) +- plugin_name +- plugin_name (string_of_version min_version) +- with Not_found -> +- failwithf +- (f_ "Field %s in %s is only valid when the OASIS plugin %s \ +- is defined.") +- fld where plugin_name +- in +- version_is_good ~min_version plugin_version_current +- (f_ "Field %s in %s is only valid for the OASIS plugin %s \ +- since v%s, update your plugin from '%s (%s)' to \ +- '%s (%s)' after checking the plugin's changelog.") +- fld where plugin_name (string_of_version min_version) +- plugin_name (string_of_version plugin_version_current) +- plugin_name (string_of_version min_version) +- with Failure msg -> +- Some msg +- end ++ match Data.plugin_version plugin_knd plugin_name data with ++ | Some ver -> ver ++ | None -> ++ failwithf ++ (f_ "Field %s in %s is only valid for the OASIS \ ++ plugin %s since v%s, but no plugin version is \ ++ defined in the _oasis file, change '%s' to \ ++ '%s (%s)' in your _oasis file.") ++ fld where plugin_name (string_of_version min_version) ++ plugin_name ++ plugin_name (string_of_version min_version) ++ with Not_found -> ++ failwithf ++ (f_ "Field %s in %s is only valid when the OASIS plugin %s \ ++ is defined.") ++ fld where plugin_name ++ in ++ version_is_good ~min_version plugin_version_current ++ (f_ "Field %s in %s is only valid for the OASIS plugin %s \ ++ since v%s, update your plugin from '%s (%s)' to \ ++ '%s (%s)' after checking the plugin's changelog.") ++ fld where plugin_name (string_of_version min_version) ++ plugin_name (string_of_version plugin_version_current) ++ plugin_name (string_of_version min_version) ++ with Failure msg -> ++ Some msg ++ end + +- | Section sct, None, SinceVersion min_version -> +- version_is_good ~min_version data.Data.oasis_version +- (f_ "Section %s is only valid for since OASIS v%s, update \ +- OASISFormat field from '%s' to '%s' after checking OASIS \ +- changelog.") +- sct (string_of_version min_version) +- (string_of_version data.Data.oasis_version) +- (string_of_version min_version) ++ | Section sct, None, SinceVersion min_version -> ++ version_is_good ~min_version data.Data.oasis_version ++ (f_ "Section %s is only valid for since OASIS v%s, update \ ++ OASISFormat field from '%s' to '%s' after checking OASIS \ ++ changelog.") ++ sct (string_of_version min_version) ++ (string_of_version data.Data.oasis_version) ++ (string_of_version min_version) + +- | Section sct, Some(plugin_knd, plugin_name, _), +- SinceVersion min_version -> +- begin ++ | Section sct, Some(plugin_knd, plugin_name, _), ++ SinceVersion min_version -> ++ begin ++ try ++ let plugin_version_current = + try +- let plugin_version_current = +- try +- match Data.plugin_version plugin_knd plugin_name data with +- | Some ver -> ver +- | None -> +- failwithf +- (f_ "Section %s is only valid for the OASIS \ +- plugin %s since v%s, but no plugin version is \ +- defined in the _oasis file, change '%s' to \ +- '%s (%s)' in your _oasis file.") +- sct plugin_name (string_of_version min_version) +- plugin_name +- plugin_name (string_of_version min_version) +- with Not_found -> +- failwithf +- (f_ "Section %s is only valid when the OASIS plugin %s \ +- is defined.") +- sct plugin_name +- in +- version_is_good ~min_version plugin_version_current +- (f_ "Section %s is only valid for the OASIS plugin %s \ +- since v%s, update your plugin from '%s (%s)' to \ +- '%s (%s)' after checking the plugin's changelog.") +- sct plugin_name (string_of_version min_version) +- plugin_name (string_of_version plugin_version_current) +- plugin_name (string_of_version min_version) +- with Failure msg -> +- Some msg +- end ++ match Data.plugin_version plugin_knd plugin_name data with ++ | Some ver -> ver ++ | None -> ++ failwithf ++ (f_ "Section %s is only valid for the OASIS \ ++ plugin %s since v%s, but no plugin version is \ ++ defined in the _oasis file, change '%s' to \ ++ '%s (%s)' in your _oasis file.") ++ sct plugin_name (string_of_version min_version) ++ plugin_name ++ plugin_name (string_of_version min_version) ++ with Not_found -> ++ failwithf ++ (f_ "Section %s is only valid when the OASIS plugin %s \ ++ is defined.") ++ sct plugin_name ++ in ++ version_is_good ~min_version plugin_version_current ++ (f_ "Section %s is only valid for the OASIS plugin %s \ ++ since v%s, update your plugin from '%s (%s)' to \ ++ '%s (%s)' after checking the plugin's changelog.") ++ sct plugin_name (string_of_version min_version) ++ plugin_name (string_of_version plugin_version_current) ++ plugin_name (string_of_version min_version) ++ with Failure msg -> ++ Some msg ++ end + +- | NoOrigin, None, SinceVersion min_version -> +- version_is_good ~min_version data.Data.oasis_version "%s" no_message ++ | NoOrigin, None, SinceVersion min_version -> ++ version_is_good ~min_version data.Data.oasis_version "%s" no_message + +- | NoOrigin, Some(plugin_knd, plugin_name, _), SinceVersion min_version -> +- begin +- try +- let plugin_version_current = +- match Data.plugin_version plugin_knd plugin_name data with +- | Some ver -> ver +- | None -> raise Not_found +- in +- version_is_good ~min_version plugin_version_current +- "%s" no_message +- with Not_found -> +- Some no_message +- end ++ | NoOrigin, Some(plugin_knd, plugin_name, _), SinceVersion min_version -> ++ begin ++ try ++ let plugin_version_current = ++ match Data.plugin_version plugin_knd plugin_name data with ++ | Some ver -> ver ++ | None -> raise Not_found ++ in ++ version_is_good ~min_version plugin_version_current ++ "%s" no_message ++ with Not_found -> ++ Some no_message ++ end + + + let data_assert t data origin = + match data_check t data origin with +- | None -> () +- | Some str -> failwith str ++ | None -> () ++ | Some str -> failwith str + + + let data_test t data = + match data_check t data NoOrigin with +- | None -> true +- | Some str -> false ++ | None -> true ++ | Some _ -> false + + + let package_test t pkg = +@@ -1681,8 +2069,8 @@ module OASISFeatures = struct + description = description; + } + in +- Hashtbl.add all_features name t; +- t ++ Hashtbl.add all_features name t; ++ t + + + let get_stage name = +@@ -1711,14 +2099,14 @@ module OASISFeatures = struct + create "flag_docs" + (since_version "0.3") + (fun () -> +- s_ "Building docs require '-docs' flag at configure.") ++ s_ "Make building docs require '-docs' flag at configure.") + + + let flag_tests = + create "flag_tests" + (since_version "0.3") + (fun () -> +- s_ "Running tests require '-tests' flag at configure.") ++ s_ "Make running tests require '-tests' flag at configure.") + + + let pack = +@@ -1743,146 +2131,36 @@ module OASISFeatures = struct + let compiled_setup_ml = + create "compiled_setup_ml" alpha + (fun () -> +- s_ "It compiles the setup.ml and speed-up actions done with it.") ++ s_ "Compile the setup.ml and speed-up actions done with it.") + + let disable_oasis_section = + create "disable_oasis_section" alpha + (fun () -> +- s_ "Allows the OASIS section comments and digest to be omitted in \ +- generated files.") +-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 (String.capitalize base) +- +- +- let uncapitalize_file f = +- let dir = dirname f in +- let base = basename f in +- concat dir (String.uncapitalize base) +- +- +-end +- +-module OASISHostPath = struct +-(* # 22 "src/oasis/OASISHostPath.ml" *) +- +- +- open Filename +- +- +- module Unix = OASISUnixPath +- +- +- let make = +- function +- | [] -> +- invalid_arg "OASISHostPath.make" +- | hd :: tl -> +- List.fold_left Filename.concat hd tl ++ s_ "Allow the OASIS section comments and digests to be omitted in \ ++ generated files.") + ++ let no_automatic_syntax = ++ create "no_automatic_syntax" alpha ++ (fun () -> ++ s_ "Disable the automatic inclusion of -syntax camlp4o for packages \ ++ that matches the internal heuristic (if a dependency ends with \ ++ a .syntax or is a well known syntax).") + +- let of_unix ufn = +- if Sys.os_type = "Unix" then +- ufn +- else +- 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 '/')) ++ let findlib_directory = ++ create "findlib_directory" beta ++ (fun () -> ++ s_ "Allow to install findlib libraries in sub-directories of the target \ ++ findlib directory.") + ++ let findlib_extra_files = ++ create "findlib_extra_files" beta ++ (fun () -> ++ s_ "Allow to install extra files for findlib libraries.") + ++ let source_patterns = ++ create "source_patterns" alpha ++ (fun () -> ++ s_ "Customize mapping between module name and source file.") + end + + module OASISSection = struct +@@ -1895,19 +2173,19 @@ module OASISSection = struct + let section_kind_common = + function + | Library (cs, _, _) -> +- `Library, cs ++ `Library, cs + | Object (cs, _, _) -> +- `Object, cs ++ `Object, cs + | Executable (cs, _, _) -> +- `Executable, cs ++ `Executable, cs + | Flag (cs, _) -> +- `Flag, cs ++ `Flag, cs + | SrcRepo (cs, _) -> +- `SrcRepo, cs ++ `SrcRepo, cs + | Test (cs, _) -> +- `Test, cs ++ `Test, cs + | Doc (cs, _) -> +- `Doc, cs ++ `Doc, cs + + + let section_common sct = +@@ -1926,27 +2204,28 @@ module OASISSection = struct + + + (** Key used to identify section +- *) ++ *) + let section_id sct = + let k, cs = + section_kind_common sct + in +- k, cs.cs_name ++ k, cs.cs_name ++ ++ ++ let string_of_section_kind = ++ function ++ | `Library -> "library" ++ | `Object -> "object" ++ | `Executable -> "executable" ++ | `Flag -> "flag" ++ | `SrcRepo -> "src repository" ++ | `Test -> "test" ++ | `Doc -> "doc" + + + let string_of_section sct = +- let k, nm = +- section_id sct +- in +- (match k with +- | `Library -> "library" +- | `Object -> "object" +- | `Executable -> "executable" +- | `Flag -> "flag" +- | `SrcRepo -> "src repository" +- | `Test -> "test" +- | `Doc -> "doc") +- ^" "^nm ++ let k, nm = section_id sct in ++ (string_of_section_kind k)^" "^nm + + + let section_find id scts = +@@ -1981,6 +2260,32 @@ end + module OASISBuildSection = struct + (* # 22 "src/oasis/OASISBuildSection.ml" *) + ++ open OASISTypes ++ ++ (* Look for a module file, considering capitalization or not. *) ++ let find_module source_file_exists bs modul = ++ let possible_lst = ++ OASISSourcePatterns.all_possible_files ++ (bs.bs_interface_patterns @ bs.bs_implementation_patterns) ++ ~path:bs.bs_path ++ ~modul ++ in ++ match List.filter source_file_exists possible_lst with ++ | (fn :: _) as fn_lst -> `Sources (OASISUnixPath.chop_extension fn, fn_lst) ++ | [] -> ++ let open OASISUtils in ++ let _, rev_lst = ++ List.fold_left ++ (fun (set, acc) fn -> ++ let base_fn = OASISUnixPath.chop_extension fn in ++ if SetString.mem base_fn set then ++ set, acc ++ else ++ SetString.add base_fn set, base_fn :: acc) ++ (SetString.empty, []) possible_lst ++ in ++ `No_sources (List.rev rev_lst) ++ + + end + +@@ -2004,16 +2309,16 @@ module OASISExecutable = struct + | Byte -> false + in + +- OASISUnixPath.concat +- dir +- (cs.cs_name^(suffix_program ())), +- +- if not is_native_exec && +- not exec.exec_custom && +- bs.bs_c_sources <> [] then +- Some (dir^"/dll"^cs.cs_name^"_stubs"^(ext_dll ())) +- else +- None ++ OASISUnixPath.concat ++ dir ++ (cs.cs_name^(suffix_program ())), ++ ++ if not is_native_exec && ++ not exec.exec_custom && ++ bs.bs_c_sources <> [] then ++ Some (dir^"/dll"^cs.cs_name^"_stubs"^(ext_dll ())) ++ else ++ None + + + end +@@ -2023,144 +2328,109 @@ module OASISLibrary = struct + + + open OASISTypes +- open OASISUtils + open OASISGettext +- open OASISSection +- +- +- (* Look for a module file, considering capitalization or not. *) +- let find_module source_file_exists bs modul = +- let possible_base_fn = +- List.map +- (OASISUnixPath.concat bs.bs_path) +- [modul; +- OASISUnixPath.uncapitalize_file modul; +- OASISUnixPath.capitalize_file modul] +- in +- (* TODO: we should be able to be able to determine the source for every +- * files. Hence we should introduce a Module(source: fn) for the fields +- * Modules and InternalModules +- *) +- List.fold_left +- (fun acc base_fn -> +- match acc with +- | `No_sources _ -> +- begin +- let file_found = +- List.fold_left +- (fun acc ext -> +- if source_file_exists (base_fn^ext) then +- (base_fn^ext) :: acc +- else +- acc) +- [] +- [".ml"; ".mli"; ".mll"; ".mly"] +- in +- match file_found with +- | [] -> +- acc +- | lst -> +- `Sources (base_fn, lst) +- end +- | `Sources _ -> +- acc) +- (`No_sources possible_base_fn) +- possible_base_fn + ++ let find_module ~ctxt source_file_exists cs bs modul = ++ match OASISBuildSection.find_module source_file_exists bs modul with ++ | `Sources _ as res -> res ++ | `No_sources _ as res -> ++ OASISMessage.warning ++ ~ctxt ++ (f_ "Cannot find source file matching module '%s' in library %s.") ++ modul cs.cs_name; ++ OASISMessage.warning ++ ~ctxt ++ (f_ "Use InterfacePatterns or ImplementationPatterns to define \ ++ this file with feature %S.") ++ (OASISFeatures.source_patterns.OASISFeatures.name); ++ res + + let source_unix_files ~ctxt (cs, bs, lib) source_file_exists = + List.fold_left + (fun acc modul -> +- match find_module source_file_exists bs modul with +- | `Sources (base_fn, lst) -> +- (base_fn, lst) :: acc +- | `No_sources _ -> +- OASISMessage.warning +- ~ctxt +- (f_ "Cannot find source file matching \ +- module '%s' in library %s") +- modul cs.cs_name; +- acc) ++ match find_module ~ctxt source_file_exists cs bs modul with ++ | `Sources (base_fn, lst) -> (base_fn, lst) :: acc ++ | `No_sources _ -> acc) + [] + (lib.lib_modules @ lib.lib_internal_modules) + + + let generated_unix_files +- ~ctxt +- ~is_native +- ~has_native_dynlink +- ~ext_lib +- ~ext_dll +- ~source_file_exists +- (cs, bs, lib) = ++ ~ctxt ++ ~is_native ++ ~has_native_dynlink ++ ~ext_lib ++ ~ext_dll ++ ~source_file_exists ++ (cs, bs, lib) = + + let find_modules lst ext = + let find_module modul = +- match find_module source_file_exists bs modul with +- | `Sources (base_fn, [fn]) when ext <> "cmi" +- && Filename.check_suffix fn ".mli" -> +- None (* No implementation files for pure interface. *) +- | `Sources (base_fn, _) -> +- Some [base_fn] +- | `No_sources lst -> +- OASISMessage.warning +- ~ctxt +- (f_ "Cannot find source file matching \ +- module '%s' in library %s") +- modul cs.cs_name; +- Some lst ++ match find_module ~ctxt source_file_exists cs bs modul with ++ | `Sources (_, [fn]) when ext <> "cmi" ++ && Filename.check_suffix fn ".mli" -> ++ None (* No implementation files for pure interface. *) ++ | `Sources (base_fn, _) -> Some [base_fn] ++ | `No_sources lst -> Some lst + in + List.fold_left + (fun acc nm -> +- match find_module nm with +- | None -> acc +- | Some base_fns -> +- List.map (fun base_fn -> base_fn ^"."^ext) base_fns :: acc) ++ match find_module nm with ++ | None -> acc ++ | Some base_fns -> ++ List.map (fun base_fn -> base_fn ^"."^ext) base_fns :: acc) + [] + lst + in + +- (* The headers that should be compiled along *) +- let headers = +- if lib.lib_pack then +- [] +- else +- find_modules +- lib.lib_modules +- "cmi" +- in +- + (* The .cmx that be compiled along *) + let cmxs = + let should_be_built = + match bs.bs_compiled_object with +- | Native -> true +- | Best -> is_native +- | Byte -> false +- in +- if should_be_built then +- if lib.lib_pack then +- find_modules +- [cs.cs_name] +- "cmx" +- else +- find_modules +- (lib.lib_modules @ lib.lib_internal_modules) +- "cmx" ++ | Native -> true ++ | Best -> is_native ++ | Byte -> false ++ in ++ if should_be_built then ++ if lib.lib_pack then ++ find_modules ++ [cs.cs_name] ++ "cmx" + else +- [] ++ find_modules ++ (lib.lib_modules @ lib.lib_internal_modules) ++ "cmx" ++ else ++ [] + in + + let acc_nopath = + [] + in + ++ (* The headers and annot/cmt files that should be compiled along *) ++ let headers = ++ let sufx = ++ if lib.lib_pack ++ then [".cmti"; ".cmt"; ".annot"] ++ else [".cmi"; ".cmti"; ".cmt"; ".annot"] ++ in ++ List.map ++ (List.fold_left ++ (fun accu s -> ++ let dot = String.rindex s '.' in ++ let base = String.sub s 0 dot in ++ List.map ((^) base) sufx @ accu) ++ []) ++ (find_modules lib.lib_modules "cmi") ++ in ++ + (* Compute what libraries should be built *) + let acc_nopath = + (* Add the packed header file if required *) + let add_pack_header acc = + if lib.lib_pack then +- [cs.cs_name^".cmi"] :: acc ++ [cs.cs_name^".cmi"; cs.cs_name^".cmti"; cs.cs_name^".cmt"] :: acc + else + acc + in +@@ -2174,38 +2444,35 @@ module OASISLibrary = struct + [cs.cs_name^".cmxs"] :: acc + else acc) + in +- [cs.cs_name^".cmxa"] :: [cs.cs_name^ext_lib] :: acc ++ [cs.cs_name^".cmxa"] :: [cs.cs_name^ext_lib] :: acc + in +- match bs.bs_compiled_object with +- | Native -> +- byte (native acc_nopath) +- | Best when is_native -> +- byte (native acc_nopath) +- | Byte | Best -> +- byte acc_nopath ++ match bs.bs_compiled_object with ++ | Native -> byte (native acc_nopath) ++ | Best when is_native -> byte (native acc_nopath) ++ | Byte | Best -> byte acc_nopath + in + + (* Add C library to be built *) + let acc_nopath = +- if bs.bs_c_sources <> [] then +- begin +- ["lib"^cs.cs_name^"_stubs"^ext_lib] +- :: +- ["dll"^cs.cs_name^"_stubs"^ext_dll] +- :: ++ if bs.bs_c_sources <> [] then begin ++ ["lib"^cs.cs_name^"_stubs"^ext_lib] ++ :: ++ if has_native_dynlink then ++ ["dll"^cs.cs_name^"_stubs"^ext_dll] :: acc_nopath ++ else + acc_nopath +- end +- else ++ end else begin + acc_nopath ++ end + in + +- (* All the files generated *) +- List.rev_append +- (List.rev_map +- (List.rev_map +- (OASISUnixPath.concat bs.bs_path)) +- acc_nopath) +- (headers @ cmxs) ++ (* All the files generated *) ++ List.rev_append ++ (List.rev_map ++ (List.rev_map ++ (OASISUnixPath.concat bs.bs_path)) ++ acc_nopath) ++ (headers @ cmxs) + + + end +@@ -2218,62 +2485,64 @@ module OASISObject = struct + open OASISGettext + + ++ let find_module ~ctxt source_file_exists cs bs modul = ++ match OASISBuildSection.find_module source_file_exists bs modul with ++ | `Sources _ as res -> res ++ | `No_sources _ as res -> ++ OASISMessage.warning ++ ~ctxt ++ (f_ "Cannot find source file matching module '%s' in object %s.") ++ modul cs.cs_name; ++ OASISMessage.warning ++ ~ctxt ++ (f_ "Use InterfacePatterns or ImplementationPatterns to define \ ++ this file with feature %S.") ++ (OASISFeatures.source_patterns.OASISFeatures.name); ++ res ++ + let source_unix_files ~ctxt (cs, bs, obj) source_file_exists = + List.fold_left + (fun acc modul -> +- match OASISLibrary.find_module source_file_exists bs modul with +- | `Sources (base_fn, lst) -> +- (base_fn, lst) :: acc +- | `No_sources _ -> +- OASISMessage.warning +- ~ctxt +- (f_ "Cannot find source file matching \ +- module '%s' in object %s") +- modul cs.cs_name; +- acc) ++ match find_module ~ctxt source_file_exists cs bs modul with ++ | `Sources (base_fn, lst) -> (base_fn, lst) :: acc ++ | `No_sources _ -> acc) + [] + obj.obj_modules + + + let generated_unix_files +- ~ctxt +- ~is_native +- ~source_file_exists +- (cs, bs, obj) = ++ ~ctxt ++ ~is_native ++ ~source_file_exists ++ (cs, bs, obj) = + + let find_module ext modul = +- match OASISLibrary.find_module source_file_exists bs modul with +- | `Sources (base_fn, _) -> [base_fn ^ ext] +- | `No_sources lst -> +- OASISMessage.warning +- ~ctxt +- (f_ "Cannot find source file matching \ +- module '%s' in object %s") +- modul cs.cs_name ; +- lst ++ match find_module ~ctxt source_file_exists cs bs modul with ++ | `Sources (base_fn, _) -> [base_fn ^ ext] ++ | `No_sources lst -> lst + in + + let header, byte, native, c_object, f = + match obj.obj_modules with + | [ m ] -> (find_module ".cmi" m, +- find_module ".cmo" m, +- find_module ".cmx" m, +- find_module ".o" m, +- fun x -> x) ++ find_module ".cmo" m, ++ find_module ".cmx" m, ++ find_module ".o" m, ++ fun x -> x) + | _ -> ([cs.cs_name ^ ".cmi"], +- [cs.cs_name ^ ".cmo"], +- [cs.cs_name ^ ".cmx"], +- [cs.cs_name ^ ".o"], +- OASISUnixPath.concat bs.bs_path) ++ [cs.cs_name ^ ".cmo"], ++ [cs.cs_name ^ ".cmx"], ++ [cs.cs_name ^ ".o"], ++ OASISUnixPath.concat bs.bs_path) + in +- List.map (List.map f) ( +- match bs.bs_compiled_object with +- | Native -> +- native :: c_object :: byte :: header :: [] +- | Best when is_native -> +- native :: c_object :: byte :: header :: [] +- | Byte | Best -> +- byte :: header :: []) ++ List.map (List.map f) ( ++ match bs.bs_compiled_object with ++ | Native -> ++ native :: c_object :: byte :: header :: [] ++ | Best when is_native -> ++ native :: c_object :: byte :: header :: [] ++ | Byte | Best -> ++ byte :: header :: []) + + + end +@@ -2285,7 +2554,6 @@ module OASISFindlib = struct + open OASISTypes + open OASISUtils + open OASISGettext +- open OASISSection + + + type library_name = name +@@ -2303,12 +2571,13 @@ module OASISFindlib = struct + common_section * + build_section * + [`Library of library | `Object of object_] * ++ unix_dirname option * + group_t list) + + + type data = common_section * +- build_section * +- [`Library of library | `Object of object_] ++ build_section * ++ [`Library of library | `Object of object_] + type tree = + | Node of (data option) * (tree MapString.t) + | Leaf of data +@@ -2326,53 +2595,53 @@ module OASISFindlib = struct + let name = + String.concat "." (lib.lib_findlib_containers @ [name]) + in +- name ++ name + in +- List.fold_left +- (fun mp -> +- function +- | Library (cs, _, lib) -> +- begin +- let lib_name = cs.cs_name in +- let fndlb_parts = fndlb_parts cs lib in +- if MapString.mem lib_name mp then +- failwithf +- (f_ "The library name '%s' is used more than once.") +- lib_name; +- match lib.lib_findlib_parent with +- | Some lib_name_parent -> +- MapString.add +- lib_name +- (`Unsolved (lib_name_parent, fndlb_parts)) +- mp +- | None -> +- MapString.add +- lib_name +- (`Solved fndlb_parts) +- mp +- end +- +- | Object (cs, _, obj) -> +- begin +- let obj_name = cs.cs_name in +- if MapString.mem obj_name mp then +- failwithf +- (f_ "The object name '%s' is used more than once.") +- obj_name; +- let findlib_full_name = match obj.obj_findlib_fullname with +- | Some ns -> String.concat "." ns +- | None -> obj_name +- in ++ List.fold_left ++ (fun mp -> ++ function ++ | Library (cs, _, lib) -> ++ begin ++ let lib_name = cs.cs_name in ++ let fndlb_parts = fndlb_parts cs lib in ++ if MapString.mem lib_name mp then ++ failwithf ++ (f_ "The library name '%s' is used more than once.") ++ lib_name; ++ match lib.lib_findlib_parent with ++ | Some lib_name_parent -> ++ MapString.add ++ lib_name ++ (`Unsolved (lib_name_parent, fndlb_parts)) ++ mp ++ | None -> + MapString.add +- obj_name +- (`Solved findlib_full_name) ++ lib_name ++ (`Solved fndlb_parts) + mp +- end ++ end + +- | Executable _ | Test _ | Flag _ | SrcRepo _ | Doc _ -> +- mp) +- MapString.empty +- pkg.sections ++ | Object (cs, _, obj) -> ++ begin ++ let obj_name = cs.cs_name in ++ if MapString.mem obj_name mp then ++ failwithf ++ (f_ "The object name '%s' is used more than once.") ++ obj_name; ++ let findlib_full_name = match obj.obj_findlib_fullname with ++ | Some ns -> String.concat "." ns ++ | None -> obj_name ++ in ++ MapString.add ++ obj_name ++ (`Solved findlib_full_name) ++ mp ++ end ++ ++ | Executable _ | Test _ | Flag _ | SrcRepo _ | Doc _ -> ++ mp) ++ MapString.empty ++ pkg.sections + in + + (* Solve the above graph to be only library name to full findlib name. *) +@@ -2384,40 +2653,40 @@ module OASISFindlib = struct + with regard to findlib naming.") + lib_name; + let visited = SetString.add lib_name visited in +- try +- match MapString.find lib_name mp with +- | `Solved fndlb_nm -> +- fndlb_nm, mp +- | `Unsolved (lib_nm_parent, post_fndlb_nm) -> +- let pre_fndlb_nm, mp = +- solve visited mp lib_nm_parent lib_name +- in +- let fndlb_nm = pre_fndlb_nm^"."^post_fndlb_nm in +- fndlb_nm, MapString.add lib_name (`Solved fndlb_nm) mp +- with Not_found -> +- failwithf +- (f_ "Library '%s', which is defined as the findlib parent of \ +- library '%s', doesn't exist.") +- lib_name lib_name_child ++ try ++ match MapString.find lib_name mp with ++ | `Solved fndlb_nm -> ++ fndlb_nm, mp ++ | `Unsolved (lib_nm_parent, post_fndlb_nm) -> ++ let pre_fndlb_nm, mp = ++ solve visited mp lib_nm_parent lib_name ++ in ++ let fndlb_nm = pre_fndlb_nm^"."^post_fndlb_nm in ++ fndlb_nm, MapString.add lib_name (`Solved fndlb_nm) mp ++ with Not_found -> ++ failwithf ++ (f_ "Library '%s', which is defined as the findlib parent of \ ++ library '%s', doesn't exist.") ++ lib_name lib_name_child + in + let mp = + MapString.fold + (fun lib_name status mp -> + match status with + | `Solved _ -> +- (* Solved initialy, no need to go further *) +- mp ++ (* Solved initialy, no need to go further *) ++ mp + | `Unsolved _ -> +- let _, mp = solve SetString.empty mp lib_name "<none>" in +- mp) ++ let _, mp = solve SetString.empty mp lib_name "<none>" in ++ mp) + fndlb_parts_of_lib_name + fndlb_parts_of_lib_name + in +- MapString.map +- (function +- | `Solved fndlb_nm -> fndlb_nm +- | `Unsolved _ -> assert false) +- mp ++ MapString.map ++ (function ++ | `Solved fndlb_nm -> fndlb_nm ++ | `Unsolved _ -> assert false) ++ mp + in + + (* Convert an internal library name to a findlib name. *) +@@ -2429,75 +2698,89 @@ module OASISFindlib = struct + in + + (* Add a library to the tree. +- *) ++ *) + let add sct mp = + let fndlb_fullname = + let cs, _, _ = sct in + let lib_name = cs.cs_name in +- findlib_name_of_library_name lib_name ++ findlib_name_of_library_name lib_name + in + let rec add_children nm_lst (children: tree MapString.t) = + match nm_lst with + | (hd :: tl) -> +- begin +- let node = +- try +- add_node tl (MapString.find hd children) +- with Not_found -> +- (* New node *) +- new_node tl +- in +- MapString.add hd node children +- end ++ begin ++ let node = ++ try ++ add_node tl (MapString.find hd children) ++ with Not_found -> ++ (* New node *) ++ new_node tl ++ in ++ MapString.add hd node children ++ end + | [] -> +- (* Should not have a nameless library. *) +- assert false ++ (* Should not have a nameless library. *) ++ assert false + and add_node tl node = + if tl = [] then + begin + match node with + | Node (None, children) -> +- Node (Some sct, children) ++ Node (Some sct, children) + | Leaf (cs', _, _) | Node (Some (cs', _, _), _) -> +- (* TODO: allow to merge Package, i.e. +- * archive(byte) = "foo.cma foo_init.cmo" +- *) +- let cs, _, _ = sct in +- failwithf +- (f_ "Library '%s' and '%s' have the same findlib name '%s'") +- cs.cs_name cs'.cs_name fndlb_fullname ++ (* TODO: allow to merge Package, i.e. ++ * archive(byte) = "foo.cma foo_init.cmo" ++ *) ++ let cs, _, _ = sct in ++ failwithf ++ (f_ "Library '%s' and '%s' have the same findlib name '%s'") ++ cs.cs_name cs'.cs_name fndlb_fullname + end + else + begin + match node with + | Leaf data -> +- Node (Some data, add_children tl MapString.empty) ++ Node (Some data, add_children tl MapString.empty) + | Node (data_opt, children) -> +- Node (data_opt, add_children tl children) ++ Node (data_opt, add_children tl children) + end + and new_node = + function + | [] -> +- Leaf sct ++ Leaf sct + | hd :: tl -> +- Node (None, MapString.add hd (new_node tl) MapString.empty) ++ Node (None, MapString.add hd (new_node tl) MapString.empty) ++ in ++ add_children (OASISString.nsplit fndlb_fullname '.') mp ++ in ++ ++ let unix_directory dn lib = ++ let directory = ++ match lib with ++ | `Library lib -> lib.lib_findlib_directory ++ | `Object obj -> obj.obj_findlib_directory + in +- add_children (OASISString.nsplit fndlb_fullname '.') mp ++ match dn, directory with ++ | None, None -> None ++ | None, Some dn | Some dn, None -> Some dn ++ | Some dn1, Some dn2 -> Some (OASISUnixPath.concat dn1 dn2) + in + +- let rec group_of_tree mp = ++ let rec group_of_tree dn mp = + MapString.fold + (fun nm node acc -> + let cur = + match node with +- | Node (Some (cs, bs, lib), children) -> +- Package (nm, cs, bs, lib, group_of_tree children) +- | Node (None, children) -> +- Container (nm, group_of_tree children) +- | Leaf (cs, bs, lib) -> +- Package (nm, cs, bs, lib, []) ++ | Node (Some (cs, bs, lib), children) -> ++ let current_dn = unix_directory dn lib in ++ Package (nm, cs, bs, lib, current_dn, group_of_tree current_dn children) ++ | Node (None, children) -> ++ Container (nm, group_of_tree dn children) ++ | Leaf (cs, bs, lib) -> ++ let current_dn = unix_directory dn lib in ++ Package (nm, cs, bs, lib, current_dn, []) + in +- cur :: acc) ++ cur :: acc) + mp [] + in + +@@ -2506,27 +2789,25 @@ module OASISFindlib = struct + (fun mp -> + function + | Library (cs, bs, lib) -> +- add (cs, bs, `Library lib) mp ++ add (cs, bs, `Library lib) mp + | Object (cs, bs, obj) -> +- add (cs, bs, `Object obj) mp ++ add (cs, bs, `Object obj) mp + | _ -> +- mp) ++ mp) + MapString.empty + pkg.sections + in + +- let groups = +- group_of_tree group_mp +- in ++ let groups = group_of_tree None group_mp in + + let library_name_of_findlib_name = +- Lazy.lazy_from_fun +- (fun () -> +- (* Revert findlib_name_of_library_name. *) +- MapString.fold +- (fun k v mp -> MapString.add v k mp) +- fndlb_name_of_lib_name +- MapString.empty) ++ lazy begin ++ (* Revert findlib_name_of_library_name. *) ++ MapString.fold ++ (fun k v mp -> MapString.add v k mp) ++ fndlb_name_of_lib_name ++ MapString.empty ++ end + in + let library_name_of_findlib_name fndlb_nm = + try +@@ -2535,15 +2816,15 @@ module OASISFindlib = struct + raise (FindlibPackageNotFound fndlb_nm) + in + +- groups, +- findlib_name_of_library_name, +- library_name_of_findlib_name ++ groups, ++ findlib_name_of_library_name, ++ library_name_of_findlib_name + + + let findlib_of_group = + function + | Container (fndlb_nm, _) +- | Package (fndlb_nm, _, _, _, _) -> fndlb_nm ++ | Package (fndlb_nm, _, _, _, _, _) -> fndlb_nm + + + let root_of_group grp = +@@ -2551,24 +2832,24 @@ module OASISFindlib = struct + (* We do a DFS in the group. *) + function + | Container (_, children) -> +- List.fold_left +- (fun res grp -> +- if res = None then +- root_lib_aux grp +- else +- res) +- None +- children +- | Package (_, cs, bs, lib, _) -> +- Some (cs, bs, lib) +- in +- match root_lib_aux grp with +- | Some res -> +- res +- | None -> +- failwithf +- (f_ "Unable to determine root library of findlib library '%s'") +- (findlib_of_group grp) ++ List.fold_left ++ (fun res grp -> ++ if res = None then ++ root_lib_aux grp ++ else ++ res) ++ None ++ children ++ | Package (_, cs, bs, lib, _, _) -> ++ Some (cs, bs, lib) ++ in ++ match root_lib_aux grp with ++ | Some res -> ++ res ++ | None -> ++ failwithf ++ (f_ "Unable to determine root library of findlib library '%s'") ++ (findlib_of_group grp) + + + end +@@ -2614,7 +2895,7 @@ module OASISExec = struct + + (* TODO: I don't like this quote, it is there because $(rm) foo expands to + * 'rm -f' foo... +- *) ++ *) + let run ~ctxt ?f_exit_code ?(quote=true) cmd args = + let cmd = + if quote then +@@ -2632,57 +2913,57 @@ module OASISExec = struct + let cmdline = + String.concat " " (cmd :: args) + in +- info ~ctxt (f_ "Running command '%s'") cmdline; +- match f_exit_code, Sys.command cmdline with +- | None, 0 -> () +- | None, i -> +- failwithf +- (f_ "Command '%s' terminated with error code %d") +- cmdline i +- | Some f, i -> +- f i ++ info ~ctxt (f_ "Running command '%s'") cmdline; ++ match f_exit_code, Sys.command cmdline with ++ | None, 0 -> () ++ | None, i -> ++ failwithf ++ (f_ "Command '%s' terminated with error code %d") ++ cmdline i ++ | Some f, i -> ++ f i + + + let run_read_output ~ctxt ?f_exit_code cmd args = + let fn = + Filename.temp_file "oasis-" ".txt" + in +- try ++ try ++ begin ++ let () = ++ run ~ctxt ?f_exit_code cmd (args @ [">"; Filename.quote fn]) ++ in ++ let chn = ++ open_in fn ++ in ++ let routput = ++ ref [] ++ in + begin +- let () = +- run ~ctxt ?f_exit_code cmd (args @ [">"; Filename.quote fn]) +- in +- let chn = +- open_in fn +- in +- let routput = +- ref [] +- in +- begin +- try +- while true do +- routput := (input_line chn) :: !routput +- done +- with End_of_file -> +- () +- end; +- close_in chn; +- Sys.remove fn; +- List.rev !routput +- end +- with e -> +- (try Sys.remove fn with _ -> ()); +- raise e ++ try ++ while true do ++ routput := (input_line chn) :: !routput ++ done ++ with End_of_file -> ++ () ++ end; ++ close_in chn; ++ Sys.remove fn; ++ List.rev !routput ++ end ++ with e -> ++ (try Sys.remove fn with _ -> ()); ++ raise e + + + let run_read_one_line ~ctxt ?f_exit_code cmd args = + match run_read_output ~ctxt ?f_exit_code cmd args with + | [fst] -> +- fst ++ fst + | lst -> +- failwithf +- (f_ "Command return unexpected output %S") +- (String.concat "\n" lst) ++ failwithf ++ (f_ "Command return unexpected output %S") ++ (String.concat "\n" lst) + end + + module OASISFileUtil = struct +@@ -2695,15 +2976,15 @@ module OASISFileUtil = struct + let file_exists_case fn = + let dirname = Filename.dirname fn in + let basename = Filename.basename fn in +- if Sys.file_exists dirname then +- if basename = Filename.current_dir_name then +- true +- else +- List.mem +- basename +- (Array.to_list (Sys.readdir dirname)) ++ if Sys.file_exists dirname then ++ if basename = Filename.current_dir_name then ++ true + else +- false ++ List.mem ++ basename ++ (Array.to_list (Sys.readdir dirname)) ++ else ++ false + + + let find_file ?(case_sensitive=true) paths exts = +@@ -2722,16 +3003,16 @@ module OASISFileUtil = struct + let rec combined_paths lst = + match lst with + | p1 :: p2 :: tl -> +- let acc = +- (List.map +- (fun (a, b) -> Filename.concat a b) +- (p1 * p2)) +- in +- combined_paths (acc :: tl) ++ let acc = ++ (List.map ++ (fun (a, b) -> Filename.concat a b) ++ (p1 * p2)) ++ in ++ combined_paths (acc :: tl) + | [e] -> +- e ++ e + | [] -> +- [] ++ [] + in + + let alternatives = +@@ -2743,46 +3024,46 @@ module OASISFileUtil = struct + p ^ e) + ((combined_paths paths) * exts) + in +- List.find (fun file -> +- (if case_sensitive then +- file_exists_case file +- else +- Sys.file_exists file) +- && not (Sys.is_directory file) +- ) alternatives ++ List.find (fun file -> ++ (if case_sensitive then ++ file_exists_case file ++ else ++ Sys.file_exists file) ++ && not (Sys.is_directory file) ++ ) alternatives + + + let which ~ctxt prg = + let path_sep = + match Sys.os_type with + | "Win32" -> +- ';' ++ ';' + | _ -> +- ':' ++ ':' + in + let path_lst = OASISString.nsplit (Sys.getenv "PATH") path_sep in + let exec_ext = + match Sys.os_type with + | "Win32" -> +- "" :: (OASISString.nsplit (Sys.getenv "PATHEXT") path_sep) ++ "" :: (OASISString.nsplit (Sys.getenv "PATHEXT") path_sep) + | _ -> +- [""] ++ [""] + in +- find_file ~case_sensitive:false [path_lst; [prg]] exec_ext ++ find_file ~case_sensitive:false [path_lst; [prg]] exec_ext + + + (**/**) + let rec fix_dir dn = + (* Windows hack because Sys.file_exists "src\\" = false when + * Sys.file_exists "src" = true +- *) ++ *) + let ln = + String.length dn + in +- if Sys.os_type = "Win32" && ln > 0 && dn.[ln - 1] = '\\' then +- fix_dir (String.sub dn 0 (ln - 1)) +- else +- dn ++ if Sys.os_type = "Win32" && ln > 0 && dn.[ln - 1] = '\\' then ++ fix_dir (String.sub dn 0 (ln - 1)) ++ else ++ dn + + + let q = Filename.quote +@@ -2793,24 +3074,24 @@ module OASISFileUtil = struct + if recurse then + match Sys.os_type with + | "Win32" -> +- OASISExec.run ~ctxt +- "xcopy" [q src; q tgt; "/E"] ++ OASISExec.run ~ctxt ++ "xcopy" [q src; q tgt; "/E"] + | _ -> +- OASISExec.run ~ctxt +- "cp" ["-r"; q src; q tgt] ++ OASISExec.run ~ctxt ++ "cp" ["-r"; q src; q tgt] + else + OASISExec.run ~ctxt + (match Sys.os_type with +- | "Win32" -> "copy" +- | _ -> "cp") ++ | "Win32" -> "copy" ++ | _ -> "cp") + [q src; q tgt] + + + let mkdir ~ctxt tgt = + OASISExec.run ~ctxt + (match Sys.os_type with +- | "Win32" -> "md" +- | _ -> "mkdir") ++ | "Win32" -> "md" ++ | _ -> "mkdir") + [q tgt] + + +@@ -2818,32 +3099,32 @@ module OASISFileUtil = struct + let tgt = + fix_dir tgt + in +- if Sys.file_exists tgt then +- begin +- if not (Sys.is_directory tgt) then +- OASISUtils.failwithf +- (f_ "Cannot create directory '%s', a file of the same name already \ +- exists") +- tgt +- end +- else +- begin +- mkdir_parent ~ctxt f (Filename.dirname tgt); +- if not (Sys.file_exists tgt) then +- begin +- f tgt; +- mkdir ~ctxt tgt +- end +- end ++ if Sys.file_exists tgt then ++ begin ++ if not (Sys.is_directory tgt) then ++ OASISUtils.failwithf ++ (f_ "Cannot create directory '%s', a file of the same name already \ ++ exists") ++ tgt ++ end ++ else ++ begin ++ mkdir_parent ~ctxt f (Filename.dirname tgt); ++ if not (Sys.file_exists tgt) then ++ begin ++ f tgt; ++ mkdir ~ctxt tgt ++ end ++ end + + + let rmdir ~ctxt tgt = + if Sys.readdir tgt = [||] then begin + match Sys.os_type with + | "Win32" -> +- OASISExec.run ~ctxt "rd" [q tgt] ++ OASISExec.run ~ctxt "rd" [q tgt] + | _ -> +- OASISExec.run ~ctxt "rm" ["-r"; q tgt] ++ OASISExec.run ~ctxt "rm" ["-r"; q tgt] + end else begin + OASISMessage.error ~ctxt + (f_ "Cannot remove directory '%s': not empty.") +@@ -2852,51 +3133,51 @@ module OASISFileUtil = struct + + + let glob ~ctxt fn = +- let basename = +- Filename.basename fn +- in +- if String.length basename >= 2 && +- basename.[0] = '*' && +- basename.[1] = '.' then +- begin +- let ext_len = +- (String.length basename) - 2 +- in +- let ext = +- String.sub basename 2 ext_len +- in +- let dirname = +- Filename.dirname fn +- in +- Array.fold_left +- (fun acc fn -> +- try +- let fn_ext = +- String.sub +- fn +- ((String.length fn) - ext_len) +- ext_len +- in +- if fn_ext = ext then +- (Filename.concat dirname fn) :: acc +- else +- acc +- with Invalid_argument _ -> +- acc) +- [] +- (Sys.readdir dirname) +- end +- else +- begin +- if file_exists_case fn then +- [fn] +- else +- [] +- end ++ let basename = ++ Filename.basename fn ++ in ++ if String.length basename >= 2 && ++ basename.[0] = '*' && ++ basename.[1] = '.' then ++ begin ++ let ext_len = ++ (String.length basename) - 2 ++ in ++ let ext = ++ String.sub basename 2 ext_len ++ in ++ let dirname = ++ Filename.dirname fn ++ in ++ Array.fold_left ++ (fun acc fn -> ++ try ++ let fn_ext = ++ String.sub ++ fn ++ ((String.length fn) - ext_len) ++ ext_len ++ in ++ if fn_ext = ext then ++ (Filename.concat dirname fn) :: acc ++ else ++ acc ++ with Invalid_argument _ -> ++ acc) ++ [] ++ (Sys.readdir dirname) ++ end ++ else ++ begin ++ if file_exists_case fn then ++ [fn] ++ else ++ [] ++ end + end + + +-# 2878 "setup.ml" ++# 3159 "setup.ml" + module BaseEnvLight = struct + (* # 22 "src/base/BaseEnvLight.ml" *) + +@@ -2907,101 +3188,76 @@ module BaseEnvLight = struct + type t = string MapString.t + + +- let default_filename = +- Filename.concat +- (Sys.getcwd ()) +- "setup.data" ++ let default_filename = Filename.concat (Sys.getcwd ()) "setup.data" + + +- let load ?(allow_empty=false) ?(filename=default_filename) () = +- if Sys.file_exists filename then +- begin +- let chn = +- open_in_bin filename +- in +- let st = +- Stream.of_channel chn +- in +- let line = +- ref 1 +- in +- 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 +- let lexer = +- Genlex.make_lexer ["="] st_line +- in +- let rec read_file mp = +- match Stream.npeek 3 lexer with +- | [Genlex.Ident nm; Genlex.Kwd "="; Genlex.String value] -> +- Stream.junk lexer; +- Stream.junk lexer; +- Stream.junk lexer; +- read_file (MapString.add nm value mp) +- | [] -> +- mp +- | _ -> +- failwith +- (Printf.sprintf +- "Malformed data file '%s' line %d" +- filename !line) +- in +- let mp = +- read_file MapString.empty +- in +- close_in chn; +- mp +- end +- else if allow_empty then +- begin ++ 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 ++ 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 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_choose lst env = +- OASISExpr.choose +- (fun nm -> var_get nm env) +- lst ++ 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 + + +-# 2983 "setup.ml" ++# 3239 "setup.ml" + module BaseContext = struct + (* # 22 "src/base/BaseContext.ml" *) + +@@ -3022,7 +3278,7 @@ module BaseMessage = struct + + (** Message to user, overrid for Base + @author Sylvain Le Gall +- *) ++ *) + open OASISMessage + open BaseContext + +@@ -3045,6 +3301,7 @@ module BaseEnv = struct + + open OASISGettext + open OASISUtils ++ open OASISContext + open PropList + + +@@ -3067,83 +3324,79 @@ module BaseEnv = struct + + + type definition_t = +- { +- hide: bool; +- dump: bool; +- cli: cli_handle_t; +- arg_help: string option; +- group: string option; +- } ++ { ++ hide: bool; ++ dump: bool; ++ cli: cli_handle_t; ++ arg_help: string option; ++ group: string option; ++ } + + +- let schema = +- Schema.create "environment" ++ let schema = Schema.create "environment" + + + (* Environment data *) +- let env = +- Data.create () ++ let env = Data.create () + + + (* Environment data from file *) +- let env_from_file = +- ref MapString.empty ++ let env_from_file = ref MapString.empty + + + (* Lexer for var *) +- let var_lxr = +- Genlex.make_lexer [] ++ let var_lxr = Genlex.make_lexer [] + + + let rec var_expand str = + let buff = +- Buffer.create ((String.length str) * 2) +- in +- Buffer.add_substitute +- buff +- (fun var -> +- try +- (* TODO: this is a quick hack to allow calling Test.Command +- * without defining executable name really. I.e. if there is +- * an exec Executable toto, then $(toto) should be replace +- * by its real name. It is however useful to have this function +- * for other variable that depend on the host and should be +- * written better than that. +- *) +- let st = +- var_lxr (Stream.of_string var) +- in +- match Stream.npeek 3 st with +- | [Genlex.Ident "utoh"; Genlex.Ident nm] -> +- OASISHostPath.of_unix (var_get nm) +- | [Genlex.Ident "utoh"; Genlex.String s] -> +- OASISHostPath.of_unix s +- | [Genlex.Ident "ocaml_escaped"; Genlex.Ident nm] -> +- String.escaped (var_get nm) +- | [Genlex.Ident "ocaml_escaped"; Genlex.String s] -> +- String.escaped s +- | [Genlex.Ident nm] -> +- var_get nm +- | _ -> +- failwithf +- (f_ "Unknown expression '%s' in variable expansion of %s.") +- var +- str +- with +- | Unknown_field (_, _) -> +- failwithf +- (f_ "No variable %s defined when trying to expand %S.") +- var +- str +- | Stream.Error e -> +- failwithf +- (f_ "Syntax error when parsing '%s' when trying to \ +- expand %S: %s") +- var +- str +- e) +- str; +- Buffer.contents buff ++ Buffer.create ((String.length str) * 2) ++ in ++ Buffer.add_substitute ++ buff ++ (fun var -> ++ try ++ (* TODO: this is a quick hack to allow calling Test.Command ++ * without defining executable name really. I.e. if there is ++ * an exec Executable toto, then $(toto) should be replace ++ * by its real name. It is however useful to have this function ++ * for other variable that depend on the host and should be ++ * written better than that. ++ *) ++ let st = ++ var_lxr (Stream.of_string var) ++ in ++ match Stream.npeek 3 st with ++ | [Genlex.Ident "utoh"; Genlex.Ident nm] -> ++ OASISHostPath.of_unix (var_get nm) ++ | [Genlex.Ident "utoh"; Genlex.String s] -> ++ OASISHostPath.of_unix s ++ | [Genlex.Ident "ocaml_escaped"; Genlex.Ident nm] -> ++ String.escaped (var_get nm) ++ | [Genlex.Ident "ocaml_escaped"; Genlex.String s] -> ++ String.escaped s ++ | [Genlex.Ident nm] -> ++ var_get nm ++ | _ -> ++ failwithf ++ (f_ "Unknown expression '%s' in variable expansion of %s.") ++ var ++ str ++ with ++ | Unknown_field (_, _) -> ++ failwithf ++ (f_ "No variable %s defined when trying to expand %S.") ++ var ++ str ++ | Stream.Error e -> ++ failwithf ++ (f_ "Syntax error when parsing '%s' when trying to \ ++ expand %S: %s") ++ var ++ str ++ e) ++ str; ++ Buffer.contents buff + + + and var_get name = +@@ -3158,7 +3411,7 @@ module BaseEnv = struct + raise e + end + in +- var_expand vl ++ var_expand vl + + + let var_choose ?printer ?name lst = +@@ -3173,24 +3426,24 @@ module BaseEnv = struct + let buff = + Buffer.create (String.length vl) + in +- String.iter +- (function +- | '$' -> Buffer.add_string buff "\\$" +- | c -> Buffer.add_char buff c) +- vl; +- Buffer.contents buff ++ String.iter ++ (function ++ | '$' -> Buffer.add_string buff "\\$" ++ | c -> Buffer.add_char buff c) ++ vl; ++ Buffer.contents buff + + + let var_define +- ?(hide=false) +- ?(dump=true) +- ?short_desc +- ?(cli=CLINone) +- ?arg_help +- ?group +- name (* TODO: type constraint on the fact that name must be a valid OCaml +- id *) +- dflt = ++ ?(hide=false) ++ ?(dump=true) ++ ?short_desc ++ ?(cli=CLINone) ++ ?arg_help ++ ?group ++ name (* TODO: type constraint on the fact that name must be a valid OCaml ++ id *) ++ dflt = + + let default = + [ +@@ -3211,22 +3464,22 @@ module BaseEnv = struct + in + + (* Try to find a value that can be defined +- *) ++ *) + let var_get_low lst = + let errors, res = + List.fold_left +- (fun (errors, res) (o, v) -> ++ (fun (errors, res) (_, v) -> + if res = None then + begin + try + errors, Some (v ()) + with + | Not_found -> +- errors, res ++ errors, res + | Failure rsn -> +- (rsn :: errors), res ++ (rsn :: errors), res + | e -> +- (Printexc.to_string e) :: errors, res ++ (Printexc.to_string e) :: errors, res + end + else + errors, res) +@@ -3236,13 +3489,13 @@ module BaseEnv = struct + Pervasives.compare o2 o1) + lst) + in +- match res, errors with +- | Some v, _ -> +- v +- | None, [] -> +- raise (Not_set (name, None)) +- | None, lst -> +- raise (Not_set (name, Some (String.concat (s_ ", ") lst))) ++ match res, errors with ++ | Some v, _ -> ++ v ++ | None, [] -> ++ raise (Not_set (name, None)) ++ | None, lst -> ++ raise (Not_set (name, Some (String.concat (s_ ", ") lst))) + in + + let help = +@@ -3258,24 +3511,24 @@ module BaseEnv = struct + ~parse:(fun ?(context=ODefault) s -> [context, fun () -> s]) + ~print:var_get_low + ~default +- ~update:(fun ?context x old_x -> x @ old_x) ++ ~update:(fun ?context:_ x old_x -> x @ old_x) + ?help + extra + in + +- fun () -> +- var_expand (var_get_low (var_get_lst env)) ++ fun () -> ++ var_expand (var_get_low (var_get_lst env)) + + + let var_redefine +- ?hide +- ?dump +- ?short_desc +- ?cli +- ?arg_help +- ?group +- name +- dflt = ++ ?hide ++ ?dump ++ ?short_desc ++ ?cli ++ ?arg_help ++ ?group ++ name ++ dflt = + if Schema.mem schema name then + begin + (* TODO: look suspsicious, we want to memorize dflt not dflt () *) +@@ -3296,7 +3549,7 @@ module BaseEnv = struct + end + + +- let var_ignore (e: unit -> string) = () ++ let var_ignore (_: unit -> string) = () + + + let print_hidden = +@@ -3321,12 +3574,34 @@ module BaseEnv = struct + schema) + + +- let default_filename = +- BaseEnvLight.default_filename ++ let default_filename = in_srcdir "setup.data" + + +- let load ?allow_empty ?filename () = +- env_from_file := BaseEnvLight.load ?allow_empty ?filename () ++ let load ~ctxt ?(allow_empty=false) ?(filename=default_filename) () = ++ let open OASISFileSystem in ++ env_from_file := ++ let repr_filename = ctxt.srcfs#string_of_filename filename in ++ if ctxt.srcfs#file_exists filename then begin ++ let buf = Buffer.create 13 in ++ defer_close ++ (ctxt.srcfs#open_in ~mode:binary_in filename) ++ (read_all buf); ++ defer_close ++ (ctxt.srcfs#open_in ~mode:binary_in filename) ++ (fun rdr -> ++ OASISMessage.info ~ctxt "Loading environment from %S." repr_filename; ++ BaseEnvLight.load ~allow_empty ++ ~filename:(repr_filename) ++ ~stream:(stream_of_reader rdr) ++ ()) ++ end else if allow_empty then begin ++ BaseEnvLight.MapString.empty ++ end else begin ++ failwith ++ (Printf.sprintf ++ (f_ "Unable to load environment, the file '%s' doesn't exist.") ++ repr_filename) ++ end + + + let unload () = +@@ -3334,40 +3609,32 @@ module BaseEnv = struct + Data.clear env + + +- let dump ?(filename=default_filename) () = +- let chn = +- open_out_bin filename +- in +- let output nm value = +- Printf.fprintf chn "%s=%S\n" nm value +- in +- let mp_todo = +- (* Dump data from schema *) +- Schema.fold +- (fun mp_todo nm def _ -> +- if def.dump then +- begin +- try +- let value = +- Schema.get +- schema +- env +- nm +- in +- output nm value +- with Not_set _ -> +- () +- end; +- MapString.remove nm mp_todo) +- !env_from_file +- schema +- in +- (* Dump data defined outside of schema *) +- MapString.iter output mp_todo; +- +- (* End of the dump *) +- close_out chn +- ++ let dump ~ctxt ?(filename=default_filename) () = ++ let open OASISFileSystem in ++ defer_close ++ (ctxt.OASISContext.srcfs#open_out ~mode:binary_out filename) ++ (fun wrtr -> ++ let buf = Buffer.create 63 in ++ let output nm value = ++ Buffer.add_string buf (Printf.sprintf "%s=%S\n" nm value) ++ in ++ let mp_todo = ++ (* Dump data from schema *) ++ Schema.fold ++ (fun mp_todo nm def _ -> ++ if def.dump then begin ++ try ++ output nm (Schema.get schema env nm) ++ with Not_set _ -> ++ () ++ end; ++ MapString.remove nm mp_todo) ++ !env_from_file ++ schema ++ in ++ (* Dump data defined outside of schema *) ++ MapString.iter output mp_todo; ++ wrtr#output buf) + + let print () = + let printable_vars = +@@ -3376,20 +3643,15 @@ module BaseEnv = struct + if not def.hide || bool_of_string (print_hidden ()) then + begin + try +- let value = +- Schema.get +- schema +- env +- nm +- in ++ let value = Schema.get schema env nm in + let txt = + match short_descr_opt with + | Some s -> s () + | None -> nm + in +- (txt, value) :: acc ++ (txt, value) :: acc + with Not_set _ -> +- acc ++ acc + end + else + acc) +@@ -3401,123 +3663,122 @@ module BaseEnv = struct + (List.rev_map String.length + (List.rev_map fst printable_vars)) + in +- let dot_pad str = +- String.make ((max_length - (String.length str)) + 3) '.' +- in +- +- Printf.printf "\nConfiguration: \n"; ++ let dot_pad str = String.make ((max_length - (String.length str)) + 3) '.' in ++ Printf.printf "\nConfiguration:\n"; + List.iter + (fun (name, value) -> +- Printf.printf "%s: %s %s\n" name (dot_pad name) value) ++ Printf.printf "%s: %s" name (dot_pad name); ++ if value = "" then ++ Printf.printf "\n" ++ else ++ Printf.printf " %s\n" value) + (List.rev printable_vars); + Printf.printf "\n%!" + + + let args () = +- let arg_concat = +- OASISUtils.varname_concat ~hyphen:'-' +- in +- [ +- "--override", +- Arg.Tuple +- ( +- let rvr = ref "" +- in +- let rvl = ref "" +- in +- [ +- Arg.Set_string rvr; +- Arg.Set_string rvl; +- Arg.Unit +- (fun () -> +- Schema.set +- schema +- env +- ~context:OCommandLine +- !rvr +- !rvl) +- ] +- ), +- "var+val Override any configuration variable."; ++ let arg_concat = OASISUtils.varname_concat ~hyphen:'-' in ++ [ ++ "--override", ++ Arg.Tuple ++ ( ++ let rvr = ref "" ++ in ++ let rvl = ref "" ++ in ++ [ ++ Arg.Set_string rvr; ++ Arg.Set_string rvl; ++ Arg.Unit ++ (fun () -> ++ Schema.set ++ schema ++ env ++ ~context:OCommandLine ++ !rvr ++ !rvl) ++ ] ++ ), ++ "var+val Override any configuration variable."; + +- ] +- @ ++ ] ++ @ + List.flatten + (Schema.fold +- (fun acc name def short_descr_opt -> +- let var_set s = +- Schema.set +- schema +- env +- ~context:OCommandLine +- name +- s +- in ++ (fun acc name def short_descr_opt -> ++ let var_set s = ++ Schema.set ++ schema ++ env ++ ~context:OCommandLine ++ name ++ s ++ in + +- let arg_name = +- OASISUtils.varname_of_string ~hyphen:'-' name +- in ++ let arg_name = ++ OASISUtils.varname_of_string ~hyphen:'-' name ++ in + +- let hlp = +- match short_descr_opt with +- | Some txt -> txt () +- | None -> "" +- in ++ let hlp = ++ match short_descr_opt with ++ | Some txt -> txt () ++ | None -> "" ++ in + +- let arg_hlp = +- match def.arg_help with +- | Some s -> s +- | None -> "str" +- in ++ let arg_hlp = ++ match def.arg_help with ++ | Some s -> s ++ | None -> "str" ++ in + +- let default_value = +- try +- Printf.sprintf +- (f_ " [%s]") +- (Schema.get +- schema +- env +- name) +- with Not_set _ -> +- "" +- in ++ let default_value = ++ try ++ Printf.sprintf ++ (f_ " [%s]") ++ (Schema.get ++ schema ++ env ++ name) ++ with Not_set _ -> ++ "" ++ in + +- let args = +- match def.cli with +- | CLINone -> +- [] +- | CLIAuto -> +- [ +- arg_concat "--" arg_name, +- Arg.String var_set, +- Printf.sprintf (f_ "%s %s%s") arg_hlp hlp default_value +- ] +- | CLIWith -> +- [ +- arg_concat "--with-" arg_name, +- Arg.String var_set, +- Printf.sprintf (f_ "%s %s%s") arg_hlp hlp default_value +- ] +- | CLIEnable -> +- let dflt = +- if default_value = " [true]" then +- s_ " [default: enabled]" +- else +- s_ " [default: disabled]" +- in +- [ +- arg_concat "--enable-" arg_name, +- Arg.Unit (fun () -> var_set "true"), +- Printf.sprintf (f_ " %s%s") hlp dflt; +- +- arg_concat "--disable-" arg_name, +- Arg.Unit (fun () -> var_set "false"), +- Printf.sprintf (f_ " %s%s") hlp dflt +- ] +- | CLIUser lst -> +- lst +- in +- args :: acc) ++ let args = ++ match def.cli with ++ | CLINone -> ++ [] ++ | CLIAuto -> ++ [ ++ arg_concat "--" arg_name, ++ Arg.String var_set, ++ Printf.sprintf (f_ "%s %s%s") arg_hlp hlp default_value ++ ] ++ | CLIWith -> ++ [ ++ arg_concat "--with-" arg_name, ++ Arg.String var_set, ++ Printf.sprintf (f_ "%s %s%s") arg_hlp hlp default_value ++ ] ++ | CLIEnable -> ++ let dflt = ++ if default_value = " [true]" then ++ s_ " [default: enabled]" ++ else ++ s_ " [default: disabled]" ++ in ++ [ ++ arg_concat "--enable-" arg_name, ++ Arg.Unit (fun () -> var_set "true"), ++ Printf.sprintf (f_ " %s%s") hlp dflt; ++ ++ arg_concat "--disable-" arg_name, ++ Arg.Unit (fun () -> var_set "false"), ++ Printf.sprintf (f_ " %s%s") hlp dflt ++ ] ++ | CLIUser lst -> ++ lst ++ in ++ args :: acc) + [] + schema) + end +@@ -3531,25 +3792,25 @@ module BaseArgExt = struct + + + let parse argv args = +- (* Simulate command line for Arg *) +- let current = +- ref 0 +- in ++ (* Simulate command line for Arg *) ++ let current = ++ ref 0 ++ in + +- try +- Arg.parse_argv +- ~current:current +- (Array.concat [[|"none"|]; argv]) +- (Arg.align args) +- (failwithf (f_ "Don't know what to do with arguments: '%s'")) +- (s_ "configure options:") +- with +- | Arg.Help txt -> +- print_endline txt; +- exit 0 +- | Arg.Bad txt -> +- prerr_endline txt; +- exit 1 ++ try ++ Arg.parse_argv ++ ~current:current ++ (Array.concat [[|"none"|]; argv]) ++ (Arg.align args) ++ (failwithf (f_ "Don't know what to do with arguments: '%s'")) ++ (s_ "configure options:") ++ with ++ | Arg.Help txt -> ++ print_endline txt; ++ exit 0 ++ | Arg.Bad txt -> ++ prerr_endline txt; ++ exit 1 + end + + module BaseCheck = struct +@@ -3571,18 +3832,18 @@ module BaseCheck = struct + (fun res e -> + match res with + | Some _ -> +- res ++ res + | None -> +- try +- Some (OASISFileUtil.which ~ctxt:!BaseContext.default e) +- with Not_found -> +- None) ++ try ++ Some (OASISFileUtil.which ~ctxt:!BaseContext.default e) ++ with Not_found -> ++ None) + None + prg_lst + in +- match alternate with +- | Some prg -> prg +- | None -> raise Not_found) ++ match alternate with ++ | Some prg -> prg ++ | None -> raise Not_found) + + + let prog prg = +@@ -3598,45 +3859,45 @@ module BaseCheck = struct + + + let version +- var_prefix +- cmp +- fversion +- () = ++ var_prefix ++ cmp ++ fversion ++ () = + (* Really compare version provided *) + let var = + var_prefix^"_version_"^(OASISVersion.varname_of_comparator cmp) + in +- var_redefine +- ~hide:true +- var +- (fun () -> +- let version_str = +- match fversion () with +- | "[Distributed with OCaml]" -> +- begin +- try +- (var_get "ocaml_version") +- with Not_found -> +- warning +- (f_ "Variable ocaml_version not defined, fallback \ +- to default"); +- Sys.ocaml_version +- end +- | res -> +- res +- in +- let version = +- OASISVersion.version_of_string version_str +- in +- if OASISVersion.comparator_apply version cmp then +- version_str +- else +- failwithf +- (f_ "Cannot satisfy version constraint on %s: %s (version: %s)") +- var_prefix +- (OASISVersion.string_of_comparator cmp) +- version_str) +- () ++ var_redefine ++ ~hide:true ++ var ++ (fun () -> ++ let version_str = ++ match fversion () with ++ | "[Distributed with OCaml]" -> ++ begin ++ try ++ (var_get "ocaml_version") ++ with Not_found -> ++ warning ++ (f_ "Variable ocaml_version not defined, fallback \ ++ to default"); ++ Sys.ocaml_version ++ end ++ | res -> ++ res ++ in ++ let version = ++ OASISVersion.version_of_string version_str ++ in ++ if OASISVersion.comparator_apply version cmp then ++ version_str ++ else ++ failwithf ++ (f_ "Cannot satisfy version constraint on %s: %s (version: %s)") ++ var_prefix ++ (OASISVersion.string_of_comparator cmp) ++ version_str) ++ () + + + let package_version pkg = +@@ -3657,13 +3918,13 @@ module BaseCheck = struct + (ocamlfind ()) + ["query"; "-format"; "%d"; pkg] + in +- if Sys.file_exists dir && Sys.is_directory dir then +- dir +- else +- failwithf +- (f_ "When looking for findlib package %s, \ +- directory %s return doesn't exist") +- pkg dir ++ if Sys.file_exists dir && Sys.is_directory dir then ++ dir ++ else ++ failwithf ++ (f_ "When looking for findlib package %s, \ ++ directory %s return doesn't exist") ++ pkg dir + in + let vl = + var_redefine +@@ -3671,19 +3932,19 @@ module BaseCheck = struct + (fun () -> findlib_dir pkg) + () + in +- ( +- match version_comparator with +- | Some ver_cmp -> +- ignore +- (version +- var +- ver_cmp +- (fun _ -> package_version pkg) +- ()) +- | None -> +- () +- ); +- vl ++ ( ++ match version_comparator with ++ | Some ver_cmp -> ++ ignore ++ (version ++ var ++ ver_cmp ++ (fun _ -> package_version pkg) ++ ()) ++ | None -> ++ () ++ ); ++ vl + end + + module BaseOCamlcConfig = struct +@@ -3705,46 +3966,46 @@ module BaseOCamlcConfig = struct + let ocamlc_config_map = + (* Map name to value for ocamlc -config output + (name ^": "^value) +- *) ++ *) + let rec split_field mp lst = + match lst with + | line :: tl -> +- let mp = +- try +- let pos_semicolon = +- String.index line ':' +- in +- if pos_semicolon > 1 then +- ( +- let name = +- String.sub line 0 pos_semicolon +- in +- let linelen = +- String.length line +- in +- let value = +- if linelen > pos_semicolon + 2 then +- String.sub +- line +- (pos_semicolon + 2) +- (linelen - pos_semicolon - 2) +- else +- "" +- in +- SMap.add name value mp +- ) +- else +- ( +- mp +- ) +- with Not_found -> ++ let mp = ++ try ++ let pos_semicolon = ++ String.index line ':' ++ in ++ if pos_semicolon > 1 then ++ ( ++ let name = ++ String.sub line 0 pos_semicolon ++ in ++ let linelen = ++ String.length line ++ in ++ let value = ++ if linelen > pos_semicolon + 2 then ++ String.sub ++ line ++ (pos_semicolon + 2) ++ (linelen - pos_semicolon - 2) ++ else ++ "" ++ in ++ SMap.add name value mp ++ ) ++ else + ( + mp + ) +- in +- split_field mp tl ++ with Not_found -> ++ ( ++ mp ++ ) ++ in ++ split_field mp tl + | [] -> +- mp ++ mp + in + + let cache = +@@ -3758,13 +4019,13 @@ module BaseOCamlcConfig = struct + (ocamlc ()) ["-config"])) + [])) + in +- var_redefine +- "ocamlc_config_map" +- ~hide:true +- ~dump:false +- (fun () -> +- (* TODO: update if ocamlc change !!! *) +- Lazy.force cache) ++ var_redefine ++ "ocamlc_config_map" ++ ~hide:true ++ ~dump:false ++ (fun () -> ++ (* TODO: update if ocamlc change !!! *) ++ Lazy.force cache) + + + let var_define nm = +@@ -3779,30 +4040,30 @@ module BaseOCamlcConfig = struct + String.sub s 0 (String.index s '+') + with _ -> + s +- in ++ in + + let nm_config, value_config = + match nm with + | "ocaml_version" -> +- "version", chop_version_suffix ++ "version", chop_version_suffix + | _ -> nm, (fun x -> x) + in +- var_redefine +- nm +- (fun () -> +- try +- let map = +- avlbl_config_get () +- in +- let value = +- SMap.find nm_config map +- in +- value_config value +- with Not_found -> +- failwithf +- (f_ "Cannot find field '%s' in '%s -config' output") +- nm +- (ocamlc ())) ++ var_redefine ++ nm ++ (fun () -> ++ try ++ let map = ++ avlbl_config_get () ++ in ++ let value = ++ SMap.find nm_config map ++ in ++ value_config value ++ with Not_found -> ++ failwithf ++ (f_ "Cannot find field '%s' in '%s -config' output") ++ nm ++ (ocamlc ())) + + end + +@@ -3812,7 +4073,6 @@ module BaseStandardVar = struct + + open OASISGettext + open OASISTypes +- open OASISExpr + open BaseCheck + open BaseEnv + +@@ -3842,11 +4102,11 @@ module BaseStandardVar = struct + let since_version = + OASISVersion.VGreaterEqual (OASISVersion.version_of_string since_version) + in +- var_cond := ++ var_cond := + (fun ver -> + if OASISVersion.comparator_apply ver since_version then + holder := f ()) :: !var_cond; +- fun () -> !holder () ++ fun () -> !holder () + + + (**/**) +@@ -3907,11 +4167,11 @@ module BaseStandardVar = struct + OASISExec.run_read_output ~ctxt:!BaseContext.default + (flexlink ()) ["-help"] + in +- match lst with +- | line :: _ -> +- Scanf.sscanf line "FlexDLL version %s" (fun ver -> ver) +- | [] -> +- raise Not_found) ++ match lst with ++ | line :: _ -> ++ Scanf.sscanf line "FlexDLL version %s" (fun ver -> ver) ++ | [] -> ++ raise Not_found) + + + (**/**) +@@ -3927,7 +4187,7 @@ module BaseStandardVar = struct + let (/) a b = + if os_type () = Sys.os_type then + Filename.concat a b +- else if os_type () = "Unix" then ++ else if os_type () = "Unix" || os_type () = "Cygwin" then + OASISUnixPath.concat a b + else + OASISUtils.failwithf (f_ "Cannot handle os_type %s filename concat") +@@ -3941,12 +4201,12 @@ module BaseStandardVar = struct + (fun () -> + match os_type () with + | "Win32" -> +- let program_files = +- Sys.getenv "PROGRAMFILES" +- in +- program_files/(pkg_name ()) ++ let program_files = ++ Sys.getenv "PROGRAMFILES" ++ in ++ program_files/(pkg_name ()) + | _ -> +- "/usr/local") ++ "/usr/local") + + + let exec_prefix = +@@ -4082,12 +4342,12 @@ module BaseStandardVar = struct + let _s: string = + ocamlopt () + in +- "true" ++ "true" + with PropList.Not_set _ -> + let _s: string = + ocamlc () + in +- "false") ++ "false") + + + let ext_program = +@@ -4140,7 +4400,7 @@ module BaseStandardVar = struct + (fun () -> + var_define + ~short_desc:(fun () -> +- s_ "Compile tests executable and library and run them") ++ s_ "Compile tests executable and library and run them") + ~cli:CLIEnable + "tests" + (fun () -> "false")) +@@ -4179,35 +4439,35 @@ module BaseStandardVar = struct + in + let has_native_dynlink = + let ocamlfind = ocamlfind () in +- try +- let fn = +- OASISExec.run_read_one_line +- ~ctxt:!BaseContext.default +- ocamlfind +- ["query"; "-predicates"; "native"; "dynlink"; +- "-format"; "%d/%a"] +- in +- Sys.file_exists fn +- with _ -> +- false +- in +- if not has_native_dynlink then ++ try ++ let fn = ++ OASISExec.run_read_one_line ++ ~ctxt:!BaseContext.default ++ ocamlfind ++ ["query"; "-predicates"; "native"; "dynlink"; ++ "-format"; "%d/%a"] ++ in ++ Sys.file_exists fn ++ with _ -> + false +- else if ocaml_lt_312 () then ++ in ++ if not has_native_dynlink then ++ false ++ else if ocaml_lt_312 () then ++ false ++ else if (os_type () = "Win32" || os_type () = "Cygwin") ++ && flexdll_lt_030 () then ++ begin ++ BaseMessage.warning ++ (f_ ".cmxs generation disabled because FlexDLL needs to be \ ++ at least 0.30. Please upgrade FlexDLL from %s to 0.30.") ++ (flexdll_version ()); + false +- else if (os_type () = "Win32" || os_type () = "Cygwin") +- && flexdll_lt_030 () then +- begin +- BaseMessage.warning +- (f_ ".cmxs generation disabled because FlexDLL needs to be \ +- at least 0.30. Please upgrade FlexDLL from %s to 0.30.") +- (flexdll_version ()); +- false +- end +- else +- true ++ end ++ else ++ true + in +- string_of_bool res) ++ string_of_bool res) + + + let init pkg = +@@ -4223,48 +4483,29 @@ module BaseFileAB = struct + open BaseEnv + open OASISGettext + open BaseMessage ++ open OASISContext + + + let to_filename fn = +- let fn = +- OASISHostPath.of_unix fn +- in +- if not (Filename.check_suffix fn ".ab") then +- warning +- (f_ "File '%s' doesn't have '.ab' extension") +- fn; +- Filename.chop_extension fn ++ if not (Filename.check_suffix fn ".ab") then ++ warning (f_ "File '%s' doesn't have '.ab' extension") fn; ++ OASISFileSystem.of_unix_filename (Filename.chop_extension fn) + + +- let replace fn_lst = +- let buff = +- Buffer.create 13 +- in +- List.iter +- (fun fn -> +- let fn = +- OASISHostPath.of_unix fn +- in +- let chn_in = +- open_in fn +- in +- let chn_out = +- open_out (to_filename fn) +- in +- ( +- try +- while true do +- Buffer.add_string buff (var_expand (input_line chn_in)); +- Buffer.add_char buff '\n' +- done +- with End_of_file -> +- () +- ); +- Buffer.output_buffer chn_out buff; +- Buffer.clear buff; +- close_in chn_in; +- close_out chn_out) +- fn_lst ++ let replace ~ctxt fn_lst = ++ let open OASISFileSystem in ++ let ibuf, obuf = Buffer.create 13, Buffer.create 13 in ++ List.iter ++ (fun fn -> ++ Buffer.clear ibuf; Buffer.clear obuf; ++ defer_close ++ (ctxt.srcfs#open_in (of_unix_filename fn)) ++ (read_all ibuf); ++ Buffer.add_string obuf (var_expand (Buffer.contents ibuf)); ++ defer_close ++ (ctxt.srcfs#open_out (to_filename fn)) ++ (fun wrtr -> wrtr#output obuf)) ++ fn_lst + end + + module BaseLog = struct +@@ -4272,126 +4513,92 @@ module BaseLog = struct + + + open OASISUtils ++ open OASISContext ++ open OASISGettext ++ open OASISFileSystem + + +- let default_filename = +- Filename.concat +- (Filename.dirname BaseEnv.default_filename) +- "setup.log" +- +- +- module SetTupleString = +- Set.Make +- (struct +- type t = string * string +- let compare (s11, s12) (s21, s22) = +- match String.compare s11 s21 with +- | 0 -> String.compare s12 s22 +- | n -> n +- end) ++ let default_filename = in_srcdir "setup.log" + + +- let load () = +- if Sys.file_exists default_filename then +- begin +- let chn = +- open_in default_filename +- in +- let scbuf = +- Scanf.Scanning.from_file default_filename +- in +- let rec read_aux (st, lst) = +- if not (Scanf.Scanning.end_of_input scbuf) then +- begin +- let acc = +- try +- Scanf.bscanf scbuf "%S %S\n" +- (fun e d -> +- let t = +- e, d +- in +- if SetTupleString.mem t st then +- st, lst +- else +- SetTupleString.add t st, +- t :: lst) +- with Scanf.Scan_failure _ -> +- failwith +- (Scanf.bscanf scbuf +- "%l" +- (fun line -> +- Printf.sprintf +- "Malformed log file '%s' at line %d" +- default_filename +- line)) +- in +- read_aux acc +- end +- else +- begin +- close_in chn; +- List.rev lst +- end +- in +- read_aux (SetTupleString.empty, []) +- end +- else +- begin +- [] +- end ++ let load ~ctxt () = ++ let module SetTupleString = ++ Set.Make ++ (struct ++ type t = string * string ++ let compare (s11, s12) (s21, s22) = ++ match String.compare s11 s21 with ++ | 0 -> String.compare s12 s22 ++ | n -> n ++ end) ++ in ++ if ctxt.srcfs#file_exists default_filename then begin ++ defer_close ++ (ctxt.srcfs#open_in default_filename) ++ (fun rdr -> ++ let line = ref 1 in ++ let lxr = Genlex.make_lexer [] (stream_of_reader rdr) in ++ let rec read_aux (st, lst) = ++ match Stream.npeek 2 lxr with ++ | [Genlex.String e; Genlex.String d] -> ++ let t = e, d in ++ Stream.junk lxr; Stream.junk lxr; ++ if SetTupleString.mem t st then ++ read_aux (st, lst) ++ else ++ read_aux (SetTupleString.add t st, t :: lst) ++ | [] -> List.rev lst ++ | _ -> ++ failwithf ++ (f_ "Malformed log file '%s' at line %d") ++ (ctxt.srcfs#string_of_filename default_filename) ++ !line ++ in ++ read_aux (SetTupleString.empty, [])) ++ end else begin ++ [] ++ end + + +- let register event data = +- let chn_out = +- open_out_gen [Open_append; Open_creat; Open_text] 0o644 default_filename +- in +- Printf.fprintf chn_out "%S %S\n" event data; +- close_out chn_out ++ let register ~ctxt event data = ++ defer_close ++ (ctxt.srcfs#open_out ++ ~mode:[Open_append; Open_creat; Open_text] ++ ~perm:0o644 ++ default_filename) ++ (fun wrtr -> ++ let buf = Buffer.create 13 in ++ Printf.bprintf buf "%S %S\n" event data; ++ wrtr#output buf) + + +- let unregister event data = +- if Sys.file_exists default_filename then +- begin +- let lst = +- load () +- in +- let chn_out = +- open_out default_filename +- in +- let write_something = +- ref false +- in +- List.iter +- (fun (e, d) -> +- if e <> event || d <> data then +- begin +- write_something := true; +- Printf.fprintf chn_out "%S %S\n" e d +- end) +- lst; +- close_out chn_out; +- if not !write_something then +- Sys.remove default_filename +- end ++ let unregister ~ctxt event data = ++ let lst = load ~ctxt () in ++ let buf = Buffer.create 13 in ++ List.iter ++ (fun (e, d) -> ++ if e <> event || d <> data then ++ Printf.bprintf buf "%S %S\n" e d) ++ lst; ++ if Buffer.length buf > 0 then ++ defer_close ++ (ctxt.srcfs#open_out default_filename) ++ (fun wrtr -> wrtr#output buf) ++ else ++ ctxt.srcfs#remove default_filename + + +- let filter events = +- let st_events = +- List.fold_left +- (fun st e -> +- SetString.add e st) +- SetString.empty +- events +- in +- List.filter +- (fun (e, _) -> SetString.mem e st_events) +- (load ()) ++ let filter ~ctxt events = ++ let st_events = SetString.of_list events in ++ List.filter ++ (fun (e, _) -> SetString.mem e st_events) ++ (load ~ctxt ()) + + +- let exists event data = ++ let exists ~ctxt event data = + List.exists + (fun v -> (event, data) = v) +- (load ()) ++ (load ~ctxt ()) + end + + module BaseBuilt = struct +@@ -4414,100 +4621,81 @@ module BaseBuilt = struct + + let to_log_event_file t nm = + "built_"^ +- (match t with +- | BExec -> "exec" +- | BExecLib -> "exec_lib" +- | BLib -> "lib" +- | BObj -> "obj" +- | BDoc -> "doc")^ +- "_"^nm ++ (match t with ++ | BExec -> "exec" ++ | BExecLib -> "exec_lib" ++ | BLib -> "lib" ++ | BObj -> "obj" ++ | BDoc -> "doc")^ ++ "_"^nm + + + let to_log_event_done t nm = + "is_"^(to_log_event_file t nm) + + +- let register t nm lst = +- BaseLog.register +- (to_log_event_done t nm) +- "true"; ++ let register ~ctxt t nm lst = ++ BaseLog.register ~ctxt (to_log_event_done t nm) "true"; + List.iter + (fun alt -> + let registered = + List.fold_left + (fun registered fn -> +- if OASISFileUtil.file_exists_case fn then +- begin +- BaseLog.register +- (to_log_event_file t nm) +- (if Filename.is_relative fn then +- Filename.concat (Sys.getcwd ()) fn +- else +- fn); +- true +- end +- else +- registered) ++ if OASISFileUtil.file_exists_case fn then begin ++ BaseLog.register ~ctxt ++ (to_log_event_file t nm) ++ (if Filename.is_relative fn then ++ Filename.concat (Sys.getcwd ()) fn ++ else ++ fn); ++ true ++ end else begin ++ registered ++ end) + false + alt + in +- if not registered then +- warning +- (f_ "Cannot find an existing alternative files among: %s") +- (String.concat (s_ ", ") alt)) ++ if not registered then ++ warning ++ (f_ "Cannot find an existing alternative files among: %s") ++ (String.concat (s_ ", ") alt)) + lst + + +- let unregister t nm = ++ let unregister ~ctxt t nm = + List.iter +- (fun (e, d) -> +- BaseLog.unregister e d) +- (BaseLog.filter +- [to_log_event_file t nm; +- to_log_event_done t nm]) ++ (fun (e, d) -> BaseLog.unregister ~ctxt e d) ++ (BaseLog.filter ~ctxt [to_log_event_file t nm; to_log_event_done t nm]) + + +- let fold t nm f acc = ++ let fold ~ctxt t nm f acc = + List.fold_left + (fun acc (_, fn) -> +- if OASISFileUtil.file_exists_case fn then +- begin +- f acc fn +- end +- else +- begin +- warning +- (f_ "File '%s' has been marked as built \ ++ if OASISFileUtil.file_exists_case fn then begin ++ f acc fn ++ end else begin ++ warning ++ (f_ "File '%s' has been marked as built \ + for %s but doesn't exist") +- fn +- (Printf.sprintf +- (match t with +- | BExec | BExecLib -> +- (f_ "executable %s") +- | BLib -> +- (f_ "library %s") +- | BObj -> +- (f_ "object %s") +- | BDoc -> +- (f_ "documentation %s")) +- nm); +- acc +- end) ++ fn ++ (Printf.sprintf ++ (match t with ++ | BExec | BExecLib -> (f_ "executable %s") ++ | BLib -> (f_ "library %s") ++ | BObj -> (f_ "object %s") ++ | BDoc -> (f_ "documentation %s")) ++ nm); ++ acc ++ end) + acc +- (BaseLog.filter +- [to_log_event_file t nm]) ++ (BaseLog.filter ~ctxt [to_log_event_file t nm]) + + +- let is_built t nm = ++ let is_built ~ctxt t nm = + List.fold_left +- (fun is_built (_, d) -> +- (try +- bool_of_string d +- with _ -> +- false)) ++ (fun _ (_, d) -> try bool_of_string d with _ -> false) + false +- (BaseLog.filter +- [to_log_event_done t nm]) ++ (BaseLog.filter ~ctxt [to_log_event_done t nm]) + + + let of_executable ffn (cs, bs, exec) = +@@ -4523,15 +4711,15 @@ module BaseBuilt = struct + let evs = + (BExec, cs.cs_name, [[ffn unix_exec_is]]) + :: +- (match unix_dll_opt with +- | Some fn -> +- [BExecLib, cs.cs_name, [[ffn fn]]] +- | None -> +- []) +- in +- evs, +- unix_exec_is, +- unix_dll_opt ++ (match unix_dll_opt with ++ | Some fn -> ++ [BExecLib, cs.cs_name, [[ffn fn]]] ++ | None -> ++ []) ++ in ++ evs, ++ unix_exec_is, ++ unix_dll_opt + + + let of_library ffn (cs, bs, lib) = +@@ -4539,7 +4727,7 @@ module BaseBuilt = struct + OASISLibrary.generated_unix_files + ~ctxt:!BaseContext.default + ~source_file_exists:(fun fn -> +- OASISFileUtil.file_exists_case (OASISHostPath.of_unix fn)) ++ OASISFileUtil.file_exists_case (OASISHostPath.of_unix fn)) + ~is_native:(bool_of_string (is_native ())) + ~has_native_dynlink:(bool_of_string (native_dynlink ())) + ~ext_lib:(ext_lib ()) +@@ -4551,7 +4739,7 @@ module BaseBuilt = struct + cs.cs_name, + List.map (List.map ffn) unix_lst] + in +- evs, unix_lst ++ evs, unix_lst + + + let of_object ffn (cs, bs, obj) = +@@ -4559,7 +4747,7 @@ module BaseBuilt = struct + OASISObject.generated_unix_files + ~ctxt:!BaseContext.default + ~source_file_exists:(fun fn -> +- OASISFileUtil.file_exists_case (OASISHostPath.of_unix fn)) ++ OASISFileUtil.file_exists_case (OASISHostPath.of_unix fn)) + ~is_native:(bool_of_string (is_native ())) + (cs, bs, obj) + in +@@ -4568,7 +4756,7 @@ module BaseBuilt = struct + cs.cs_name, + List.map (List.map ffn) unix_lst] + in +- evs, unix_lst ++ evs, unix_lst + + end + +@@ -4597,32 +4785,32 @@ module BaseCustom = struct + | Some (cmd, args) -> String.concat " " (cmd :: args) + | None -> s_ "No command" + in +- match +- var_choose +- ~name:(s_ "Pre/Post Command") +- ~printer +- lst with +- | Some (cmd, args) -> +- begin +- try +- run cmd args [||] +- with e when failsafe -> +- warning +- (f_ "Command '%s' fail with error: %s") +- (String.concat " " (cmd :: args)) +- (match e with +- | Failure msg -> msg +- | e -> Printexc.to_string e) +- end +- | None -> +- () ++ match ++ var_choose ++ ~name:(s_ "Pre/Post Command") ++ ~printer ++ lst with ++ | Some (cmd, args) -> ++ begin ++ try ++ run cmd args [||] ++ with e when failsafe -> ++ warning ++ (f_ "Command '%s' fail with error: %s") ++ (String.concat " " (cmd :: args)) ++ (match e with ++ | Failure msg -> msg ++ | e -> Printexc.to_string e) ++ end ++ | None -> ++ () + in + let res = + optional_command cstm.pre_command; + f e + in +- optional_command cstm.post_command; +- res ++ optional_command cstm.post_command; ++ res + end + + module BaseDynVar = struct +@@ -4635,41 +4823,38 @@ module BaseDynVar = struct + open BaseBuilt + + +- let init pkg = ++ let init ~ctxt pkg = + (* TODO: disambiguate exec vs other variable by adding exec_VARNAME. *) + (* TODO: provide compile option for library libary_byte_args_VARNAME... *) + List.iter + (function +- | Executable (cs, bs, exec) -> +- if var_choose bs.bs_build then +- var_ignore +- (var_redefine +- (* We don't save this variable *) +- ~dump:false +- ~short_desc:(fun () -> +- Printf.sprintf +- (f_ "Filename of executable '%s'") +- cs.cs_name) +- (OASISUtils.varname_of_string cs.cs_name) +- (fun () -> +- let fn_opt = +- fold +- BExec cs.cs_name +- (fun _ fn -> Some fn) +- None +- in +- match fn_opt with +- | Some fn -> fn +- | None -> +- raise +- (PropList.Not_set +- (cs.cs_name, +- Some (Printf.sprintf +- (f_ "Executable '%s' not yet built.") +- cs.cs_name))))) ++ | Executable (cs, bs, _) -> ++ if var_choose bs.bs_build then ++ var_ignore ++ (var_redefine ++ (* We don't save this variable *) ++ ~dump:false ++ ~short_desc:(fun () -> ++ Printf.sprintf ++ (f_ "Filename of executable '%s'") ++ cs.cs_name) ++ (OASISUtils.varname_of_string cs.cs_name) ++ (fun () -> ++ let fn_opt = ++ fold ~ctxt BExec cs.cs_name (fun _ fn -> Some fn) None ++ in ++ match fn_opt with ++ | Some fn -> fn ++ | None -> ++ raise ++ (PropList.Not_set ++ (cs.cs_name, ++ Some (Printf.sprintf ++ (f_ "Executable '%s' not yet built.") ++ cs.cs_name))))) + +- | Library _ | Object _ | Flag _ | Test _ | SrcRepo _ | Doc _ -> +- ()) ++ | Library _ | Object _ | Flag _ | Test _ | SrcRepo _ | Doc _ -> ++ ()) + pkg.sections + end + +@@ -4680,89 +4865,74 @@ module BaseTest = struct + open BaseEnv + open BaseMessage + open OASISTypes +- open OASISExpr + open OASISGettext + + +- let test lst pkg extra_args = ++ let test ~ctxt lst pkg extra_args = + + let one_test (failure, n) (test_plugin, cs, test) = + if var_choose +- ~name:(Printf.sprintf +- (f_ "test %s run") +- cs.cs_name) +- ~printer:string_of_bool +- test.test_run then ++ ~name:(Printf.sprintf ++ (f_ "test %s run") ++ cs.cs_name) ++ ~printer:string_of_bool ++ test.test_run then + begin +- let () = +- info (f_ "Running test '%s'") cs.cs_name +- in ++ let () = info (f_ "Running test '%s'") cs.cs_name in + let back_cwd = + match test.test_working_directory with + | Some dir -> +- let cwd = +- Sys.getcwd () +- in +- let chdir d = +- info (f_ "Changing directory to '%s'") d; +- Sys.chdir d +- in +- chdir dir; +- fun () -> chdir cwd ++ let cwd = Sys.getcwd () in ++ let chdir d = ++ info (f_ "Changing directory to '%s'") d; ++ Sys.chdir d ++ in ++ chdir dir; ++ fun () -> chdir cwd + + | None -> +- fun () -> () ++ fun () -> () + in +- try +- let failure_percent = +- BaseCustom.hook +- test.test_custom +- (test_plugin pkg (cs, test)) +- extra_args +- in +- back_cwd (); +- (failure_percent +. failure, n + 1) +- with e -> +- begin +- back_cwd (); +- raise e +- end ++ try ++ let failure_percent = ++ BaseCustom.hook ++ test.test_custom ++ (test_plugin ~ctxt pkg (cs, test)) ++ extra_args ++ in ++ back_cwd (); ++ (failure_percent +. failure, n + 1) ++ with e -> ++ begin ++ back_cwd (); ++ raise e ++ end + end + else + begin + info (f_ "Skipping test '%s'") cs.cs_name; +- (failure, n) +- end +- in +- let failed, n = +- List.fold_left +- one_test +- (0.0, 0) +- lst +- in +- let failure_percent = +- if n = 0 then +- 0.0 +- else +- failed /. (float_of_int n) ++ (failure, n) ++ end + in ++ let failed, n = List.fold_left one_test (0.0, 0) lst in ++ let failure_percent = if n = 0 then 0.0 else failed /. (float_of_int n) in + let msg = + Printf.sprintf + (f_ "Tests had a %.2f%% failure rate") + (100. *. failure_percent) + in +- if failure_percent > 0.0 then +- failwith msg +- else +- info "%s" msg; ++ if failure_percent > 0.0 then ++ failwith msg ++ else ++ info "%s" msg; + +- (* Possible explanation why the tests where not run. *) +- if OASISFeatures.package_test OASISFeatures.flag_tests pkg && +- not (bool_of_string (BaseStandardVar.tests ())) && +- lst <> [] then +- BaseMessage.warning +- "Tests are turned off, consider enabling with \ +- 'ocaml setup.ml -configure --enable-tests'" ++ (* Possible explanation why the tests where not run. *) ++ if OASISFeatures.package_test OASISFeatures.flag_tests pkg && ++ not (bool_of_string (BaseStandardVar.tests ())) && ++ lst <> [] then ++ BaseMessage.warning ++ "Tests are turned off, consider enabling with \ ++ 'ocaml setup.ml -configure --enable-tests'" + end + + module BaseDoc = struct +@@ -4775,74 +4945,79 @@ module BaseDoc = struct + open OASISGettext + + +- let doc lst pkg extra_args = ++ let doc ~ctxt lst pkg extra_args = + + let one_doc (doc_plugin, cs, doc) = + if var_choose +- ~name:(Printf.sprintf +- (f_ "documentation %s build") +- cs.cs_name) +- ~printer:string_of_bool +- doc.doc_build then ++ ~name:(Printf.sprintf ++ (f_ "documentation %s build") ++ cs.cs_name) ++ ~printer:string_of_bool ++ doc.doc_build then + begin + info (f_ "Building documentation '%s'") cs.cs_name; + BaseCustom.hook + doc.doc_custom +- (doc_plugin pkg (cs, doc)) ++ (doc_plugin ~ctxt pkg (cs, doc)) + extra_args + end + in +- List.iter one_doc lst; ++ List.iter one_doc lst; + +- if OASISFeatures.package_test OASISFeatures.flag_docs pkg && +- not (bool_of_string (BaseStandardVar.docs ())) && +- lst <> [] then +- BaseMessage.warning +- "Docs are turned off, consider enabling with \ +- 'ocaml setup.ml -configure --enable-docs'" ++ if OASISFeatures.package_test OASISFeatures.flag_docs pkg && ++ not (bool_of_string (BaseStandardVar.docs ())) && ++ lst <> [] then ++ BaseMessage.warning ++ "Docs are turned off, consider enabling with \ ++ 'ocaml setup.ml -configure --enable-docs'" + end + + module BaseSetup = struct + (* # 22 "src/base/BaseSetup.ml" *) + ++ open OASISContext + open BaseEnv + open BaseMessage + open OASISTypes +- open OASISSection + open OASISGettext + open OASISUtils + + + type std_args_fun = +- package -> string array -> unit ++ ctxt:OASISContext.t -> package -> string array -> unit + + + type ('a, 'b) section_args_fun = +- name * (package -> (common_section * 'a) -> string array -> 'b) ++ name * ++ (ctxt:OASISContext.t -> ++ package -> ++ (common_section * 'a) -> ++ string array -> ++ 'b) + + + type t = +- { +- configure: std_args_fun; +- build: std_args_fun; +- doc: ((doc, unit) section_args_fun) list; +- test: ((test, float) section_args_fun) list; +- install: std_args_fun; +- uninstall: std_args_fun; +- clean: std_args_fun list; +- clean_doc: (doc, unit) section_args_fun list; +- clean_test: (test, unit) section_args_fun list; +- distclean: std_args_fun list; +- distclean_doc: (doc, unit) section_args_fun list; +- distclean_test: (test, unit) section_args_fun list; +- package: package; +- oasis_fn: string option; +- oasis_version: string; +- oasis_digest: Digest.t option; +- oasis_exec: string option; +- oasis_setup_args: string list; +- setup_update: bool; +- } ++ { ++ configure: std_args_fun; ++ build: std_args_fun; ++ doc: ((doc, unit) section_args_fun) list; ++ test: ((test, float) section_args_fun) list; ++ install: std_args_fun; ++ uninstall: std_args_fun; ++ clean: std_args_fun list; ++ clean_doc: (doc, unit) section_args_fun list; ++ clean_test: (test, unit) section_args_fun list; ++ distclean: std_args_fun list; ++ distclean_doc: (doc, unit) section_args_fun list; ++ distclean_test: (test, unit) section_args_fun list; ++ package: package; ++ oasis_fn: string option; ++ oasis_version: string; ++ oasis_digest: Digest.t option; ++ oasis_exec: string option; ++ oasis_setup_args: string list; ++ setup_update: bool; ++ } + + + (* Associate a plugin function with data from package *) +@@ -4852,9 +5027,9 @@ module BaseSetup = struct + (fun acc sct -> + match filter_map sct with + | Some e -> +- e :: acc ++ e :: acc + | None -> +- acc) ++ acc) + [] + lst) + +@@ -4871,7 +5046,7 @@ module BaseSetup = struct + action + + +- let configure t args = ++ let configure ~ctxt t args = + (* Run configure *) + BaseCustom.hook + t.package.conf_custom +@@ -4880,154 +5055,137 @@ module BaseSetup = struct + begin + try + unload (); +- load (); ++ load ~ctxt (); + with _ -> + () + end; + + (* Run plugin's configure *) +- t.configure t.package args; ++ t.configure ~ctxt t.package args; + + (* Dump to allow postconf to change it *) +- dump ()) ++ dump ~ctxt ()) + (); + + (* Reload environment *) + unload (); +- load (); ++ load ~ctxt (); + + (* Save environment *) + print (); + + (* Replace data in file *) +- BaseFileAB.replace t.package.files_ab ++ BaseFileAB.replace ~ctxt t.package.files_ab + + +- let build t args = ++ let build ~ctxt t args = + BaseCustom.hook + t.package.build_custom +- (t.build t.package) ++ (t.build ~ctxt t.package) + args + + +- let doc t args = ++ let doc ~ctxt t args = + BaseDoc.doc ++ ~ctxt + (join_plugin_sections + (function +- | Doc (cs, e) -> +- Some +- (lookup_plugin_section +- "documentation" +- (s_ "build") +- cs.cs_name +- t.doc, +- cs, +- e) +- | _ -> +- None) ++ | Doc (cs, e) -> ++ Some ++ (lookup_plugin_section ++ "documentation" ++ (s_ "build") ++ cs.cs_name ++ t.doc, ++ cs, ++ e) ++ | _ -> ++ None) + t.package.sections) + t.package + args + + +- let test t args = ++ let test ~ctxt t args = + BaseTest.test ++ ~ctxt + (join_plugin_sections + (function +- | Test (cs, e) -> +- Some +- (lookup_plugin_section +- "test" +- (s_ "run") +- cs.cs_name +- t.test, +- cs, +- e) +- | _ -> +- None) ++ | Test (cs, e) -> ++ Some ++ (lookup_plugin_section ++ "test" ++ (s_ "run") ++ cs.cs_name ++ t.test, ++ cs, ++ e) ++ | _ -> ++ None) + t.package.sections) + t.package + args + + +- let all t args = +- let rno_doc = +- ref false +- in +- let rno_test = +- ref false +- in +- let arg_rest = +- ref [] +- in +- Arg.parse_argv +- ~current:(ref 0) +- (Array.of_list +- ((Sys.executable_name^" all") :: ++ let all ~ctxt t args = ++ let rno_doc = ref false in ++ let rno_test = ref false in ++ let arg_rest = ref [] in ++ Arg.parse_argv ++ ~current:(ref 0) ++ (Array.of_list ++ ((Sys.executable_name^" all") :: + (Array.to_list args))) +- [ +- "-no-doc", +- Arg.Set rno_doc, +- s_ "Don't run doc target"; +- +- "-no-test", +- Arg.Set rno_test, +- s_ "Don't run test target"; +- +- "--", +- Arg.Rest (fun arg -> arg_rest := arg :: !arg_rest), +- s_ "All arguments for configure."; +- ] +- (failwithf (f_ "Don't know what to do with '%s'")) +- ""; +- +- info "Running configure step"; +- configure t (Array.of_list (List.rev !arg_rest)); ++ [ ++ "-no-doc", ++ Arg.Set rno_doc, ++ s_ "Don't run doc target"; ++ ++ "-no-test", ++ Arg.Set rno_test, ++ s_ "Don't run test target"; ++ ++ "--", ++ Arg.Rest (fun arg -> arg_rest := arg :: !arg_rest), ++ s_ "All arguments for configure."; ++ ] ++ (failwithf (f_ "Don't know what to do with '%s'")) ++ ""; + +- info "Running build step"; +- build t [||]; ++ info "Running configure step"; ++ configure ~ctxt t (Array.of_list (List.rev !arg_rest)); + +- (* Load setup.log dynamic variables *) +- BaseDynVar.init t.package; ++ info "Running build step"; ++ build ~ctxt t [||]; + +- if not !rno_doc then +- begin +- info "Running doc step"; +- doc t [||]; +- end +- else +- begin +- info "Skipping doc step" +- end; ++ (* Load setup.log dynamic variables *) ++ BaseDynVar.init ~ctxt t.package; + +- if not !rno_test then +- begin +- info "Running test step"; +- test t [||] +- end +- else +- begin +- info "Skipping test step" +- end ++ if not !rno_doc then begin ++ info "Running doc step"; ++ doc ~ctxt t [||] ++ end else begin ++ info "Skipping doc step" ++ end; ++ if not !rno_test then begin ++ info "Running test step"; ++ test ~ctxt t [||] ++ end else begin ++ info "Skipping test step" ++ end + + +- let install t args = +- BaseCustom.hook +- t.package.install_custom +- (t.install t.package) +- args ++ let install ~ctxt t args = ++ BaseCustom.hook t.package.install_custom (t.install ~ctxt t.package) args + + +- let uninstall t args = +- BaseCustom.hook +- t.package.uninstall_custom +- (t.uninstall t.package) +- args ++ let uninstall ~ctxt t args = ++ BaseCustom.hook t.package.uninstall_custom (t.uninstall ~ctxt t.package) args + + +- let reinstall t args = +- uninstall t args; +- install t args ++ let reinstall ~ctxt t args = ++ uninstall ~ctxt t args; ++ install ~ctxt t args + + + let clean, distclean = +@@ -5038,11 +5196,11 @@ module BaseSetup = struct + warning + (f_ "Action fail with error: %s") + (match e with +- | Failure msg -> msg +- | e -> Printexc.to_string e) ++ | Failure msg -> msg ++ | e -> Printexc.to_string e) + in + +- let generic_clean t cstm mains docs tests args = ++ let generic_clean ~ctxt t cstm mains docs tests args = + BaseCustom.hook + ~failsafe:true + cstm +@@ -5050,45 +5208,32 @@ module BaseSetup = struct + (* Clean section *) + List.iter + (function +- | Test (cs, test) -> +- let f = +- try +- List.assoc cs.cs_name tests +- with Not_found -> +- fun _ _ _ -> () +- in +- failsafe +- (f t.package (cs, test)) +- args +- | Doc (cs, doc) -> +- let f = +- try +- List.assoc cs.cs_name docs +- with Not_found -> +- fun _ _ _ -> () +- in +- failsafe +- (f t.package (cs, doc)) +- args +- | Library _ +- | Object _ +- | Executable _ +- | Flag _ +- | SrcRepo _ -> +- ()) ++ | Test (cs, test) -> ++ let f = ++ try ++ List.assoc cs.cs_name tests ++ with Not_found -> ++ fun ~ctxt:_ _ _ _ -> () ++ in ++ failsafe (f ~ctxt t.package (cs, test)) args ++ | Doc (cs, doc) -> ++ let f = ++ try ++ List.assoc cs.cs_name docs ++ with Not_found -> ++ fun ~ctxt:_ _ _ _ -> () ++ in ++ failsafe (f ~ctxt t.package (cs, doc)) args ++ | Library _ | Object _ | Executable _ | Flag _ | SrcRepo _ -> ()) + t.package.sections; + (* Clean whole package *) +- List.iter +- (fun f -> +- failsafe +- (f t.package) +- args) +- mains) ++ List.iter (fun f -> failsafe (f ~ctxt t.package) args) mains) + () + in + +- let clean t args = ++ let clean ~ctxt t args = + generic_clean ++ ~ctxt + t + t.package.clean_custom + t.clean +@@ -5097,12 +5242,13 @@ module BaseSetup = struct + args + in + +- let distclean t args = ++ let distclean ~ctxt t args = + (* Call clean *) +- clean t args; ++ clean ~ctxt t args; + + (* Call distclean code *) + generic_clean ++ ~ctxt + t + t.package.distclean_custom + t.distclean +@@ -5110,36 +5256,31 @@ module BaseSetup = struct + t.distclean_test + args; + +- (* Remove generated file *) ++ (* Remove generated source files. *) + List.iter + (fun fn -> +- if Sys.file_exists fn then +- begin +- info (f_ "Remove '%s'") fn; +- Sys.remove fn +- end) +- (BaseEnv.default_filename +- :: +- BaseLog.default_filename +- :: +- (List.rev_map BaseFileAB.to_filename t.package.files_ab)) ++ if ctxt.srcfs#file_exists fn then begin ++ info (f_ "Remove '%s'") (ctxt.srcfs#string_of_filename fn); ++ ctxt.srcfs#remove fn ++ end) ++ ([BaseEnv.default_filename; BaseLog.default_filename] ++ @ (List.rev_map BaseFileAB.to_filename t.package.files_ab)) + in + +- clean, distclean ++ clean, distclean + + +- let version t _ = +- print_endline t.oasis_version ++ let version ~ctxt:_ (t: t) _ = print_endline t.oasis_version + + + let update_setup_ml, no_update_setup_ml_cli = + let b = ref true in +- b, +- ("-no-update-setup-ml", +- Arg.Clear b, +- s_ " Don't try to update setup.ml, even if _oasis has changed.") +- ++ b, ++ ("-no-update-setup-ml", ++ Arg.Clear b, ++ s_ " Don't try to update setup.ml, even if _oasis has changed.") + ++ (* TODO: srcfs *) + let default_oasis_fn = "_oasis" + + +@@ -5160,16 +5301,16 @@ module BaseSetup = struct + let setup_ml, args = + match Array.to_list Sys.argv with + | setup_ml :: args -> +- setup_ml, args ++ setup_ml, args + | [] -> +- failwith +- (s_ "Expecting non-empty command line arguments.") ++ failwith ++ (s_ "Expecting non-empty command line arguments.") + in + let ocaml, setup_ml = + if Sys.executable_name = Sys.argv.(0) then + (* We are not running in standard mode, probably the script + * is precompiled. +- *) ++ *) + "ocaml", "setup.ml" + else + ocaml, setup_ml +@@ -5180,64 +5321,62 @@ module BaseSetup = struct + OASISExec.run_read_one_line + ~ctxt:!BaseContext.default + ~f_exit_code: +- (function +- | 0 -> +- () +- | 1 -> +- failwithf +- (f_ "Executable '%s' is probably an old version \ +- of oasis (< 0.3.0), please update to version \ +- v%s.") +- oasis_exec t.oasis_version +- | 127 -> +- failwithf +- (f_ "Cannot find executable '%s', please install \ +- oasis v%s.") +- oasis_exec t.oasis_version +- | n -> +- failwithf +- (f_ "Command '%s version' exited with code %d.") +- oasis_exec n) ++ (function ++ | 0 -> ++ () ++ | 1 -> ++ failwithf ++ (f_ "Executable '%s' is probably an old version \ ++ of oasis (< 0.3.0), please update to version \ ++ v%s.") ++ oasis_exec t.oasis_version ++ | 127 -> ++ failwithf ++ (f_ "Cannot find executable '%s', please install \ ++ oasis v%s.") ++ oasis_exec t.oasis_version ++ | n -> ++ failwithf ++ (f_ "Command '%s version' exited with code %d.") ++ oasis_exec n) + oasis_exec ["version"] + in +- if OASISVersion.comparator_apply +- (OASISVersion.version_of_string oasis_exec_version) +- (OASISVersion.VGreaterEqual +- (OASISVersion.version_of_string t.oasis_version)) then +- begin +- (* We have a version >= for the executable oasis, proceed with +- * update. +- *) +- (* TODO: delegate this check to 'oasis setup'. *) +- if Sys.os_type = "Win32" then +- failwithf +- (f_ "It is not possible to update the running script \ +- setup.ml on Windows. Please update setup.ml by \ +- running '%s'.") +- (String.concat " " (oasis_exec :: "setup" :: t.oasis_setup_args)) +- else +- begin +- OASISExec.run +- ~ctxt:!BaseContext.default +- ~f_exit_code: +- (function +- | 0 -> +- () +- | n -> +- failwithf +- (f_ "Unable to update setup.ml using '%s', \ +- please fix the problem and retry.") +- oasis_exec) +- oasis_exec ("setup" :: t.oasis_setup_args); +- OASISExec.run ~ctxt:!BaseContext.default ocaml (setup_ml :: args) +- end +- end +- else +- failwithf +- (f_ "The version of '%s' (v%s) doesn't match the version of \ +- oasis used to generate the %s file. Please install at \ +- least oasis v%s.") +- oasis_exec oasis_exec_version setup_ml t.oasis_version ++ if OASISVersion.comparator_apply ++ (OASISVersion.version_of_string oasis_exec_version) ++ (OASISVersion.VGreaterEqual ++ (OASISVersion.version_of_string t.oasis_version)) then ++ begin ++ (* We have a version >= for the executable oasis, proceed with ++ * update. ++ *) ++ (* TODO: delegate this check to 'oasis setup'. *) ++ if Sys.os_type = "Win32" then ++ failwithf ++ (f_ "It is not possible to update the running script \ ++ setup.ml on Windows. Please update setup.ml by \ ++ running '%s'.") ++ (String.concat " " (oasis_exec :: "setup" :: t.oasis_setup_args)) ++ else ++ begin ++ OASISExec.run ++ ~ctxt:!BaseContext.default ++ ~f_exit_code: ++ (fun n -> ++ if n <> 0 then ++ failwithf ++ (f_ "Unable to update setup.ml using '%s', \ ++ please fix the problem and retry.") ++ oasis_exec) ++ oasis_exec ("setup" :: t.oasis_setup_args); ++ OASISExec.run ~ctxt:!BaseContext.default ocaml (setup_ml :: args) ++ end ++ end ++ else ++ failwithf ++ (f_ "The version of '%s' (v%s) doesn't match the version of \ ++ oasis used to generate the %s file. Please install at \ ++ least oasis v%s.") ++ oasis_exec oasis_exec_version setup_ml t.oasis_version + in + + if !update_setup_ml then +@@ -5254,7 +5393,7 @@ module BaseSetup = struct + else + false + | None -> +- false ++ false + with e -> + error + (f_ "Error when updating setup.ml. If you want to avoid this error, \ +@@ -5268,158 +5407,287 @@ module BaseSetup = struct + + + let setup t = +- let catch_exn = +- ref true +- in +- try +- let act_ref = +- ref (fun _ -> +- failwithf +- (f_ "No action defined, run '%s %s -help'") +- Sys.executable_name +- Sys.argv.(0)) +- +- in +- let extra_args_ref = +- ref [] +- in +- let allow_empty_env_ref = +- ref false +- in +- let arg_handle ?(allow_empty_env=false) act = +- Arg.Tuple +- [ +- Arg.Rest (fun str -> extra_args_ref := str :: !extra_args_ref); +- +- Arg.Unit +- (fun () -> +- allow_empty_env_ref := allow_empty_env; +- act_ref := act); +- ] +- in ++ let catch_exn = ref true in ++ let act_ref = ++ ref (fun ~ctxt:_ _ -> ++ failwithf ++ (f_ "No action defined, run '%s %s -help'") ++ Sys.executable_name ++ Sys.argv.(0)) + +- Arg.parse +- (Arg.align +- ([ +- "-configure", +- arg_handle ~allow_empty_env:true configure, +- s_ "[options*] Configure the whole build process."; +- +- "-build", +- arg_handle build, +- s_ "[options*] Build executables and libraries."; +- +- "-doc", +- arg_handle doc, +- s_ "[options*] Build documents."; +- +- "-test", +- arg_handle test, +- s_ "[options*] Run tests."; +- +- "-all", +- arg_handle ~allow_empty_env:true all, +- s_ "[options*] Run configure, build, doc and test targets."; +- +- "-install", +- arg_handle install, +- s_ "[options*] Install libraries, data, executables \ +- and documents."; +- +- "-uninstall", +- arg_handle uninstall, +- s_ "[options*] Uninstall libraries, data, executables \ +- and documents."; +- +- "-reinstall", +- arg_handle reinstall, +- s_ "[options*] Uninstall and install libraries, data, \ +- executables and documents."; +- +- "-clean", +- arg_handle ~allow_empty_env:true clean, +- s_ "[options*] Clean files generated by a build."; +- +- "-distclean", +- arg_handle ~allow_empty_env:true distclean, +- s_ "[options*] Clean files generated by a build and configure."; +- +- "-version", +- arg_handle ~allow_empty_env:true version, +- s_ " Display version of OASIS used to generate this setup.ml."; +- +- "-no-catch-exn", +- Arg.Clear catch_exn, +- s_ " Don't catch exception, useful for debugging."; +- ] +- @ ++ in ++ let extra_args_ref = ref [] in ++ let allow_empty_env_ref = ref false in ++ let arg_handle ?(allow_empty_env=false) act = ++ Arg.Tuple ++ [ ++ Arg.Rest (fun str -> extra_args_ref := str :: !extra_args_ref); ++ Arg.Unit ++ (fun () -> ++ allow_empty_env_ref := allow_empty_env; ++ act_ref := act); ++ ] ++ in ++ try ++ let () = ++ Arg.parse ++ (Arg.align ++ ([ ++ "-configure", ++ arg_handle ~allow_empty_env:true configure, ++ s_ "[options*] Configure the whole build process."; ++ ++ "-build", ++ arg_handle build, ++ s_ "[options*] Build executables and libraries."; ++ ++ "-doc", ++ arg_handle doc, ++ s_ "[options*] Build documents."; ++ ++ "-test", ++ arg_handle test, ++ s_ "[options*] Run tests."; ++ ++ "-all", ++ arg_handle ~allow_empty_env:true all, ++ s_ "[options*] Run configure, build, doc and test targets."; ++ ++ "-install", ++ arg_handle install, ++ s_ "[options*] Install libraries, data, executables \ ++ and documents."; ++ ++ "-uninstall", ++ arg_handle uninstall, ++ s_ "[options*] Uninstall libraries, data, executables \ ++ and documents."; ++ ++ "-reinstall", ++ arg_handle reinstall, ++ s_ "[options*] Uninstall and install libraries, data, \ ++ executables and documents."; ++ ++ "-clean", ++ arg_handle ~allow_empty_env:true clean, ++ s_ "[options*] Clean files generated by a build."; ++ ++ "-distclean", ++ arg_handle ~allow_empty_env:true distclean, ++ s_ "[options*] Clean files generated by a build and configure."; ++ ++ "-version", ++ arg_handle ~allow_empty_env:true version, ++ s_ " Display version of OASIS used to generate this setup.ml."; ++ ++ "-no-catch-exn", ++ Arg.Clear catch_exn, ++ s_ " Don't catch exception, useful for debugging."; ++ ] ++ @ + (if t.setup_update then + [no_update_setup_ml_cli] + else + []) +- @ (BaseContext.args ()))) +- (failwithf (f_ "Don't know what to do with '%s'")) +- (s_ "Setup and run build process current package\n"); ++ @ (BaseContext.args ()))) ++ (failwithf (f_ "Don't know what to do with '%s'")) ++ (s_ "Setup and run build process current package\n") ++ in + +- (* Build initial environment *) +- load ~allow_empty:!allow_empty_env_ref (); ++ (* Instantiate the context. *) ++ let ctxt = !BaseContext.default in + +- (** Initialize flags *) +- List.iter +- (function +- | Flag (cs, {flag_description = hlp; +- flag_default = choices}) -> +- begin +- let apply ?short_desc () = +- var_ignore +- (var_define +- ~cli:CLIEnable +- ?short_desc +- (OASISUtils.varname_of_string cs.cs_name) +- (fun () -> +- string_of_bool +- (var_choose +- ~name:(Printf.sprintf +- (f_ "default value of flag %s") +- cs.cs_name) +- ~printer:string_of_bool +- choices))) +- in +- match hlp with +- | Some hlp -> +- apply ~short_desc:(fun () -> hlp) () +- | None -> +- apply () +- end +- | _ -> +- ()) +- t.package.sections; ++ (* Build initial environment *) ++ load ~ctxt ~allow_empty:!allow_empty_env_ref (); ++ ++ (** Initialize flags *) ++ List.iter ++ (function ++ | Flag (cs, {flag_description = hlp; ++ flag_default = choices}) -> ++ begin ++ let apply ?short_desc () = ++ var_ignore ++ (var_define ++ ~cli:CLIEnable ++ ?short_desc ++ (OASISUtils.varname_of_string cs.cs_name) ++ (fun () -> ++ string_of_bool ++ (var_choose ++ ~name:(Printf.sprintf ++ (f_ "default value of flag %s") ++ cs.cs_name) ++ ~printer:string_of_bool ++ choices))) ++ in ++ match hlp with ++ | Some hlp -> apply ~short_desc:(fun () -> hlp) () ++ | None -> apply () ++ end ++ | _ -> ++ ()) ++ t.package.sections; + +- BaseStandardVar.init t.package; ++ BaseStandardVar.init t.package; + +- BaseDynVar.init t.package; ++ BaseDynVar.init ~ctxt t.package; + +- if t.setup_update && update_setup_ml t then +- () +- else +- !act_ref t (Array.of_list (List.rev !extra_args_ref)) ++ if not (t.setup_update && update_setup_ml t) then ++ !act_ref ~ctxt t (Array.of_list (List.rev !extra_args_ref)) ++ ++ with e when !catch_exn -> ++ error "%s" (Printexc.to_string e); ++ exit 1 ++ ++ ++end ++ ++module BaseCompat = struct ++(* # 22 "src/base/BaseCompat.ml" *) ++ ++ (** Compatibility layer to provide a stable API inside setup.ml. ++ This layer allows OASIS to change in between minor versions ++ (e.g. 0.4.6 -> 0.4.7) but still provides a stable API inside setup.ml. This ++ enables to write functions that manipulate setup_t inside setup.ml. See ++ deps.ml for an example. ++ ++ The module opened by default will depend on the version of the _oasis. E.g. ++ if we have "OASISFormat: 0.3", the module Compat_0_3 will be opened and ++ the function Compat_0_3 will be called. If setup.ml is generated with the ++ -nocompat, no module will be opened. ++ ++ @author Sylvain Le Gall ++ *) ++ ++ module Compat_0_4 = ++ struct ++ let rctxt = ref !BaseContext.default ++ ++ module BaseSetup = ++ struct ++ module Original = BaseSetup ++ ++ open OASISTypes ++ ++ type std_args_fun = package -> string array -> unit ++ type ('a, 'b) section_args_fun = ++ name * (package -> (common_section * 'a) -> string array -> 'b) ++ type t = ++ { ++ configure: std_args_fun; ++ build: std_args_fun; ++ doc: ((doc, unit) section_args_fun) list; ++ test: ((test, float) section_args_fun) list; ++ install: std_args_fun; ++ uninstall: std_args_fun; ++ clean: std_args_fun list; ++ clean_doc: (doc, unit) section_args_fun list; ++ clean_test: (test, unit) section_args_fun list; ++ distclean: std_args_fun list; ++ distclean_doc: (doc, unit) section_args_fun list; ++ distclean_test: (test, unit) section_args_fun list; ++ package: package; ++ oasis_fn: string option; ++ oasis_version: string; ++ oasis_digest: Digest.t option; ++ oasis_exec: string option; ++ oasis_setup_args: string list; ++ setup_update: bool; ++ } ++ ++ let setup t = ++ let mk_std_args_fun f = ++ fun ~ctxt pkg args -> rctxt := ctxt; f pkg args ++ in ++ let mk_section_args_fun l = ++ List.map ++ (fun (nm, f) -> ++ nm, ++ (fun ~ctxt pkg sct args -> ++ rctxt := ctxt; ++ f pkg sct args)) ++ l ++ in ++ let t' = ++ { ++ Original. ++ configure = mk_std_args_fun t.configure; ++ build = mk_std_args_fun t.build; ++ doc = mk_section_args_fun t.doc; ++ test = mk_section_args_fun t.test; ++ install = mk_std_args_fun t.install; ++ uninstall = mk_std_args_fun t.uninstall; ++ clean = List.map mk_std_args_fun t.clean; ++ clean_doc = mk_section_args_fun t.clean_doc; ++ clean_test = mk_section_args_fun t.clean_test; ++ distclean = List.map mk_std_args_fun t.distclean; ++ distclean_doc = mk_section_args_fun t.distclean_doc; ++ distclean_test = mk_section_args_fun t.distclean_test; ++ ++ package = t.package; ++ oasis_fn = t.oasis_fn; ++ oasis_version = t.oasis_version; ++ oasis_digest = t.oasis_digest; ++ oasis_exec = t.oasis_exec; ++ oasis_setup_args = t.oasis_setup_args; ++ setup_update = t.setup_update; ++ } ++ in ++ Original.setup t' ++ ++ end ++ ++ let adapt_setup_t setup_t = ++ let module O = BaseSetup.Original in ++ let mk_std_args_fun f = fun pkg args -> f ~ctxt:!rctxt pkg args in ++ let mk_section_args_fun l = ++ List.map ++ (fun (nm, f) -> nm, (fun pkg sct args -> f ~ctxt:!rctxt pkg sct args)) ++ l ++ in ++ { ++ BaseSetup. ++ configure = mk_std_args_fun setup_t.O.configure; ++ build = mk_std_args_fun setup_t.O.build; ++ doc = mk_section_args_fun setup_t.O.doc; ++ test = mk_section_args_fun setup_t.O.test; ++ install = mk_std_args_fun setup_t.O.install; ++ uninstall = mk_std_args_fun setup_t.O.uninstall; ++ clean = List.map mk_std_args_fun setup_t.O.clean; ++ clean_doc = mk_section_args_fun setup_t.O.clean_doc; ++ clean_test = mk_section_args_fun setup_t.O.clean_test; ++ distclean = List.map mk_std_args_fun setup_t.O.distclean; ++ distclean_doc = mk_section_args_fun setup_t.O.distclean_doc; ++ distclean_test = mk_section_args_fun setup_t.O.distclean_test; ++ ++ package = setup_t.O.package; ++ oasis_fn = setup_t.O.oasis_fn; ++ oasis_version = setup_t.O.oasis_version; ++ oasis_digest = setup_t.O.oasis_digest; ++ oasis_exec = setup_t.O.oasis_exec; ++ oasis_setup_args = setup_t.O.oasis_setup_args; ++ setup_update = setup_t.O.setup_update; ++ } ++ end + +- with e when !catch_exn -> +- error "%s" (Printexc.to_string e); +- exit 1 + ++ module Compat_0_3 = ++ struct ++ include Compat_0_4 ++ end + + end + + +-# 5394 "setup.ml" ++# 5662 "setup.ml" + module InternalConfigurePlugin = struct + (* # 22 "src/plugins/internal/InternalConfigurePlugin.ml" *) + + + (** Configure using internal scheme + @author Sylvain Le Gall +- *) ++ *) + + + open BaseEnv +@@ -5430,9 +5698,9 @@ module InternalConfigurePlugin = struct + + + (** Configure build using provided series of check to be done +- * and then output corresponding file. +- *) +- let configure pkg argv = ++ and then output corresponding file. ++ *) ++ let configure ~ctxt:_ pkg argv = + let var_ignore_eval var = let _s: string = var () in () in + let errors = ref SetString.empty in + let buff = Buffer.create 13 in +@@ -5454,29 +5722,29 @@ module InternalConfigurePlugin = struct + let check_tools lst = + List.iter + (function +- | ExternalTool tool -> +- begin +- try +- var_ignore_eval (BaseCheck.prog tool) +- with e -> +- warn_exception e; +- add_errors (f_ "Cannot find external tool '%s'") tool +- end +- | InternalExecutable nm1 -> +- (* Check that matching tool is built *) +- List.iter +- (function +- | Executable ({cs_name = nm2}, +- {bs_build = build}, +- _) when nm1 = nm2 -> +- if not (var_choose build) then +- add_errors +- (f_ "Cannot find buildable internal executable \ +- '%s' when checking build depends") +- nm1 +- | _ -> +- ()) +- pkg.sections) ++ | ExternalTool tool -> ++ begin ++ try ++ var_ignore_eval (BaseCheck.prog tool) ++ with e -> ++ warn_exception e; ++ add_errors (f_ "Cannot find external tool '%s'") tool ++ end ++ | InternalExecutable nm1 -> ++ (* Check that matching tool is built *) ++ List.iter ++ (function ++ | Executable ({cs_name = nm2; _}, ++ {bs_build = build; _}, ++ _) when nm1 = nm2 -> ++ if not (var_choose build) then ++ add_errors ++ (f_ "Cannot find buildable internal executable \ ++ '%s' when checking build depends") ++ nm1 ++ | _ -> ++ ()) ++ pkg.sections) + lst + in + +@@ -5500,39 +5768,39 @@ module InternalConfigurePlugin = struct + (* Check depends *) + List.iter + (function +- | FindlibPackage (findlib_pkg, version_comparator) -> +- begin +- try +- var_ignore_eval +- (BaseCheck.package ?version_comparator findlib_pkg) +- with e -> +- warn_exception e; +- match version_comparator with +- | None -> +- add_errors +- (f_ "Cannot find findlib package %s") +- findlib_pkg +- | Some ver_cmp -> +- add_errors +- (f_ "Cannot find findlib package %s (%s)") +- findlib_pkg +- (OASISVersion.string_of_comparator ver_cmp) +- end +- | InternalLibrary nm1 -> +- (* Check that matching library is built *) +- List.iter +- (function +- | Library ({cs_name = nm2}, +- {bs_build = build}, +- _) when nm1 = nm2 -> +- if not (var_choose build) then +- add_errors +- (f_ "Cannot find buildable internal library \ +- '%s' when checking build depends") +- nm1 +- | _ -> +- ()) +- pkg.sections) ++ | FindlibPackage (findlib_pkg, version_comparator) -> ++ begin ++ try ++ var_ignore_eval ++ (BaseCheck.package ?version_comparator findlib_pkg) ++ with e -> ++ warn_exception e; ++ match version_comparator with ++ | None -> ++ add_errors ++ (f_ "Cannot find findlib package %s") ++ findlib_pkg ++ | Some ver_cmp -> ++ add_errors ++ (f_ "Cannot find findlib package %s (%s)") ++ findlib_pkg ++ (OASISVersion.string_of_comparator ver_cmp) ++ end ++ | InternalLibrary nm1 -> ++ (* Check that matching library is built *) ++ List.iter ++ (function ++ | Library ({cs_name = nm2; _}, ++ {bs_build = build; _}, ++ _) when nm1 = nm2 -> ++ if not (var_choose build) then ++ add_errors ++ (f_ "Cannot find buildable internal library \ ++ '%s' when checking build depends") ++ nm1 ++ | _ -> ++ ()) ++ pkg.sections) + bs.bs_build_depends + end + in +@@ -5544,50 +5812,50 @@ module InternalConfigurePlugin = struct + begin + match pkg.ocaml_version with + | Some ver_cmp -> +- begin +- try +- var_ignore_eval +- (BaseCheck.version +- "ocaml" +- ver_cmp +- BaseStandardVar.ocaml_version) +- with e -> +- warn_exception e; +- add_errors +- (f_ "OCaml version %s doesn't match version constraint %s") +- (BaseStandardVar.ocaml_version ()) +- (OASISVersion.string_of_comparator ver_cmp) +- end ++ begin ++ try ++ var_ignore_eval ++ (BaseCheck.version ++ "ocaml" ++ ver_cmp ++ BaseStandardVar.ocaml_version) ++ with e -> ++ warn_exception e; ++ add_errors ++ (f_ "OCaml version %s doesn't match version constraint %s") ++ (BaseStandardVar.ocaml_version ()) ++ (OASISVersion.string_of_comparator ver_cmp) ++ end + | None -> +- () ++ () + end; + + (* Findlib version *) + begin + match pkg.findlib_version with + | Some ver_cmp -> +- begin +- try +- var_ignore_eval +- (BaseCheck.version +- "findlib" +- ver_cmp +- BaseStandardVar.findlib_version) +- with e -> +- warn_exception e; +- add_errors +- (f_ "Findlib version %s doesn't match version constraint %s") +- (BaseStandardVar.findlib_version ()) +- (OASISVersion.string_of_comparator ver_cmp) +- end ++ begin ++ try ++ var_ignore_eval ++ (BaseCheck.version ++ "findlib" ++ ver_cmp ++ BaseStandardVar.findlib_version) ++ with e -> ++ warn_exception e; ++ add_errors ++ (f_ "Findlib version %s doesn't match version constraint %s") ++ (BaseStandardVar.findlib_version ()) ++ (OASISVersion.string_of_comparator ver_cmp) ++ end + | None -> +- () ++ () + end; + (* Make sure the findlib version is fine for the OCaml compiler. *) + begin + let ocaml_ge4 = + OASISVersion.version_compare +- (OASISVersion.version_of_string (BaseStandardVar.ocaml_version())) ++ (OASISVersion.version_of_string (BaseStandardVar.ocaml_version ())) + (OASISVersion.version_of_string "4.0.0") >= 0 in + if ocaml_ge4 then + let findlib_lt132 = +@@ -5612,37 +5880,37 @@ module InternalConfigurePlugin = struct + (* Check build depends *) + List.iter + (function +- | Executable (_, bs, _) +- | Library (_, bs, _) as sct -> +- build_checks sct bs +- | Doc (_, doc) -> +- if var_choose doc.doc_build then +- check_tools doc.doc_build_tools +- | Test (_, test) -> +- if var_choose test.test_run then +- check_tools test.test_tools +- | _ -> +- ()) ++ | Executable (_, bs, _) ++ | Library (_, bs, _) as sct -> ++ build_checks sct bs ++ | Doc (_, doc) -> ++ if var_choose doc.doc_build then ++ check_tools doc.doc_build_tools ++ | Test (_, test) -> ++ if var_choose test.test_run then ++ check_tools test.test_tools ++ | _ -> ++ ()) + pkg.sections; + + (* Check if we need native dynlink (presence of libraries that compile to +- * native) +- *) ++ native) ++ *) + begin + let has_cmxa = + List.exists + (function +- | Library (_, bs, _) -> +- var_choose bs.bs_build && +- (bs.bs_compiled_object = Native || +- (bs.bs_compiled_object = Best && +- bool_of_string (BaseStandardVar.is_native ()))) +- | _ -> +- false) ++ | Library (_, bs, _) -> ++ var_choose bs.bs_build && ++ (bs.bs_compiled_object = Native || ++ (bs.bs_compiled_object = Best && ++ bool_of_string (BaseStandardVar.is_native ()))) ++ | _ -> ++ false) + pkg.sections + in +- if has_cmxa then +- var_ignore_eval BaseStandardVar.native_dynlink ++ if has_cmxa then ++ var_ignore_eval BaseStandardVar.native_dynlink + end; + + (* Check errors *) +@@ -5671,6 +5939,8 @@ module InternalInstallPlugin = struct + *) + + ++ (* TODO: rewrite this module with OASISFileSystem. *) ++ + open BaseEnv + open BaseStandardVar + open BaseMessage +@@ -5680,34 +5950,17 @@ module InternalInstallPlugin = struct + open OASISUtils + + +- let exec_hook = +- ref (fun (cs, bs, exec) -> cs, bs, exec) +- +- +- let lib_hook = +- ref (fun (cs, bs, lib) -> cs, bs, lib, []) +- +- +- let obj_hook = +- ref (fun (cs, bs, obj) -> cs, bs, obj, []) +- +- +- let doc_hook = +- ref (fun (cs, doc) -> cs, doc) +- +- +- let install_file_ev = +- "install-file" +- ++ let exec_hook = ref (fun (cs, bs, exec) -> cs, bs, exec) ++ let lib_hook = ref (fun (cs, bs, dn, lib) -> cs, bs, dn, lib, []) ++ let obj_hook = ref (fun (cs, bs, dn, obj) -> cs, bs, dn, obj, []) ++ let doc_hook = ref (fun (cs, doc) -> cs, doc) + +- let install_dir_ev = +- "install-dir" +- +- +- let install_findlib_ev = +- "install-findlib" ++ let install_file_ev = "install-file" ++ let install_dir_ev = "install-dir" ++ let install_findlib_ev = "install-findlib" + + ++ (* TODO: this can be more generic and used elsewhere. *) + let win32_max_command_line_length = 8000 + + +@@ -5776,24 +6029,21 @@ module InternalInstallPlugin = struct + ["install" :: findlib_name :: meta :: files] + + +- let install pkg argv = ++ let install = + +- let in_destdir = ++ let in_destdir fn = + try +- let destdir = +- destdir () +- in +- (* Practically speaking destdir is prepended +- * at the beginning of the target filename +- *) +- fun fn -> destdir^fn ++ (* Practically speaking destdir is prepended at the beginning of the ++ target filename ++ *) ++ (destdir ())^fn + with PropList.Not_set _ -> +- fun fn -> fn ++ fn + in + +- let install_file ?tgt_fn src_file envdir = ++ let install_file ~ctxt ?(prepend_destdir=true) ?tgt_fn src_file envdir = + let tgt_dir = +- in_destdir (envdir ()) ++ if prepend_destdir then in_destdir (envdir ()) else envdir () + in + let tgt_file = + Filename.concat +@@ -5806,20 +6056,48 @@ module InternalInstallPlugin = struct + in + (* Create target directory if needed *) + OASISFileUtil.mkdir_parent +- ~ctxt:!BaseContext.default ++ ~ctxt + (fun dn -> + info (f_ "Creating directory '%s'") dn; +- BaseLog.register install_dir_ev dn) +- tgt_dir; ++ BaseLog.register ~ctxt install_dir_ev dn) ++ (Filename.dirname tgt_file); + + (* Really install files *) + info (f_ "Copying file '%s' to '%s'") src_file tgt_file; +- OASISFileUtil.cp ~ctxt:!BaseContext.default src_file tgt_file; +- BaseLog.register install_file_ev tgt_file ++ OASISFileUtil.cp ~ctxt src_file tgt_file; ++ BaseLog.register ~ctxt install_file_ev tgt_file ++ in ++ ++ (* Install the files for a library. *) ++ ++ let install_lib_files ~ctxt findlib_name files = ++ let findlib_dir = ++ let dn = ++ let findlib_destdir = ++ OASISExec.run_read_one_line ~ctxt (ocamlfind ()) ++ ["printconf" ; "destdir"] ++ in ++ Filename.concat findlib_destdir findlib_name ++ in ++ fun () -> dn ++ in ++ let () = ++ if not (OASISFileUtil.file_exists_case (findlib_dir ())) then ++ failwithf ++ (f_ "Directory '%s' doesn't exist for findlib library %s") ++ (findlib_dir ()) findlib_name ++ in ++ let f dir file = ++ let basename = Filename.basename file in ++ let tgt_fn = Filename.concat dir basename in ++ (* Destdir is already include in printconf. *) ++ install_file ~ctxt ~prepend_destdir:false ~tgt_fn file findlib_dir ++ in ++ List.iter (fun (dir, files) -> List.iter (f dir) files) files ; + in + + (* Install data into defined directory *) +- let install_data srcdir lst tgtdir = ++ let install_data ~ctxt srcdir lst tgtdir = + let tgtdir = + OASISHostPath.of_unix (var_expand tgtdir) + in +@@ -5836,7 +6114,7 @@ module InternalInstallPlugin = struct + src; + List.iter + (fun fn -> +- install_file ++ install_file ~ctxt + fn + (fun () -> + match tgt_opt with +@@ -5848,146 +6126,158 @@ module InternalInstallPlugin = struct + lst + in + +- (** Install all libraries *) +- let install_libs pkg = ++ let make_fnames modul sufx = ++ List.fold_right ++ begin fun sufx accu -> ++ (OASISString.capitalize_ascii modul ^ sufx) :: ++ (OASISString.uncapitalize_ascii modul ^ sufx) :: ++ accu ++ end ++ sufx ++ [] ++ in + +- let files_of_library (f_data, acc) data_lib = +- let cs, bs, lib, lib_extra = +- !lib_hook data_lib +- in +- if var_choose bs.bs_install && +- BaseBuilt.is_built BaseBuilt.BLib cs.cs_name then +- begin +- let acc = +- (* Start with acc + lib_extra *) +- List.rev_append lib_extra acc +- in +- let acc = +- (* Add uncompiled header from the source tree *) +- let path = +- OASISHostPath.of_unix bs.bs_path +- in +- List.fold_left +- (fun acc modul -> +- try +- List.find +- OASISFileUtil.file_exists_case +- (List.map +- (Filename.concat path) +- [modul^".mli"; +- modul^".ml"; +- String.uncapitalize modul^".mli"; +- String.capitalize modul^".mli"; +- String.uncapitalize modul^".ml"; +- String.capitalize modul^".ml"]) +- :: acc +- with Not_found -> +- begin +- warning +- (f_ "Cannot find source header for module %s \ +- in library %s") +- modul cs.cs_name; +- acc +- end) +- acc +- lib.lib_modules +- in ++ (** Install all libraries *) ++ let install_libs ~ctxt pkg = + +- let acc = +- (* Get generated files *) +- BaseBuilt.fold +- BaseBuilt.BLib +- cs.cs_name +- (fun acc fn -> fn :: acc) +- acc +- in ++ let find_first_existing_files_in_path bs lst = ++ let path = OASISHostPath.of_unix bs.bs_path in ++ List.find ++ OASISFileUtil.file_exists_case ++ (List.map (Filename.concat path) lst) ++ in + +- let f_data () = +- (* Install data associated with the library *) +- install_data +- bs.bs_path +- bs.bs_data_files +- (Filename.concat +- (datarootdir ()) +- pkg.name); +- f_data () +- in ++ let files_of_modules new_files typ cs bs modules = ++ List.fold_left ++ (fun acc modul -> ++ begin ++ try ++ (* Add uncompiled header from the source tree *) ++ [find_first_existing_files_in_path ++ bs (make_fnames modul [".mli"; ".ml"])] ++ with Not_found -> ++ warning ++ (f_ "Cannot find source header for module %s \ ++ in %s %s") ++ typ modul cs.cs_name; ++ [] ++ end ++ @ ++ List.fold_left ++ (fun acc fn -> ++ try ++ find_first_existing_files_in_path bs [fn] :: acc ++ with Not_found -> ++ acc) ++ acc (make_fnames modul [".annot";".cmti";".cmt"])) ++ new_files ++ modules ++ in + +- (f_data, acc) +- end +- else +- begin +- (f_data, acc) +- end +- and files_of_object (f_data, acc) data_obj = +- let cs, bs, obj, obj_extra = +- !obj_hook data_obj ++ let files_of_build_section (f_data, new_files) typ cs bs = ++ let extra_files = ++ List.map ++ (fun fn -> ++ try ++ find_first_existing_files_in_path bs [fn] ++ with Not_found -> ++ failwithf ++ (f_ "Cannot find extra findlib file %S in %s %s ") ++ fn ++ typ ++ cs.cs_name) ++ bs.bs_findlib_extra_files ++ in ++ let f_data () = ++ (* Install data associated with the library *) ++ install_data ++ ~ctxt ++ bs.bs_path ++ bs.bs_data_files ++ (Filename.concat ++ (datarootdir ()) ++ pkg.name); ++ f_data () + in +- if var_choose bs.bs_install && +- BaseBuilt.is_built BaseBuilt.BObj cs.cs_name then +- begin +- let acc = +- (* Start with acc + obj_extra *) +- List.rev_append obj_extra acc +- in +- let acc = +- (* Add uncompiled header from the source tree *) +- let path = +- OASISHostPath.of_unix bs.bs_path +- in +- List.fold_left +- (fun acc modul -> +- try +- List.find +- OASISFileUtil.file_exists_case +- (List.map +- (Filename.concat path) +- [modul^".mli"; +- modul^".ml"; +- String.uncapitalize modul^".mli"; +- String.capitalize modul^".mli"; +- String.uncapitalize modul^".ml"; +- String.capitalize modul^".ml"]) +- :: acc +- with Not_found -> +- begin +- warning +- (f_ "Cannot find source header for module %s \ +- in object %s") +- modul cs.cs_name; +- acc +- end) +- acc +- obj.obj_modules +- in ++ f_data, new_files @ extra_files ++ in + +- let acc = +- (* Get generated files *) +- BaseBuilt.fold +- BaseBuilt.BObj +- cs.cs_name +- (fun acc fn -> fn :: acc) +- acc +- in ++ let files_of_library (f_data, acc) data_lib = ++ let cs, bs, lib, dn, lib_extra = !lib_hook data_lib in ++ if var_choose bs.bs_install && ++ BaseBuilt.is_built ~ctxt BaseBuilt.BLib cs.cs_name then begin ++ (* Start with lib_extra *) ++ let new_files = lib_extra in ++ let new_files = ++ files_of_modules new_files "library" cs bs lib.lib_modules ++ in ++ let f_data, new_files = ++ files_of_build_section (f_data, new_files) "library" cs bs ++ in ++ let new_files = ++ (* Get generated files *) ++ BaseBuilt.fold ++ ~ctxt ++ BaseBuilt.BLib ++ cs.cs_name ++ (fun acc fn -> fn :: acc) ++ new_files ++ in ++ let acc = (dn, new_files) :: acc in + +- let f_data () = +- (* Install data associated with the object *) +- install_data +- bs.bs_path +- bs.bs_data_files +- (Filename.concat +- (datarootdir ()) +- pkg.name); +- f_data () +- in ++ let f_data () = ++ (* Install data associated with the library *) ++ install_data ++ ~ctxt ++ bs.bs_path ++ bs.bs_data_files ++ (Filename.concat ++ (datarootdir ()) ++ pkg.name); ++ f_data () ++ in + +- (f_data, acc) +- end +- else +- begin +- (f_data, acc) +- end ++ (f_data, acc) ++ end else begin ++ (f_data, acc) ++ end ++ and files_of_object (f_data, acc) data_obj = ++ let cs, bs, obj, dn, obj_extra = !obj_hook data_obj in ++ if var_choose bs.bs_install && ++ BaseBuilt.is_built ~ctxt BaseBuilt.BObj cs.cs_name then begin ++ (* Start with obj_extra *) ++ let new_files = obj_extra in ++ let new_files = ++ files_of_modules new_files "object" cs bs obj.obj_modules ++ in ++ let f_data, new_files = ++ files_of_build_section (f_data, new_files) "object" cs bs ++ in ++ ++ let new_files = ++ (* Get generated files *) ++ BaseBuilt.fold ++ ~ctxt ++ BaseBuilt.BObj ++ cs.cs_name ++ (fun acc fn -> fn :: acc) ++ new_files ++ in ++ let acc = (dn, new_files) :: acc in + ++ let f_data () = ++ (* Install data associated with the object *) ++ install_data ++ ~ctxt ++ bs.bs_path ++ bs.bs_data_files ++ (Filename.concat (datarootdir ()) pkg.name); ++ f_data () ++ in ++ (f_data, acc) ++ end else begin ++ (f_data, acc) ++ end + in + + (* Install one group of library *) +@@ -5998,10 +6288,10 @@ module InternalInstallPlugin = struct + match grp with + | Container (_, children) -> + data_and_files, children +- | Package (_, cs, bs, `Library lib, children) -> +- files_of_library data_and_files (cs, bs, lib), children +- | Package (_, cs, bs, `Object obj, children) -> +- files_of_object data_and_files (cs, bs, obj), children ++ | Package (_, cs, bs, `Library lib, dn, children) -> ++ files_of_library data_and_files (cs, bs, lib, dn), children ++ | Package (_, cs, bs, `Object obj, dn, children) -> ++ files_of_object data_and_files (cs, bs, obj, dn), children + in + List.fold_left + install_group_lib_aux +@@ -6010,264 +6300,196 @@ module InternalInstallPlugin = struct + in + + (* Findlib name of the root library *) +- let findlib_name = +- findlib_of_group grp +- in ++ let findlib_name = findlib_of_group grp in + + (* Determine root library *) +- let root_lib = +- root_of_group grp +- in ++ let root_lib = root_of_group grp in + + (* All files to install for this library *) +- let f_data, files = +- install_group_lib_aux (ignore, []) grp +- in ++ let f_data, files = install_group_lib_aux (ignore, []) grp in + + (* Really install, if there is something to install *) +- if files = [] then +- begin +- warning +- (f_ "Nothing to install for findlib library '%s'") +- findlib_name +- end +- else +- begin +- let meta = +- (* Search META file *) +- let _, bs, _ = +- root_lib +- in +- let res = +- Filename.concat bs.bs_path "META" +- in +- if not (OASISFileUtil.file_exists_case res) then +- failwithf +- (f_ "Cannot find file '%s' for findlib library %s") +- res +- findlib_name; +- res +- in +- let files = +- (* Make filename shorter to avoid hitting command max line length +- * too early, esp. on Windows. +- *) +- let remove_prefix p n = +- let plen = String.length p in +- let nlen = String.length n in +- if plen <= nlen && String.sub n 0 plen = p then +- begin +- let fn_sep = +- if Sys.os_type = "Win32" then +- '\\' +- else +- '/' +- in +- let cutpoint = plen + +- (if plen < nlen && n.[plen] = fn_sep then +- 1 +- else +- 0) +- in +- String.sub n cutpoint (nlen - cutpoint) +- end +- else +- n +- in +- List.map (remove_prefix (Sys.getcwd ())) files +- in +- info +- (f_ "Installing findlib library '%s'") +- findlib_name; +- let ocamlfind = ocamlfind () in +- let commands = +- split_install_command +- ocamlfind +- findlib_name +- meta +- files ++ if files = [] then begin ++ warning ++ (f_ "Nothing to install for findlib library '%s'") findlib_name ++ end else begin ++ let meta = ++ (* Search META file *) ++ let _, bs, _ = root_lib in ++ let res = Filename.concat bs.bs_path "META" in ++ if not (OASISFileUtil.file_exists_case res) then ++ failwithf ++ (f_ "Cannot find file '%s' for findlib library %s") ++ res ++ findlib_name; ++ res ++ in ++ let files = ++ (* Make filename shorter to avoid hitting command max line length ++ * too early, esp. on Windows. ++ *) ++ (* TODO: move to OASISHostPath as make_relative. *) ++ let remove_prefix p n = ++ let plen = String.length p in ++ let nlen = String.length n in ++ if plen <= nlen && String.sub n 0 plen = p then begin ++ let fn_sep = if Sys.os_type = "Win32" then '\\' else '/' in ++ let cutpoint = ++ plen + ++ (if plen < nlen && n.[plen] = fn_sep then 1 else 0) + in +- List.iter +- (OASISExec.run ~ctxt:!BaseContext.default ocamlfind) +- commands; +- BaseLog.register install_findlib_ev findlib_name +- end; +- +- (* Install data files *) +- f_data (); ++ String.sub n cutpoint (nlen - cutpoint) ++ end else begin ++ n ++ end ++ in ++ List.map ++ (fun (dir, fn) -> ++ (dir, List.map (remove_prefix (Sys.getcwd ())) fn)) ++ files ++ in ++ let ocamlfind = ocamlfind () in ++ let nodir_files, dir_files = ++ List.fold_left ++ (fun (nodir, dir) (dn, lst) -> ++ match dn with ++ | Some dn -> nodir, (dn, lst) :: dir ++ | None -> lst @ nodir, dir) ++ ([], []) ++ (List.rev files) ++ in ++ info (f_ "Installing findlib library '%s'") findlib_name; ++ List.iter ++ (OASISExec.run ~ctxt ocamlfind) ++ (split_install_command ocamlfind findlib_name meta nodir_files); ++ install_lib_files ~ctxt findlib_name dir_files; ++ BaseLog.register ~ctxt install_findlib_ev findlib_name ++ end; + ++ (* Install data files *) ++ f_data (); + in + +- let group_libs, _, _ = +- findlib_mapping pkg +- in ++ let group_libs, _, _ = findlib_mapping pkg in + + (* We install libraries in groups *) + List.iter install_group_lib group_libs + in + +- let install_execs pkg = ++ let install_execs ~ctxt pkg = + let install_exec data_exec = +- let cs, bs, exec = +- !exec_hook data_exec +- in +- if var_choose bs.bs_install && +- BaseBuilt.is_built BaseBuilt.BExec cs.cs_name then +- begin +- let exec_libdir () = +- Filename.concat +- (libdir ()) +- pkg.name +- in +- BaseBuilt.fold +- BaseBuilt.BExec +- cs.cs_name +- (fun () fn -> +- install_file +- ~tgt_fn:(cs.cs_name ^ ext_program ()) +- fn +- bindir) +- (); +- BaseBuilt.fold +- BaseBuilt.BExecLib +- cs.cs_name +- (fun () fn -> +- install_file +- fn +- exec_libdir) +- (); +- install_data +- bs.bs_path +- bs.bs_data_files +- (Filename.concat +- (datarootdir ()) +- pkg.name) +- end ++ let cs, bs, _ = !exec_hook data_exec in ++ if var_choose bs.bs_install && ++ BaseBuilt.is_built ~ctxt BaseBuilt.BExec cs.cs_name then begin ++ let exec_libdir () = Filename.concat (libdir ()) pkg.name in ++ BaseBuilt.fold ++ ~ctxt ++ BaseBuilt.BExec ++ cs.cs_name ++ (fun () fn -> ++ install_file ~ctxt ++ ~tgt_fn:(cs.cs_name ^ ext_program ()) ++ fn ++ bindir) ++ (); ++ BaseBuilt.fold ++ ~ctxt ++ BaseBuilt.BExecLib ++ cs.cs_name ++ (fun () fn -> install_file ~ctxt fn exec_libdir) ++ (); ++ install_data ~ctxt ++ bs.bs_path ++ bs.bs_data_files ++ (Filename.concat (datarootdir ()) pkg.name) ++ end + in +- List.iter +- (function +- | Executable (cs, bs, exec)-> +- install_exec (cs, bs, exec) +- | _ -> +- ()) ++ List.iter ++ (function ++ | Executable (cs, bs, exec)-> install_exec (cs, bs, exec) ++ | _ -> ()) + pkg.sections + in + +- let install_docs pkg = ++ let install_docs ~ctxt pkg = + let install_doc data = +- let cs, doc = +- !doc_hook data +- in +- if var_choose doc.doc_install && +- BaseBuilt.is_built BaseBuilt.BDoc cs.cs_name then +- begin +- let tgt_dir = +- OASISHostPath.of_unix (var_expand doc.doc_install_dir) +- in +- BaseBuilt.fold +- BaseBuilt.BDoc +- cs.cs_name +- (fun () fn -> +- install_file +- fn +- (fun () -> tgt_dir)) +- (); +- install_data +- Filename.current_dir_name +- doc.doc_data_files +- doc.doc_install_dir +- end ++ let cs, doc = !doc_hook data in ++ if var_choose doc.doc_install && ++ BaseBuilt.is_built ~ctxt BaseBuilt.BDoc cs.cs_name then begin ++ let tgt_dir = OASISHostPath.of_unix (var_expand doc.doc_install_dir) in ++ BaseBuilt.fold ++ ~ctxt ++ BaseBuilt.BDoc ++ cs.cs_name ++ (fun () fn -> install_file ~ctxt fn (fun () -> tgt_dir)) ++ (); ++ install_data ~ctxt ++ Filename.current_dir_name ++ doc.doc_data_files ++ doc.doc_install_dir ++ end + in +- List.iter +- (function +- | Doc (cs, doc) -> +- install_doc (cs, doc) +- | _ -> +- ()) +- pkg.sections ++ List.iter ++ (function ++ | Doc (cs, doc) -> install_doc (cs, doc) ++ | _ -> ()) ++ pkg.sections + in +- +- install_libs pkg; +- install_execs pkg; +- install_docs pkg ++ fun ~ctxt pkg _ -> ++ install_libs ~ctxt pkg; ++ install_execs ~ctxt pkg; ++ install_docs ~ctxt pkg + + + (* Uninstall already installed data *) +- let uninstall _ argv = +- List.iter +- (fun (ev, data) -> +- if ev = install_file_ev then +- begin +- if OASISFileUtil.file_exists_case data then +- begin +- info +- (f_ "Removing file '%s'") +- data; +- Sys.remove data +- end +- else +- begin +- warning +- (f_ "File '%s' doesn't exist anymore") +- data +- end +- end +- else if ev = install_dir_ev then +- begin +- if Sys.file_exists data && Sys.is_directory data then +- begin +- if Sys.readdir data = [||] then +- begin +- info +- (f_ "Removing directory '%s'") +- data; +- OASISFileUtil.rmdir ~ctxt:!BaseContext.default data +- end +- else +- begin +- warning +- (f_ "Directory '%s' is not empty (%s)") +- data +- (String.concat +- ", " +- (Array.to_list +- (Sys.readdir data))) +- end +- end +- else +- begin +- warning +- (f_ "Directory '%s' doesn't exist anymore") +- data +- end +- end +- else if ev = install_findlib_ev then +- begin +- info (f_ "Removing findlib library '%s'") data; +- OASISExec.run ~ctxt:!BaseContext.default +- (ocamlfind ()) ["remove"; data] +- end +- else +- failwithf (f_ "Unknown log event '%s'") ev; +- BaseLog.unregister ev data) +- (* We process event in reverse order *) ++ let uninstall ~ctxt _ _ = ++ let uninstall_aux (ev, data) = ++ if ev = install_file_ev then begin ++ if OASISFileUtil.file_exists_case data then begin ++ info (f_ "Removing file '%s'") data; ++ Sys.remove data ++ end else begin ++ warning (f_ "File '%s' doesn't exist anymore") data ++ end ++ end else if ev = install_dir_ev then begin ++ if Sys.file_exists data && Sys.is_directory data then begin ++ if Sys.readdir data = [||] then begin ++ info (f_ "Removing directory '%s'") data; ++ OASISFileUtil.rmdir ~ctxt data ++ end else begin ++ warning ++ (f_ "Directory '%s' is not empty (%s)") ++ data ++ (String.concat ", " (Array.to_list (Sys.readdir data))) ++ end ++ end else begin ++ warning (f_ "Directory '%s' doesn't exist anymore") data ++ end ++ end else if ev = install_findlib_ev then begin ++ info (f_ "Removing findlib library '%s'") data; ++ OASISExec.run ~ctxt (ocamlfind ()) ["remove"; data] ++ end else begin ++ failwithf (f_ "Unknown log event '%s'") ev; ++ end; ++ BaseLog.unregister ~ctxt ev data ++ in ++ (* We process event in reverse order *) ++ List.iter uninstall_aux + (List.rev +- (BaseLog.filter +- [install_file_ev; +- install_dir_ev; +- install_findlib_ev])) +- ++ (BaseLog.filter ~ctxt [install_file_ev; install_dir_ev])); ++ List.iter uninstall_aux ++ (List.rev (BaseLog.filter ~ctxt [install_findlib_ev])) + + end + + +-# 6243 "setup.ml" ++# 6465 "setup.ml" + module OCamlbuildCommon = struct + (* # 22 "src/plugins/ocamlbuild/OCamlbuildCommon.ml" *) + + + (** Functions common to OCamlbuild build and doc plugin +- *) ++ *) + + + open OASISGettext +@@ -6276,8 +6498,6 @@ module OCamlbuildCommon = struct + open OASISTypes + + +- +- + type extra_args = string list + + +@@ -6300,6 +6520,14 @@ module OCamlbuildCommon = struct + "-classic-display"; + "-no-log"; + "-no-links"; ++ ] ++ else ++ []; ++ ++ if OASISVersion.comparator_apply ++ (OASISVersion.version_of_string (ocaml_version ())) ++ (OASISVersion.VLesser (OASISVersion.version_of_string "3.11.1")) then ++ [ + "-install-lib-dir"; + (Filename.concat (standard_library ()) "ocamlbuild") + ] +@@ -6319,6 +6547,11 @@ module OCamlbuildCommon = struct + else + []; + ++ if bool_of_string (tests ()) then ++ ["-tag"; "tests"] ++ else ++ []; ++ + if bool_of_string (profile ()) then + ["-tag"; "profile"] + else +@@ -6331,35 +6564,32 @@ module OCamlbuildCommon = struct + + + (** Run 'ocamlbuild -clean' if not already done *) +- let run_clean extra_argv = ++ let run_clean ~ctxt extra_argv = + let extra_cli = + String.concat " " (Array.to_list extra_argv) + in +- (* Run if never called with these args *) +- if not (BaseLog.exists ocamlbuild_clean_ev extra_cli) then +- begin +- OASISExec.run ~ctxt:!BaseContext.default +- (ocamlbuild ()) (fix_args ["-clean"] extra_argv); +- BaseLog.register ocamlbuild_clean_ev extra_cli; +- at_exit +- (fun () -> +- try +- BaseLog.unregister ocamlbuild_clean_ev extra_cli +- with _ -> +- ()) +- end ++ (* Run if never called with these args *) ++ if not (BaseLog.exists ~ctxt ocamlbuild_clean_ev extra_cli) then ++ begin ++ OASISExec.run ~ctxt (ocamlbuild ()) (fix_args ["-clean"] extra_argv); ++ BaseLog.register ~ctxt ocamlbuild_clean_ev extra_cli; ++ at_exit ++ (fun () -> ++ try ++ BaseLog.unregister ~ctxt ocamlbuild_clean_ev extra_cli ++ with _ -> ()) ++ end + + + (** Run ocamlbuild, unregister all clean events *) +- let run_ocamlbuild args extra_argv = ++ let run_ocamlbuild ~ctxt args extra_argv = + (* TODO: enforce that target in args must be UNIX encoded i.e. toto/index.html +- *) +- OASISExec.run ~ctxt:!BaseContext.default +- (ocamlbuild ()) (fix_args args extra_argv); ++ *) ++ OASISExec.run ~ctxt (ocamlbuild ()) (fix_args args extra_argv); + (* Remove any clean event, we must run it again *) + List.iter +- (fun (e, d) -> BaseLog.unregister e d) +- (BaseLog.filter [ocamlbuild_clean_ev]) ++ (fun (e, d) -> BaseLog.unregister ~ctxt e d) ++ (BaseLog.filter ~ctxt [ocamlbuild_clean_ev]) + + + (** Determine real build directory *) +@@ -6367,13 +6597,13 @@ module OCamlbuildCommon = struct + let rec search_args dir = + function + | "-build-dir" :: dir :: tl -> +- search_args dir tl ++ search_args dir tl + | _ :: tl -> +- search_args dir tl ++ search_args dir tl + | [] -> +- dir ++ dir + in +- search_args "_build" (fix_args [] extra_argv) ++ search_args "_build" (fix_args [] extra_argv) + + + end +@@ -6394,17 +6624,12 @@ module OCamlbuildPlugin = struct + open BaseEnv + open OCamlbuildCommon + open BaseStandardVar +- open BaseMessage +- +- +- + + +- let cond_targets_hook = +- ref (fun lst -> lst) ++ let cond_targets_hook = ref (fun lst -> lst) + + +- let build extra_args pkg argv = ++ let build ~ctxt extra_args pkg argv = + (* Return the filename in build directory *) + let in_build_dir fn = + Filename.concat +@@ -6468,8 +6693,8 @@ module OCamlbuildPlugin = struct + (List.map + (List.filter + (fun fn -> +- ends_with ".cmo" fn +- || ends_with ".cmx" fn)) ++ ends_with ~what:".cmo" fn ++ || ends_with ~what:".cmx" fn)) + unix_files)) + in + +@@ -6484,10 +6709,8 @@ module OCamlbuildPlugin = struct + + | Executable (cs, bs, exec) when var_choose bs.bs_build -> + begin +- let evs, unix_exec_is, unix_dll_opt = +- BaseBuilt.of_executable +- in_build_dir_of_unix +- (cs, bs, exec) ++ let evs, _, _ = ++ BaseBuilt.of_executable in_build_dir_of_unix (cs, bs, exec) + in + + let target ext = +@@ -6501,7 +6724,7 @@ module OCamlbuildPlugin = struct + (* Fix evs, we want to use the unix_tgt, without copying *) + List.map + (function +- | BaseBuilt.BExec, nm, lst when nm = cs.cs_name -> ++ | BaseBuilt.BExec, nm, _ when nm = cs.cs_name -> + BaseBuilt.BExec, nm, + [[in_build_dir_of_unix unix_tgt]] + | ev -> +@@ -6545,27 +6768,30 @@ module OCamlbuildPlugin = struct + (List.length fns)) + (String.concat (s_ " or ") (List.map (Printf.sprintf "'%s'") fns))) + lst; +- (BaseBuilt.register bt bnm lst) ++ (BaseBuilt.register ~ctxt bt bnm lst) + in + + (* Run the hook *) + let cond_targets = !cond_targets_hook cond_targets in + + (* Run a list of target... *) +- run_ocamlbuild (List.flatten (List.map snd cond_targets) @ extra_args) argv; ++ run_ocamlbuild ++ ~ctxt ++ (List.flatten (List.map snd cond_targets) @ extra_args) ++ argv; + (* ... and register events *) + List.iter check_and_register (List.flatten (List.map fst cond_targets)) + + +- let clean pkg extra_args = +- run_clean extra_args; ++ let clean ~ctxt pkg extra_args = ++ run_clean ~ctxt extra_args; + List.iter + (function + | Library (cs, _, _) -> +- BaseBuilt.unregister BaseBuilt.BLib cs.cs_name ++ BaseBuilt.unregister ~ctxt BaseBuilt.BLib cs.cs_name + | Executable (cs, _, _) -> +- BaseBuilt.unregister BaseBuilt.BExec cs.cs_name; +- BaseBuilt.unregister BaseBuilt.BExecLib cs.cs_name ++ BaseBuilt.unregister ~ctxt BaseBuilt.BExec cs.cs_name; ++ BaseBuilt.unregister ~ctxt BaseBuilt.BExecLib cs.cs_name + | _ -> + ()) + pkg.sections +@@ -6579,16 +6805,12 @@ module OCamlbuildDocPlugin = struct + + (* Create documentation using ocamlbuild .odocl files + @author Sylvain Le Gall +- *) ++ *) + + + open OASISTypes + open OASISGettext +- open OASISMessage + open OCamlbuildCommon +- open BaseStandardVar +- +- + + + type run_t = +@@ -6598,7 +6820,7 @@ module OCamlbuildDocPlugin = struct + } + + +- let doc_build run pkg (cs, doc) argv = ++ let doc_build ~ctxt run _ (cs, _) argv = + let index_html = + OASISUnixPath.make + [ +@@ -6615,139 +6837,125 @@ module OCamlbuildDocPlugin = struct + cs.cs_name^".docdir"; + ] + in +- run_ocamlbuild (index_html :: run.extra_args) argv; +- List.iter +- (fun glb -> +- BaseBuilt.register +- BaseBuilt.BDoc +- cs.cs_name +- [OASISFileUtil.glob ~ctxt:!BaseContext.default +- (Filename.concat tgt_dir glb)]) +- ["*.html"; "*.css"] ++ run_ocamlbuild ~ctxt (index_html :: run.extra_args) argv; ++ List.iter ++ (fun glb -> ++ match OASISFileUtil.glob ~ctxt (Filename.concat tgt_dir glb) with ++ | (_ :: _) as filenames -> ++ BaseBuilt.register ~ctxt BaseBuilt.BDoc cs.cs_name [filenames] ++ | [] -> ()) ++ ["*.html"; "*.css"] + + +- let doc_clean run pkg (cs, doc) argv = +- run_clean argv; +- BaseBuilt.unregister BaseBuilt.BDoc cs.cs_name ++ let doc_clean ~ctxt _ _ (cs, _) argv = ++ run_clean ~ctxt argv; ++ BaseBuilt.unregister ~ctxt BaseBuilt.BDoc cs.cs_name + + + end + + +-# 6616 "setup.ml" ++# 6837 "setup.ml" + module CustomPlugin = struct + (* # 22 "src/plugins/custom/CustomPlugin.ml" *) + + + (** Generate custom configure/build/doc/test/install system + @author +- *) ++ *) + + + open BaseEnv + open OASISGettext + open OASISTypes + +- +- +- +- + type t = +- { +- cmd_main: command_line conditional; +- cmd_clean: (command_line option) conditional; +- cmd_distclean: (command_line option) conditional; +- } ++ { ++ cmd_main: command_line conditional; ++ cmd_clean: (command_line option) conditional; ++ cmd_distclean: (command_line option) conditional; ++ } + + + let run = BaseCustom.run + + +- let main t _ extra_args = +- let cmd, args = +- var_choose +- ~name:(s_ "main command") +- t.cmd_main +- in +- run cmd args extra_args ++ let main ~ctxt:_ t _ extra_args = ++ let cmd, args = var_choose ~name:(s_ "main command") t.cmd_main in ++ run cmd args extra_args + + +- let clean t pkg extra_args = ++ let clean ~ctxt:_ t _ extra_args = + match var_choose t.cmd_clean with +- | Some (cmd, args) -> +- run cmd args extra_args +- | _ -> +- () ++ | Some (cmd, args) -> run cmd args extra_args ++ | _ -> () + + +- let distclean t pkg extra_args = ++ let distclean ~ctxt:_ t _ extra_args = + match var_choose t.cmd_distclean with +- | Some (cmd, args) -> +- run cmd args extra_args +- | _ -> +- () ++ | Some (cmd, args) -> run cmd args extra_args ++ | _ -> () + + + module Build = + struct +- let main t pkg extra_args = +- main t pkg extra_args; ++ let main ~ctxt t pkg extra_args = ++ main ~ctxt t pkg extra_args; + List.iter + (fun sct -> + let evs = + match sct with + | Library (cs, bs, lib) when var_choose bs.bs_build -> +- begin +- let evs, _ = +- BaseBuilt.of_library +- OASISHostPath.of_unix +- (cs, bs, lib) +- in +- evs +- end ++ begin ++ let evs, _ = ++ BaseBuilt.of_library ++ OASISHostPath.of_unix ++ (cs, bs, lib) ++ in ++ evs ++ end + | Executable (cs, bs, exec) when var_choose bs.bs_build -> +- begin +- let evs, _, _ = +- BaseBuilt.of_executable +- OASISHostPath.of_unix +- (cs, bs, exec) +- in +- evs +- end ++ begin ++ let evs, _, _ = ++ BaseBuilt.of_executable ++ OASISHostPath.of_unix ++ (cs, bs, exec) ++ in ++ evs ++ end + | _ -> +- [] ++ [] + in +- List.iter +- (fun (bt, bnm, lst) -> BaseBuilt.register bt bnm lst) +- evs) ++ List.iter ++ (fun (bt, bnm, lst) -> BaseBuilt.register ~ctxt bt bnm lst) ++ evs) + pkg.sections + +- let clean t pkg extra_args = +- clean t pkg extra_args; ++ let clean ~ctxt t pkg extra_args = ++ clean ~ctxt t pkg extra_args; + (* TODO: this seems to be pretty generic (at least wrt to ocamlbuild + * considering moving this to BaseSetup? + *) + List.iter + (function +- | Library (cs, _, _) -> +- BaseBuilt.unregister BaseBuilt.BLib cs.cs_name +- | Executable (cs, _, _) -> +- BaseBuilt.unregister BaseBuilt.BExec cs.cs_name; +- BaseBuilt.unregister BaseBuilt.BExecLib cs.cs_name +- | _ -> +- ()) ++ | Library (cs, _, _) -> ++ BaseBuilt.unregister ~ctxt BaseBuilt.BLib cs.cs_name ++ | Executable (cs, _, _) -> ++ BaseBuilt.unregister ~ctxt BaseBuilt.BExec cs.cs_name; ++ BaseBuilt.unregister ~ctxt BaseBuilt.BExecLib cs.cs_name ++ | _ -> ++ ()) + pkg.sections + +- let distclean t pkg extra_args = +- distclean t pkg extra_args ++ let distclean ~ctxt t pkg extra_args = distclean ~ctxt t pkg extra_args + end + + + module Test = + struct +- let main t pkg (cs, test) extra_args = ++ let main ~ctxt t pkg (cs, _) extra_args = + try +- main t pkg extra_args; ++ main ~ctxt t pkg extra_args; + 0.0 + with Failure s -> + BaseMessage.warning +@@ -6756,33 +6964,30 @@ module CustomPlugin = struct + s; + 1.0 + +- let clean t pkg (cs, test) extra_args = +- clean t pkg extra_args ++ let clean ~ctxt t pkg _ extra_args = clean ~ctxt t pkg extra_args + +- let distclean t pkg (cs, test) extra_args = +- distclean t pkg extra_args ++ let distclean ~ctxt t pkg _ extra_args = distclean ~ctxt t pkg extra_args + end + + + module Doc = + struct +- let main t pkg (cs, _) extra_args = +- main t pkg extra_args; +- BaseBuilt.register BaseBuilt.BDoc cs.cs_name [] +- +- let clean t pkg (cs, _) extra_args = +- clean t pkg extra_args; +- BaseBuilt.unregister BaseBuilt.BDoc cs.cs_name ++ let main ~ctxt t pkg (cs, _) extra_args = ++ main ~ctxt t pkg extra_args; ++ BaseBuilt.register ~ctxt BaseBuilt.BDoc cs.cs_name [] ++ ++ let clean ~ctxt t pkg (cs, _) extra_args = ++ clean ~ctxt t pkg extra_args; ++ BaseBuilt.unregister ~ctxt BaseBuilt.BDoc cs.cs_name + +- let distclean t pkg (cs, _) extra_args = +- distclean t pkg extra_args ++ let distclean ~ctxt t pkg _ extra_args = distclean ~ctxt t pkg extra_args + end + + + end + + +-# 6764 "setup.ml" ++# 6969 "setup.ml" + open OASISTypes;; + + let setup_t = +@@ -6833,10 +7038,6 @@ let setup_t = + { + oasis_version = "0.3"; + ocaml_version = None; +- findlib_version = None; +- alpha_features = []; +- beta_features = []; +- name = "ocamlmod"; + version = "0.0.8"; + license = + OASISLicense.DEP5License +@@ -6846,47 +7047,20 @@ let setup_t = + excption = Some "OCaml linking"; + version = OASISLicense.Version "2.1" + }); ++ findlib_version = None; ++ alpha_features = []; ++ beta_features = []; ++ name = "ocamlmod"; + license_file = None; + copyrights = []; + maintainers = []; + authors = ["Sylvain Le Gall"]; + homepage = None; ++ bugreports = None; + synopsis = "Generate OCaml modules from source files"; + description = None; ++ tags = []; + categories = []; +- conf_type = (`Configure, "internal", Some "0.4"); +- conf_custom = +- { +- pre_command = [(OASISExpr.EBool true, None)]; +- post_command = [(OASISExpr.EBool true, None)] +- }; +- build_type = (`Build, "ocamlbuild", Some "0.4"); +- build_custom = +- { +- pre_command = [(OASISExpr.EBool true, None)]; +- post_command = [(OASISExpr.EBool true, None)] +- }; +- install_type = (`Install, "internal", Some "0.4"); +- install_custom = +- { +- pre_command = [(OASISExpr.EBool true, None)]; +- post_command = [(OASISExpr.EBool true, None)] +- }; +- uninstall_custom = +- { +- pre_command = [(OASISExpr.EBool true, None)]; +- post_command = [(OASISExpr.EBool true, None)] +- }; +- clean_custom = +- { +- pre_command = [(OASISExpr.EBool true, None)]; +- post_command = [(OASISExpr.EBool true, None)] +- }; +- distclean_custom = +- { +- pre_command = [(OASISExpr.EBool true, None)]; +- post_command = [(OASISExpr.EBool true, None)] +- }; + files_ab = ["src/ocamlmodConf.ml.ab"]; + sections = + [ +@@ -6903,8 +7077,119 @@ let setup_t = + bs_compiled_object = Byte; + bs_build_depends = [FindlibPackage ("str", None)]; + bs_build_tools = [ExternalTool "ocamlbuild"]; ++ bs_interface_patterns = ++ [ ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mli" ++ ]; ++ origin = "${capitalize_file module}.mli" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mli" ++ ]; ++ origin = "${uncapitalize_file module}.mli" ++ } ++ ]; ++ bs_implementation_patterns = ++ [ ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".ml" ++ ]; ++ origin = "${capitalize_file module}.ml" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".ml" ++ ]; ++ origin = "${uncapitalize_file module}.ml" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mll" ++ ]; ++ origin = "${capitalize_file module}.mll" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mll" ++ ]; ++ origin = "${uncapitalize_file module}.mll" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mly" ++ ]; ++ origin = "${capitalize_file module}.mly" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mly" ++ ]; ++ origin = "${uncapitalize_file module}.mly" ++ } ++ ]; + bs_c_sources = []; + bs_data_files = []; ++ bs_findlib_extra_files = []; + bs_ccopt = [(OASISExpr.EBool true, [])]; + bs_cclib = [(OASISExpr.EBool true, [])]; + bs_dlllib = [(OASISExpr.EBool true, [])]; +@@ -6936,8 +7221,119 @@ let setup_t = + FindlibPackage ("str", None) + ]; + bs_build_tools = [ExternalTool "ocamlbuild"]; ++ bs_interface_patterns = ++ [ ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mli" ++ ]; ++ origin = "${capitalize_file module}.mli" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mli" ++ ]; ++ origin = "${uncapitalize_file module}.mli" ++ } ++ ]; ++ bs_implementation_patterns = ++ [ ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".ml" ++ ]; ++ origin = "${capitalize_file module}.ml" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".ml" ++ ]; ++ origin = "${uncapitalize_file module}.ml" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mll" ++ ]; ++ origin = "${capitalize_file module}.mll" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mll" ++ ]; ++ origin = "${uncapitalize_file module}.mll" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("capitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mly" ++ ]; ++ origin = "${capitalize_file module}.mly" ++ }; ++ { ++ OASISSourcePatterns.Templater.atoms = ++ [ ++ OASISSourcePatterns.Templater.Text ""; ++ OASISSourcePatterns.Templater.Expr ++ (OASISSourcePatterns.Templater.Call ++ ("uncapitalize_file", ++ OASISSourcePatterns.Templater.Ident ++ "module")); ++ OASISSourcePatterns.Templater.Text ".mly" ++ ]; ++ origin = "${uncapitalize_file module}.mly" ++ } ++ ]; + bs_c_sources = []; + bs_data_files = []; ++ bs_findlib_extra_files = []; + bs_ccopt = [(OASISExpr.EBool true, [])]; + bs_cclib = [(OASISExpr.EBool true, [])]; + bs_dlllib = [(OASISExpr.EBool true, [])]; +@@ -6969,18 +7365,51 @@ let setup_t = + test_tools = [ExternalTool "ocamlbuild"] + }) + ]; ++ disable_oasis_section = []; ++ conf_type = (`Configure, "internal", Some "0.4"); ++ conf_custom = ++ { ++ pre_command = [(OASISExpr.EBool true, None)]; ++ post_command = [(OASISExpr.EBool true, None)] ++ }; ++ build_type = (`Build, "ocamlbuild", Some "0.4"); ++ build_custom = ++ { ++ pre_command = [(OASISExpr.EBool true, None)]; ++ post_command = [(OASISExpr.EBool true, None)] ++ }; ++ install_type = (`Install, "internal", Some "0.4"); ++ install_custom = ++ { ++ pre_command = [(OASISExpr.EBool true, None)]; ++ post_command = [(OASISExpr.EBool true, None)] ++ }; ++ uninstall_custom = ++ { ++ pre_command = [(OASISExpr.EBool true, None)]; ++ post_command = [(OASISExpr.EBool true, None)] ++ }; ++ clean_custom = ++ { ++ pre_command = [(OASISExpr.EBool true, None)]; ++ post_command = [(OASISExpr.EBool true, None)] ++ }; ++ distclean_custom = ++ { ++ pre_command = [(OASISExpr.EBool true, None)]; ++ post_command = [(OASISExpr.EBool true, None)] ++ }; + plugins = + [ + (`Extra, "DevFiles", Some "0.2"); + (`Extra, "META", Some "0.2"); + (`Extra, "StdFiles", Some "0.2") + ]; +- disable_oasis_section = []; + schema_data = PropList.Data.create (); + plugin_data = [] + }; + oasis_fn = Some "_oasis"; +- oasis_version = "0.4.4"; ++ oasis_version = "0.4.10"; + oasis_digest = + Some "\182\130\027\155\220\031\026\154c\227c\243\029(D\015"; + oasis_exec = None; +@@ -6990,6 +7419,8 @@ let setup_t = + + let setup () = BaseSetup.setup setup_t;; + +-# 6973 "setup.ml" ++# 7402 "setup.ml" ++let setup_t = BaseCompat.Compat_0_3.adapt_setup_t setup_t ++open BaseCompat.Compat_0_3 + (* OASIS_STOP *) + let () = setup ();; |