let print_list l =
eprintf "%![%s]%!\n" (String.concat ", " l)
-(*let cxx_flags = S (List.map ( fun x -> A x) cxx_flags)*)
let _A x = A x
let _S ?(extra=N) l = S (List.map (fun e -> (S [extra; _A e] )) l)
;;
struct
open Scanf
let scan_include ml =
- let ic = try open_in ml with
- _ -> open_in (include_full_path / ml)
- in
- let includes = ref [] in
- let () =
+ 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@\"" ((=::) includes)
+ try
+ sscanf s " INCLUDE \"%s@\"" (fun s -> includes =:: include_path /s)
with Scan_failure _ -> ()
done
with End_of_file -> close_in ic
- in
+ end;
!includes
let ocaml ml =
List.fold_left (fun a i -> (loop i) @ a) includes includes
in
let includes = loop ml in
- dep [ "file:" ^ ml ]
- (List.map (fun s -> include_path / s) includes)
+ dep [ "file:" ^ ml ] includes
-let parse_depends file depfile =
+let parse_depends depfile =
let ichan = open_in depfile in
let iscan = Scanning.from_channel ichan in
let includes = ref [] in
- begin
- bscanf iscan " %s@: " ignore;
- bscanf iscan " %s " ignore;
- try
- while true do
- try
- let s = bscanf iscan " %s " (fun s -> s) in
- if s = "" then raise End_of_file;
- if s <> "\\" then includes =::s
- with
- Scan_failure _ -> ()
- done
- with
- End_of_file -> close_in ichan
- end;
- !includes
-
-let uniq l =
- let rec loop l acc =
- match l with
- | [] -> acc
- | [ e ] -> e::acc
- | e1 :: ((e2 :: _) as ll) ->
- loop ll (if e1 = e2 then acc else e1 :: acc)
- in
- loop (List.sort compare l) []
+ 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 = ( cpp ^ ".depends") in
+ 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 cpp depfile in
- let includes' = uniq (List.filter (Pathname.is_relative) includes) 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 src = env "%.cpp" and obj = env "%.o" in
- let tags = (tags_of_pathname src) ++ "compile" ++ "c++" in
- Cmd(S[T tags; A cxx_cmd; A "-o" ; P obj; A "-c"; S !cxx_flags; cxx_include_flags; P src])
+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 *)
Options.ocamldoc := ocamlfind (A"ocamldoc");
Options.ocamlmktop := ocamlfind (A"ocamlmktop");
- if (List.mem "trace" !Options.tags) then begin
- pp_macro_options @= [ A "-DTRACE" ];
+ if not (List.mem "trace" !Options.tags) then begin
+ pp_macro_options @= [ A "-DNTRACE" ];
end;
if (List.mem "profile" !Options.tags) then begin
pp_macro_options @= [ A "-DPROFILE" ];
| After_rules ->
dep [ "link" ] cstub_lib;
- rule "compile cpp -> o" ~prod:"%.o" ~deps:[ "%.cpp" ] cxx_compile;
+ rule "c++: cpp & depends -> o" ~prod:"%.o" ~deps:[ "%.cpp" ] cxx_compile;
let syntax_flags = S ([ A "-syntax"; A "camlp4o";
S (ppopt [A "-printer" ; A"Camlp4OCamlAstDumper"]);
S (ppopt !pp_macro_options) ])