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)
|
; 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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 *)
|
||||||
|
|
Loading…
Reference in New Issue