diff --git a/src/gen_rules.ml b/src/gen_rules.ml index 120b1602..16079c1d 100644 --- a/src/gen_rules.ml +++ b/src/gen_rules.ml @@ -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 diff --git a/src/module_compilation.ml b/src/module_compilation.ml index e77cf2b5..162fd6b8 100644 --- a/src/module_compilation.ml +++ b/src/module_compilation.ml @@ -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) diff --git a/src/module_compilation.mli b/src/module_compilation.mli index fc7d52ea..172fb92e 100644 --- a/src/module_compilation.mli +++ b/src/module_compilation.mli @@ -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 diff --git a/src/super_context.ml b/src/super_context.ml index 959909b6..4ac12c85 100644 --- a/src/super_context.ml +++ b/src/super_context.ml @@ -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 diff --git a/src/super_context.mli b/src/super_context.mli index 14959b3c..6f9ea37d 100644 --- a/src/super_context.mli +++ b/src/super_context.mli @@ -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 *)