diff --git a/doc/jbuild.rst b/doc/jbuild.rst index 6053410d..d00b7fd7 100644 --- a/doc/jbuild.rst +++ b/doc/jbuild.rst @@ -874,7 +874,8 @@ using ``(js_of_ocaml ())``. ```` are all optional: -- ``(flags )`` to specify flags passed to ``js_of_ocaml`` +- ``(flags )`` to specify flags passed to ``js_of_ocaml``. This field + supports ``(:include ...)`` forms - ``(javascript_files ())`` to specify ``js_of_ocaml`` JavaScript runtime files. diff --git a/src/gen_rules.ml b/src/gen_rules.ml index 4b4adf2a..90b54088 100644 --- a/src/gen_rules.ml +++ b/src/gen_rules.ml @@ -453,7 +453,12 @@ module Gen(P : Params) = struct ]); if mode = Mode.Byte then let rules = Js_of_ocaml_rules.build_exe sctx ~dir ~js_of_ocaml ~src:exe in - SC.add_rules sctx (List.map rules ~f:(fun r -> libs_and_cm >>> r)) + let libs_and_cm_and_flags = + libs_and_cm + &&& + SC.expand_and_eval_set ~dir js_of_ocaml.flags ~standard:(Js_of_ocaml_rules.standard ()) + in + SC.add_rules sctx (List.map rules ~f:(fun r -> libs_and_cm_and_flags >>> r)) let executables_rules (exes : Executables.t) ~dir ~all_modules ~scope = let dep_kind = Build.Required in diff --git a/src/jbuild.ml b/src/jbuild.ml index ef2ee14c..aac30e32 100644 --- a/src/jbuild.ml +++ b/src/jbuild.ml @@ -310,27 +310,24 @@ module Lint = struct ] end -let field_osl name = - field name Ordered_set_lang.t ~default:Ordered_set_lang.standard - let field_oslu name = field name Ordered_set_lang.Unexpanded.t ~default:Ordered_set_lang.Unexpanded.standard module Js_of_ocaml = struct type t = - { flags : Ordered_set_lang.t + { flags : Ordered_set_lang.Unexpanded.t ; javascript_files : string list } let t = record - (field_osl "flags" >>= fun flags -> + (field_oslu "flags" >>= fun flags -> field "javascript_files" (list string) ~default:[] >>= fun javascript_files -> return { flags; javascript_files }) let default = - { flags = Ordered_set_lang.standard + { flags = Ordered_set_lang.Unexpanded.standard ; javascript_files = [] } end diff --git a/src/jbuild.mli b/src/jbuild.mli index 60cf1043..e0b7582e 100644 --- a/src/jbuild.mli +++ b/src/jbuild.mli @@ -54,7 +54,7 @@ end module Js_of_ocaml : sig type t = - { flags : Ordered_set_lang.t + { flags : Ordered_set_lang.Unexpanded.t ; javascript_files : string list } end diff --git a/src/js_of_ocaml_rules.ml b/src/js_of_ocaml_rules.ml index d002e5fd..5aa03930 100644 --- a/src/js_of_ocaml_rules.ml +++ b/src/js_of_ocaml_rules.ml @@ -1,5 +1,6 @@ open Import open! No_io +open Build.O module SC = Super_context @@ -33,37 +34,36 @@ let js_of_ocaml_rule ~sctx ~dir ~flags ~spec ~target = let runtime = runtime_file ~sctx ~dir "runtime.js" in Build.run ~context:(SC.context sctx) ~dir jsoo - [ Arg_spec.As flags + [ Arg_spec.Dyn flags ; Arg_spec.A "-o"; Target target ; Arg_spec.A "--no-runtime"; runtime ; spec ] -let standalone_runtime_rule ~sctx ~dir ~flags ~javascript_files ~target = +let standalone_runtime_rule ~sctx ~dir ~javascript_files ~target = let spec = Arg_spec.S - [ Arg_spec.Dyn (fun (libs,_) -> Arg_spec.Deps (Lib.jsoo_runtime_files libs)) + [ Arg_spec.Dyn (fun ((libs,_),_) -> Arg_spec.Deps (Lib.jsoo_runtime_files libs)) ; Arg_spec.Deps javascript_files ] in - let flags = Ordered_set_lang.eval_with_standard flags ~standard:(standard ()) in - let flags = "--runtime-only" :: flags in - js_of_ocaml_rule ~sctx ~dir ~flags ~target ~spec + Build.arr (fun (libs_and_cm,flags) -> (libs_and_cm, "--runtime-only" :: flags)) + >>> + js_of_ocaml_rule ~sctx ~dir ~flags:(fun (_,flags) -> As flags) ~target ~spec -let exe_rule ~sctx ~dir ~flags ~javascript_files ~src ~target = +let exe_rule ~sctx ~dir ~javascript_files ~src ~target = let spec = Arg_spec.S - [ Arg_spec.Dyn (fun (libs,_) -> Arg_spec.Deps (Lib.jsoo_runtime_files libs)) + [ Arg_spec.Dyn (fun ((libs,_),_) -> Arg_spec.Deps (Lib.jsoo_runtime_files libs)) ; Arg_spec.Deps javascript_files ; Arg_spec.Dep src ] in - let flags = Ordered_set_lang.eval_with_standard flags ~standard:(standard ()) in - js_of_ocaml_rule ~sctx ~dir ~flags ~spec ~target + js_of_ocaml_rule ~sctx ~dir ~flags:(fun (_,flags) -> As flags) ~spec ~target let link_rule ~sctx ~dir ~runtime ~target = let ctx = SC.context sctx in - let get_all (libs,cm) = + let get_all ((libs,cm),_) = (* Special case for the stdlib because it is not referenced in the META *) let stdlib = Lib.External (Findlib.stdlib_with_archives ctx.findlib) in let all_libs = @@ -94,11 +94,12 @@ let build_cm sctx ~dir ~js_of_ocaml ~src = then let target = Path.extend_basename src ~suffix:".js" in let spec = Arg_spec.Dep src in let flags = - Ordered_set_lang.eval_with_standard - js_of_ocaml.Jbuild.Js_of_ocaml.flags + SC.expand_and_eval_set ~dir js_of_ocaml.Jbuild.Js_of_ocaml.flags ~standard:(standard ()) in - [ js_of_ocaml_rule ~sctx ~dir ~flags ~spec ~target ] + [ flags + >>> + js_of_ocaml_rule ~sctx ~dir ~flags:(fun flags -> As flags) ~spec ~target ] else [] let setup_separate_compilation_rules sctx = @@ -126,21 +127,22 @@ let setup_separate_compilation_rules sctx = let target = in_build_dir ~ctx [ pkg_name; sprintf "%s.js" name] in let dir = in_build_dir ~ctx [ pkg_name ] in let spec = Arg_spec.Dep src in - let flags = standard () in - js_of_ocaml_rule ~sctx ~dir ~flags ~spec ~target + Build.return (standard ()) + >>> + js_of_ocaml_rule ~sctx ~dir ~flags:(fun flags -> As flags) ~spec ~target )) else [] let build_exe sctx ~dir ~js_of_ocaml ~src = - let {Jbuild.Js_of_ocaml.javascript_files; flags} = js_of_ocaml in + let {Jbuild.Js_of_ocaml.javascript_files; _} = js_of_ocaml in let javascript_files = List.map javascript_files ~f:(Path.relative dir) in let mk_target ext = Path.extend_basename src ~suffix:ext in let target = mk_target ".js" in let standalone_runtime = mk_target ".runtime.js" in if separate_compilation_enabled () then [ link_rule ~sctx ~dir ~runtime:standalone_runtime ~target - ; standalone_runtime_rule ~sctx ~dir ~flags ~javascript_files + ; standalone_runtime_rule ~sctx ~dir ~javascript_files ~target:standalone_runtime ] else - [ exe_rule ~sctx ~dir ~flags ~javascript_files ~src ~target ] + [ exe_rule ~sctx ~dir ~javascript_files ~src ~target ] diff --git a/src/js_of_ocaml_rules.mli b/src/js_of_ocaml_rules.mli index 4b9bacbd..e651c859 100644 --- a/src/js_of_ocaml_rules.mli +++ b/src/js_of_ocaml_rules.mli @@ -14,10 +14,10 @@ val build_exe -> dir:Path.t -> js_of_ocaml:Js_of_ocaml.t -> src:Path.t - -> (Lib.t list * Path.t list, Action.t) Build.t list + -> ((Lib.t list * Path.t list) * string list, Action.t) Build.t list val setup_separate_compilation_rules : Super_context.t -> (unit, Action.t) Build.t list - +val standard : unit -> string list