X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=myocamlbuild.ml;h=98a74030d3b39555d9e76282fcf279debeb11450;hb=ba65a1b770d860132fbb04be4ca931b983dcb915;hp=62dbdafed0070eb4277a3f6b6b3df142fedda07a;hpb=4b52da1a20a4fe031930bb96d2ca46bec06dc529;p=SXSI%2Fxpathcomp.git diff --git a/myocamlbuild.ml b/myocamlbuild.ml index 62dbdaf..98a7403 100644 --- a/myocamlbuild.ml +++ b/myocamlbuild.ml @@ -4,10 +4,7 @@ open Myocamlbuild_config open Format let print_list l = - Printf.eprintf "%!["; - List.iter (fun s -> Printf.eprintf " '%s' " s) l; - Printf.eprintf "]\n%!" - + eprintf "%![%s]%!\n" (String.concat ", " l) (*let cxx_flags = S (List.map ( fun x -> A x) cxx_flags)*) let _A x = A x @@ -45,15 +42,17 @@ let scan_include ml = _ -> open_in (include_full_path / ml) in let includes = ref [] in - try - while true do - let s = input_line ic in - try - if String.length s > 0 then sscanf s " INCLUDE \"%s@\"" ((=::) includes) - with - Scan_failure _ -> () - done; [] - with End_of_file -> close_in ic; !includes + let () = + try + while true do + let s = input_line ic in + if String.length s > 0 then + try sscanf s " INCLUDE \"%s@\"" ((=::) includes) + with Scan_failure _ -> () + done + with End_of_file -> close_in ic + in + !includes let ocaml ml = let rec loop file = @@ -67,20 +66,23 @@ let ocaml ml = let parse_depends file depfile = let ichan = open_in depfile in let iscan = Scanning.from_channel ichan in - let () = bscanf iscan " %s@: " ignore in - let () = bscanf iscan " %s " ignore in let includes = ref [] in - 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; !includes + 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 = @@ -95,23 +97,22 @@ let uniq l = let cxx cpp = let depfile = ( cpp ^ ".depends") in let cmd = Cmd (S[ A cxx_cmd ; S !cxx_flags; cxx_include_flags ; A"-MM"; - A "-MG"; A "-MF"; P depfile; P cpp]) + A "-MF"; P depfile; P cpp]) in let () = Command.execute ~quiet:true ~pretend:false cmd in let includes = parse_depends cpp depfile in - List.filter (Pathname.is_relative) (uniq includes) + let includes' = uniq (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 local_include = Depends.cxx src in - let local_dispatch = List.map (fun p -> List.map (fun p' -> p'/p) project_dirs) local_include in - let () = ignore (build local_dispatch) in - Cmd(S[A cxx_cmd; A "-o" ; P obj; A "-c"; S !cxx_flags; cxx_include_flags; P src]) + 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]) (* Native compile and link action *) -let ocamlfind x = S[ A"ocamlfind"; x ; A "-package"; A ocamlfind_packages ] +let ocamlfind x = S[ T (Tags.singleton "ocamlfind"); A"ocamlfind"; x ; A "-package"; A ocamlfind_packages ] let ppopt l = List.map (fun e -> S[ A"-ppopt"; e ]) l @@ -125,7 +126,9 @@ let () = dispatch begin Options.ocamldoc := ocamlfind (A"ocamldoc"); Options.ocamlmktop := ocamlfind (A"ocamlmktop"); - + if (List.mem "trace" !Options.tags) then begin + pp_macro_options @= [ A "-DTRACE" ]; + end; if (List.mem "profile" !Options.tags) then begin pp_macro_options @= [ A "-DPROFILE" ]; native_compile_flags @= [A "-p" ]; @@ -140,7 +143,8 @@ let () = dispatch begin cxx_link_flags @= [ A "-g" ]; end else begin - compile_flags @= [A "-noassert"; A "-unsafe"]; + compile_flags @= [A "-noassert"]; + pp_macro_options @= [ A "-unsafe" ]; native_compile_flags @= [ A "-inline"; A ocaml_inline ]; cxx_flags @= [ A "-O3" ] end; @@ -151,16 +155,16 @@ let () = dispatch begin Array.iter (fun entry -> if Pathname.check_extension entry "ml" then Depends.ocaml (src_path / entry) - (* else if Pathname.check_extension entry "cpp" then - Depends.cxx (src_path / entry) *) + else if Pathname.check_extension entry "cpp" then + Depends.cxx (src_path / entry) ) dir; | After_rules -> dep [ "link" ] cstub_lib; - rule "compile cpp -> o" ~prod:"%.o" ~deps:[ "%.cpp"] cxx_compile; + rule "compile cpp -> o" ~prod:"%.o" ~deps:[ "%.cpp" ] cxx_compile; let syntax_flags = S ([ A "-syntax"; A "camlp4o"; - S (ppopt [A "-printer" ; A"ocaml"]); + S (ppopt [A "-printer" ; A"Camlp4OCamlAstDumper"]); S (ppopt !pp_macro_options) ]) in flag [ "ocaml"; "ocamldep"] syntax_flags;