Use Arg_spec.Hidden_deps

This commit is contained in:
Jeremie Dimino 2018-03-30 20:21:47 -04:00 committed by Rudi Grinberg
parent 85c8fff7f5
commit 0104309f25
5 changed files with 64 additions and 60 deletions

View File

@ -486,13 +486,11 @@ module Gen(P : Install_rules.Params) = struct
; Dyn (fun (cm_files, _, _, _) -> Deps cm_files) ; Dyn (fun (cm_files, _, _, _) -> Deps cm_files)
])) ]))
let build_c_file (lib : Library.t) ~scope ~dir ~requires ~h_file_deps c_name = let build_c_file (lib : Library.t) ~scope ~dir ~includes c_name =
let src = Path.relative dir (c_name ^ ".c") in let src = Path.relative dir (c_name ^ ".c") in
let dst = Path.relative dir (c_name ^ ctx.ext_obj) in let dst = Path.relative dir (c_name ^ ctx.ext_obj) in
SC.add_rule sctx SC.add_rule sctx
(h_file_deps (SC.expand_and_eval_set sctx ~scope ~dir lib.c_flags
>>>
SC.expand_and_eval_set sctx ~scope ~dir lib.c_flags
~standard:(Context.cc_g ctx) ~standard:(Context.cc_g ctx)
>>> >>>
Build.run ~context:ctx Build.run ~context:ctx
@ -501,16 +499,14 @@ module Gen(P : Install_rules.Params) = struct
~dir ~dir
(Ok ctx.ocamlc) (Ok ctx.ocamlc)
[ As (Utils.g ()) [ As (Utils.g ())
; Arg_spec.of_result_map requires ~f:(fun libs -> ; includes
Lib.L.c_include_flags libs ~stdlib_dir:ctx.stdlib_dir)
; Dyn (fun c_flags -> Arg_spec.quote_args "-ccopt" c_flags) ; Dyn (fun c_flags -> Arg_spec.quote_args "-ccopt" c_flags)
; A "-o"; Target dst ; A "-o"; Target dst
; Dep src ; Dep src
]); ]);
dst dst
let build_cxx_file (lib : Library.t) ~scope ~dir ~requires ~h_file_deps let build_cxx_file (lib : Library.t) ~scope ~dir ~includes c_name =
c_name =
let src = Path.relative dir (c_name ^ ".cpp") in let src = Path.relative dir (c_name ^ ".cpp") in
let dst = Path.relative dir (c_name ^ ctx.ext_obj) in let dst = Path.relative dir (c_name ^ ctx.ext_obj) in
let open Arg_spec in let open Arg_spec in
@ -521,9 +517,7 @@ module Gen(P : Install_rules.Params) = struct
[A "-o"; Target dst] [A "-o"; Target dst]
in in
SC.add_rule sctx SC.add_rule sctx
(h_file_deps (SC.expand_and_eval_set sctx ~scope ~dir lib.cxx_flags
>>>
SC.expand_and_eval_set sctx ~scope ~dir lib.cxx_flags
~standard:(Context.cc_g ctx) ~standard:(Context.cc_g ctx)
>>> >>>
Build.run ~context:ctx Build.run ~context:ctx
@ -533,8 +527,7 @@ module Gen(P : Install_rules.Params) = struct
(SC.resolve_program sctx ctx.c_compiler) (SC.resolve_program sctx ctx.c_compiler)
([ S [A "-I"; Path ctx.stdlib_dir] ([ S [A "-I"; Path ctx.stdlib_dir]
; As (SC.cxx_flags sctx) ; As (SC.cxx_flags sctx)
; Arg_spec.of_result_map requires ~f:(fun libs -> ; includes
Lib.L.c_include_flags libs ~stdlib_dir:ctx.stdlib_dir)
; Dyn (fun cxx_flags -> As cxx_flags) ; Dyn (fun cxx_flags -> As cxx_flags)
] @ output_param @ ] @ output_param @
[ A "-c"; Dep src [ A "-c"; Dep src
@ -622,25 +615,32 @@ module Gen(P : Install_rules.Params) = struct
~dir ~dir
~obj_dir ~obj_dir
~dep_graphs:(Ocamldep.Dep_graphs.dummy m) ~dep_graphs:(Ocamldep.Dep_graphs.dummy m)
~requires:(Ok []) ~includes:(Cm_kind.Dict.make_all (Arg_spec.As []))
~lib_file_deps:(Cm_kind.Dict.make_all (Build.return ()))
~alias_module:None); ~alias_module:None);
if Library.has_stubs lib then begin if Library.has_stubs lib then begin
let h_files = let h_files =
Path.Set.of_string_set ~f:(Path.relative dir) String_set.to_list files
(String_set.filter files ~f:(String.is_suffix ~suffix:".h")) |> List.filter_map ~f:(fun fn ->
if String.is_suffix fn ~suffix:".h" then
Some (Path.relative dir fn)
else
None)
in in
let o_files = let o_files =
let h_file_deps = let includes =
Build.path_set h_files Arg_spec.S
>>> [ Hidden_deps h_files
SC.Libs.file_deps sctx requires ~ext:".h" ; Arg_spec.of_result_map requires ~f:(fun libs ->
S [ Lib.L.c_include_flags libs ~stdlib_dir:ctx.stdlib_dir
; Hidden_deps (SC.Libs.file_deps sctx libs ~ext:".h")
])
]
in in
List.map lib.c_names ~f:( List.map lib.c_names ~f:(
build_c_file lib ~scope ~dir ~requires ~h_file_deps build_c_file lib ~scope ~dir ~includes
) @ List.map lib.cxx_names ~f:( ) @ List.map lib.cxx_names ~f:(
build_cxx_file lib ~scope ~dir ~requires ~h_file_deps build_cxx_file lib ~scope ~dir ~includes
) )
in in
match lib.self_build_stubs_archive with match lib.self_build_stubs_archive with

View File

@ -19,7 +19,7 @@ end = struct
end end
let build_cm sctx ?sandbox ~dynlink ~flags ~cm_kind ~dep_graphs let build_cm sctx ?sandbox ~dynlink ~flags ~cm_kind ~dep_graphs
~requires ~lib_file_deps ~dir ~obj_dir ~alias_module (m : Module.t) = ~includes ~dir ~obj_dir ~alias_module (m : Module.t) =
let ctx = SC.context sctx in let ctx = SC.context sctx in
Option.iter (Mode.of_cm_kind cm_kind |> Context.compiler ctx) ~f:(fun compiler -> Option.iter (Mode.of_cm_kind cm_kind |> Context.compiler ctx) ~f:(fun compiler ->
Option.iter (Module.cm_source ~dir m cm_kind) ~f:(fun src -> Option.iter (Module.cm_source ~dir m cm_kind) ~f:(fun src ->
@ -87,8 +87,7 @@ let build_cm sctx ?sandbox ~dynlink ~flags ~cm_kind ~dep_graphs
As [] As []
in in
SC.add_rule sctx ?sandbox SC.add_rule sctx ?sandbox
(lib_file_deps >>> (Build.paths extra_deps >>>
Build.paths extra_deps >>>
other_cm_files >>> other_cm_files >>>
Ocaml_flags.get_for_cm flags ~cm_kind >>> Ocaml_flags.get_for_cm flags ~cm_kind >>>
Build.run ~context:ctx (Ok compiler) Build.run ~context:ctx (Ok compiler)
@ -96,8 +95,7 @@ let build_cm sctx ?sandbox ~dynlink ~flags ~cm_kind ~dep_graphs
[ Dyn (fun ocaml_flags -> As ocaml_flags) [ Dyn (fun ocaml_flags -> As ocaml_flags)
; cmt_args ; cmt_args
; A "-I"; Path obj_dir ; A "-I"; Path obj_dir
; Arg_spec.of_result_map requires ; includes
~f:(Lib.L.include_flags ~stdlib_dir:ctx.stdlib_dir)
; As extra_args ; As extra_args
; if dynlink || cm_kind <> Cmx then As [] else A "-nodynlink" ; if dynlink || cm_kind <> Cmx then As [] else A "-nodynlink"
; A "-no-alias-deps"; opaque ; A "-no-alias-deps"; opaque
@ -110,11 +108,11 @@ let build_cm sctx ?sandbox ~dynlink ~flags ~cm_kind ~dep_graphs
]))) ])))
let build_module sctx ?sandbox ~dynlink ~js_of_ocaml ~flags m ~scope ~dir let build_module sctx ?sandbox ~dynlink ~js_of_ocaml ~flags m ~scope ~dir
~obj_dir ~dep_graphs ~requires ~lib_file_deps ~alias_module = ~obj_dir ~dep_graphs ~includes ~alias_module =
List.iter Cm_kind.all ~f:(fun cm_kind -> List.iter Cm_kind.all ~f:(fun cm_kind ->
let lib_file_deps = Cm_kind.Dict.get lib_file_deps cm_kind in let includes = Cm_kind.Dict.get includes cm_kind in
build_cm sctx ?sandbox ~dynlink ~flags ~dir ~obj_dir ~dep_graphs m ~cm_kind build_cm sctx ?sandbox ~dynlink ~flags ~dir ~obj_dir ~dep_graphs m ~cm_kind
~requires ~lib_file_deps ~alias_module); ~includes ~alias_module);
(* Build *.cmo.js *) (* Build *.cmo.js *)
let src = Module.cm_file_unsafe m ~obj_dir Cm_kind.Cmo in let src = Module.cm_file_unsafe m ~obj_dir Cm_kind.Cmo in
let target = let target =
@ -126,17 +124,29 @@ let build_module sctx ?sandbox ~dynlink ~js_of_ocaml ~flags m ~scope ~dir
let build_modules sctx ~dynlink ~js_of_ocaml ~flags ~scope ~dir ~obj_dir let build_modules sctx ~dynlink ~js_of_ocaml ~flags ~scope ~dir ~obj_dir
~dep_graphs ~modules ~requires ~alias_module = ~dep_graphs ~modules ~requires ~alias_module =
let cmi_file_deps = let includes : _ Cm_kind.Dict.t =
SC.Libs.file_deps sctx requires ~ext:".cmi" match requires with
in | Error exn -> Cm_kind.Dict.make_all (Arg_spec.Dyn (fun _ -> raise exn))
let cmi_and_cmx_file_deps = | Ok libs ->
SC.Libs.file_deps sctx requires ~ext:".cmi-and-.cmx" let iflags =
in Lib.L.include_flags libs ~stdlib_dir:(SC.context sctx).stdlib_dir
let lib_file_deps : _ Cm_kind.Dict.t = in
{ cmi = cmi_file_deps let cmi_includes =
; cmo = cmi_file_deps Arg_spec.S [ iflags
; cmx = cmi_and_cmx_file_deps ; Hidden_deps
} (SC.Libs.file_deps sctx libs ~ext:".cmi")
]
in
let cmi_and_cmx_includes =
Arg_spec.S [ iflags
; Hidden_deps
(SC.Libs.file_deps sctx libs ~ext:".cmi-and-.cmx")
]
in
{ cmi = cmi_includes
; cmo = cmi_includes
; cmx = cmi_and_cmx_includes
}
in in
Module.Name.Map.iter Module.Name.Map.iter
(match alias_module with (match alias_module with
@ -144,4 +154,4 @@ let build_modules sctx ~dynlink ~js_of_ocaml ~flags ~scope ~dir ~obj_dir
| Some (m : Module.t) -> Module.Name.Map.remove modules m.name) | Some (m : Module.t) -> Module.Name.Map.remove modules m.name)
~f:(fun m -> ~f:(fun m ->
build_module sctx m ~dynlink ~js_of_ocaml ~flags ~scope ~dir ~obj_dir build_module sctx m ~dynlink ~js_of_ocaml ~flags ~scope ~dir ~obj_dir
~dep_graphs ~requires ~lib_file_deps ~alias_module) ~dep_graphs ~includes ~alias_module)

View File

@ -2,10 +2,7 @@
open Import open Import
(** Setup rules to build a single module. (** Setup rules to build a single module. *)
[lib_file_deps] represent the dependencies on files of library
dependencies. *)
val build_module val build_module
: Super_context.t : Super_context.t
-> ?sandbox:bool -> ?sandbox:bool
@ -17,8 +14,7 @@ val build_module
-> dir:Path.t -> dir:Path.t
-> obj_dir:Path.t -> obj_dir:Path.t
-> dep_graphs:Ocamldep.Dep_graphs.t -> dep_graphs:Ocamldep.Dep_graphs.t
-> requires:Lib.t list Or_exn.t -> includes:string list Arg_spec.t Cm_kind.Dict.t
-> lib_file_deps:(unit, unit) Build.t Cm_kind.Dict.t
-> alias_module:Module.t option -> alias_module:Module.t option
-> unit -> unit

View File

@ -304,15 +304,13 @@ module Libs = struct
|> Path.Set.of_list) |> Path.Set.of_list)
let file_deps t libs ~ext = let file_deps t libs ~ext =
Build.of_result_map libs ~f:(fun libs -> List.rev_map libs ~f:(fun (lib : Lib.t) ->
Build.paths if Lib.is_local lib then
(List.rev_map libs ~f:(fun (lib : Lib.t) -> Alias.stamp_file
if Lib.is_local lib then (lib_files_alias ~dir:(Lib.src_dir lib) ~name:(Lib.name lib) ~ext)
Alias.stamp_file else
(lib_files_alias ~dir:(Lib.src_dir lib) ~name:(Lib.name lib) ~ext) Build_system.stamp_file_for_files_of t.build_system
else ~dir:(Lib.obj_dir lib) ~ext)
Build_system.stamp_file_for_files_of t.build_system
~dir:(Lib.obj_dir lib) ~ext)))
end end
module Deps = struct module Deps = struct

View File

@ -144,9 +144,9 @@ module Libs : sig
(** Generate the rules for the [(select ...)] forms in library dependencies *) (** Generate the rules for the [(select ...)] forms in library dependencies *)
val gen_select_rules : t -> dir:Path.t -> Lib.Compile.t -> unit val gen_select_rules : t -> dir:Path.t -> Lib.Compile.t -> unit
(** [file_deps t libs ~ext] is an arrow that record dependencies on (** [file_deps t libs ~ext] returns a list of path dependencies for
all the files with extension [ext] of libraries [libs]. *) all the files with extension [ext] of libraries [libs]. *)
val file_deps : t -> Lib.L.t Or_exn.t -> ext:string -> ('a, 'a) Build.t val file_deps : t -> Lib.L.t -> ext:string -> Path.t list
(** Setup the alias that depends on all files with a given extension (** Setup the alias that depends on all files with a given extension
for a library *) for a library *)