-let dwsize = sprintf "-DWORDSIZE%i" Sys.word_size
-
-(* Utils *)
-let ( @= ) r l = r := !r @ l
-let ( =:: ) r e = r := e :: !r
-
-(* Pre-processed files *)
-let pp_macro_options = ref
- [ A dwsize; A "-I"; P include_path ]
-
-let include_full_path = Pathname.pwd / include_path
-module Depends =
-struct
-open Scanf
-let scan_include ml =
- let ic = open_in ml and includes = ref [] in
- begin
- try
- while true do
- let s = input_line ic in
- if String.length s > 0 then
- try
- sscanf s " INCLUDE \"%s@\"" (fun s -> includes =:: include_path /s)
- with Scan_failure _ -> ()
- done
- with End_of_file -> close_in ic
- end;
- !includes
-
-let ocaml ml =
- let rec loop file =
- let includes = scan_include file in
- List.fold_left (fun a i -> (loop i) @ a) includes includes
- in
- let includes = loop ml in
- dep [ "file:" ^ ml ] includes
-
-let parse_depends depfile =
- let ichan = open_in depfile in
- let iscan = Scanning.from_channel ichan in
- let includes = ref [] in
- bscanf iscan " %_s@: %s " ignore;
- try
- while true do
- bscanf iscan " %s " (
- function "" -> raise End_of_file
- | "\\" -> ()
- | s -> includes =::s)
- done; []
- with
- _ -> close_in ichan;!includes
-
-let cxx cpp =
- let depfile = !Options.build_dir /" __cxx_depends.tmp" in
- let cmd = Cmd (S[ A cxx_cmd ; S !cxx_flags; cxx_include_flags ; A"-MM";
- A "-MF"; P depfile; P cpp])
- in
- let () = Command.execute ~quiet:true ~pretend:false cmd in
- let includes = parse_depends depfile in
- let includes' = (List.filter (Pathname.is_relative) includes) in
- dep [ "compile"; "file:" ^ cpp ] includes'
-end
-
-let cxx_compile env _build =
- let cpp = env "%.cpp" and obj = env "%.o" in
- let tags = (tags_of_pathname cpp) ++ "compile" ++ "c++" in
- Cmd(S[T tags; A cxx_cmd; A "-o" ; P obj; A "-c"; S !cxx_flags; cxx_include_flags; P cpp])
-
-(* Native compile and link action *)
-
-let ocamlfind x = S[ T (Tags.singleton "ocamlfind"); A"ocamlfind"; x ; A "-package"; A ocamlfind_packages; A "-syntax"; A "camlp4o" ]
-
-let ppopt l = List.map (fun e -> S[ A"-ppopt"; e ]) l
+let includes = ref StringSet.empty
+
+let register_include dir =
+ if not (StringSet.mem dir !includes) then begin
+ includes := StringSet.add dir !includes;
+ dep [ "extension:ml" ]
+ (List.map (fun s -> dir ^ "/" ^ s )
+ (Array.to_list (Pathname.readdir dir)))
+ end
+
+let set_flags tag_list action_list =
+ List.iter (fun s ->
+ List.iter (fun (fl, fu) ->
+ pflag s fl fu)
+ action_list
+ ) tag_list
+
+let macro_flags = [
+ "macro_include",
+ (fun s -> register_include s; S [A"-ppopt"; A "-I"; A"-ppopt"; A s]);
+ "macro_define", (fun s -> S [A"-ppopt"; A ("-D"^s)]);
+]