(* * myocamlbuild.ml * --------------- * Copyright : (c) 2011, Jeremie Dimino * Licence : BSD3 * * This file is a part of utop. *) (* OASIS_START *) (* OASIS_STOP *) let () = dispatch (fun hook -> dispatch_default hook; Ocamlbuild_cppo.dispatcher hook; match hook with | Before_options -> Options.make_links := false | After_rules -> (* Copy tags from *.byte to *.top *) tag_file "src/top/uTop_top.top" (List.filter (* Remove the "file:..." tag and syntax extensions. *) (fun tag -> not (String.is_prefix "file:" tag) && not (String.is_suffix tag ".syntax")) (Tags.elements (tags_of_pathname "src/top/uTop_top.byte"))); (* Use -linkpkg for creating toplevels *) flag ["ocaml"; "link"; "toplevel"] & A"-linkpkg"; let env = BaseEnvLight.load () in let stdlib = BaseEnvLight.var_get "standard_library" env in let paths = [A "-I"; A "+camlp5"] in flag ["ocaml"; "compile"; "use_camlp5"] & S paths; flag ["ocaml"; "ocamldep"; "use_camlp5"] & S paths; flag ["ocaml"; "doc"; "use_camlp5"] & S paths; (* Expunge compiler modules *) rule "toplevel expunge" ~dep:"src/top/uTop_top.top" ~prod:"src/top/uTop_top.byte" (fun _ _ -> (* Build the list of explicit dependencies. *) let packages = Tags.fold (fun tag packages -> if String.is_prefix "package(" tag then String.sub tag 8 (String.length tag - 9) :: packages else packages) (tags_of_pathname "src/top/uTop_top.byte") [] in (* Build the list of dependencies. *) let deps = Findlib.topological_closure (List.rev_map Findlib.query packages) in (* Build the set of locations of dependencies. *) let locs = List.fold_left (fun set pkg -> StringSet.add pkg.Findlib.location set) StringSet.empty deps in (* Directories to search for .cmi: *) let directories = StringSet.add stdlib (StringSet.add (stdlib / "threads") locs) in (* Construct the set of modules to keep by listing .cmi files: *) let modules = StringSet.fold (fun directory set -> List.fold_left (fun set fname -> if Pathname.check_extension fname "cmi" then StringSet.add (module_name_of_pathname fname) set else set) set (Array.to_list (Pathname.readdir directory))) directories StringSet.empty in (* These are not in the stdlib path since 4.00 *) let modules = StringSet.add "Toploop" modules in let modules = StringSet.add "Topmain" modules in Cmd (S [A (stdlib / "expunge"); A "src/top/uTop_top.top"; A "src/top/uTop_top.byte"; A "UTop"; A "UTop_private"; S(List.map (fun x -> A x) (StringSet.elements modules))])); rule "full toplevel (not expunged)" ~dep:"src/top/uTop_top.top" ~prod:"src/top/uTop_top_full.byte" (fun _ _ -> cp "src/top/uTop_top.top" "src/top/uTop_top_full.byte"); let interact_enabled = BaseEnvLight.var_get "interact" env = "true" in flag ["cppo"; "cppo_interact"] ( if interact_enabled then S [A "-D"; A "ENABLE_INTERACT"] else N); rule "format lifter" ~prod:"src/lib/uTop_cmt_lifter.ml" (fun _ _ -> let ocaml_version = Scanf.sscanf (BaseEnvLight.var_get "ocaml_version" env) "%u.%u" (fun a b -> (a, b)) in if ocaml_version < (4, 02) || not interact_enabled then Echo ([], "src/lib/uTop_cmt_lifter.ml") else Cmd (S [ P "ocamlfind" ; A "ppx_tools/genlifter" ; A "-I" ; A "+compiler-libs" ; A "Cmt_format.cmt_infos" ; Sh ">" ; A "src/lib/uTop_cmt_lifter.ml" ])) | _ -> ())