X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=myocamlbuild.ml;h=bbe7fc091ef0def00d4c9f7ce59281b449c06f4e;hb=e4a9d72f66f5fc248afe32ec0340e34c2448623f;hp=98a74030d3b39555d9e76282fcf279debeb11450;hpb=ba65a1b770d860132fbb04be4ca931b983dcb915;p=SXSI%2Fxpathcomp.git diff --git a/myocamlbuild.ml b/myocamlbuild.ml index 98a7403..bbe7fc0 100644 --- a/myocamlbuild.ml +++ b/myocamlbuild.ml @@ -6,7 +6,6 @@ open Format 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) ;; @@ -38,20 +37,18 @@ module Depends = 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 = @@ -60,55 +57,38 @@ 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 *) @@ -161,8 +141,8 @@ let () = dispatch begin | 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) ])