Use Arg_spec.Hidden_deps
This commit is contained in:
parent
85c8fff7f5
commit
0104309f25
|
@ -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
|
||||
|
|
|
@ -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,16 +124,28 @@ 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"
|
||||
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_and_cmx_file_deps =
|
||||
SC.Libs.file_deps sctx requires ~ext:".cmi-and-.cmx"
|
||||
let cmi_includes =
|
||||
Arg_spec.S [ iflags
|
||||
; Hidden_deps
|
||||
(SC.Libs.file_deps sctx libs ~ext:".cmi")
|
||||
]
|
||||
in
|
||||
let lib_file_deps : _ Cm_kind.Dict.t =
|
||||
{ cmi = cmi_file_deps
|
||||
; cmo = cmi_file_deps
|
||||
; cmx = cmi_and_cmx_file_deps
|
||||
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
|
||||
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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) ->
|
||||
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)))
|
||||
~dir:(Lib.obj_dir lib) ~ext)
|
||||
end
|
||||
|
||||
module Deps = struct
|
||||
|
|
|
@ -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 *)
|
||||
|
|
Loading…
Reference in New Issue