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

View File

@ -19,7 +19,7 @@ end = struct
end
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
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 ->
@ -87,8 +87,7 @@ let build_cm sctx ?sandbox ~dynlink ~flags ~cm_kind ~dep_graphs
As []
in
SC.add_rule sctx ?sandbox
(lib_file_deps >>>
Build.paths extra_deps >>>
(Build.paths extra_deps >>>
other_cm_files >>>
Ocaml_flags.get_for_cm flags ~cm_kind >>>
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)
; cmt_args
; A "-I"; Path obj_dir
; Arg_spec.of_result_map requires
~f:(Lib.L.include_flags ~stdlib_dir:ctx.stdlib_dir)
; includes
; As extra_args
; if dynlink || cm_kind <> Cmx then As [] else A "-nodynlink"
; 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
~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 ->
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
~requires ~lib_file_deps ~alias_module);
~includes ~alias_module);
(* Build *.cmo.js *)
let src = Module.cm_file_unsafe m ~obj_dir Cm_kind.Cmo in
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
~dep_graphs ~modules ~requires ~alias_module =
let cmi_file_deps =
SC.Libs.file_deps sctx requires ~ext:".cmi"
in
let cmi_and_cmx_file_deps =
SC.Libs.file_deps sctx requires ~ext:".cmi-and-.cmx"
in
let lib_file_deps : _ Cm_kind.Dict.t =
{ cmi = cmi_file_deps
; cmo = cmi_file_deps
; cmx = cmi_and_cmx_file_deps
}
let includes : _ Cm_kind.Dict.t =
match requires with
| Error exn -> Cm_kind.Dict.make_all (Arg_spec.Dyn (fun _ -> raise exn))
| Ok libs ->
let iflags =
Lib.L.include_flags libs ~stdlib_dir:(SC.context sctx).stdlib_dir
in
let cmi_includes =
Arg_spec.S [ iflags
; 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
Module.Name.Map.iter
(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)
~f:(fun m ->
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
(** Setup rules to build a single module.
[lib_file_deps] represent the dependencies on files of library
dependencies. *)
(** Setup rules to build a single module. *)
val build_module
: Super_context.t
-> ?sandbox:bool
@ -17,8 +14,7 @@ val build_module
-> dir:Path.t
-> obj_dir:Path.t
-> dep_graphs:Ocamldep.Dep_graphs.t
-> requires:Lib.t list Or_exn.t
-> lib_file_deps:(unit, unit) Build.t Cm_kind.Dict.t
-> includes:string list Arg_spec.t Cm_kind.Dict.t
-> alias_module:Module.t option
-> unit

View File

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

View File

@ -144,9 +144,9 @@ module Libs : sig
(** Generate the rules for the [(select ...)] forms in library dependencies *)
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]. *)
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
for a library *)