@@ -6758,6 +6758,8 @@ val set_ninja : cwd:string -> string -> unit
67586758type package_specs = String_set .t
67596759val get_package_specs : unit -> package_specs
67606760val set_package_specs_from_array : Ext_json .t array -> unit
6761+ val internal_override_package_specs : string -> unit
6762+
67616763
67626764val get_generate_merlin : unit -> bool
67636765val set_generate_merlin : bool -> unit
@@ -6923,10 +6925,12 @@ let set_ninja ~cwd p =
69236925type package_specs = String_set .t
69246926
69256927let package_specs = ref (String_set. singleton Literals. commonjs)
6928+ let package_specs_overriden = ref false
69266929
69276930let get_package_specs () = ! package_specs
69286931
69296932let set_package_specs_from_array arr =
6933+ if not ! package_specs_overriden then
69306934 let new_package_specs =
69316935 arr
69326936 |> get_list_string
@@ -6939,6 +6943,22 @@ let set_package_specs_from_array arr =
69396943 ) String_set. empty in
69406944 package_specs := new_package_specs
69416945
6946+
6947+
6948+
6949+ let internal_override_package_specs str =
6950+ package_specs_overriden := true ;
6951+ let lst = Ext_string. split ~keep_empty: false str ',' in
6952+ package_specs :=
6953+ List. fold_left (fun acc x ->
6954+ let v =
6955+ if x = Literals. amdjs || x = Literals. commonjs || x = Literals. goog then String_set. add x acc
6956+ else
6957+ failwith (" Unkonwn package spec" ^ x) in
6958+ v
6959+ ) String_set. empty lst
6960+
6961+
69426962let generate_merlin = ref false
69436963
69446964let get_generate_merlin () = ! generate_merlin
@@ -8281,8 +8301,7 @@ let targets = String_vec.make 5
82818301
82828302let cwd = Sys. getcwd ()
82838303
8284- let create_bs_config () =
8285- ()
8304+
82868305let watch () =
82878306 let bsb_watcher =
82888307 Bsb_build_util. get_bsc_dir cwd // " bsb_watcher.js" in
@@ -8299,16 +8318,17 @@ let no_dev = "-no-dev"
82998318let regen = " -regen"
83008319let separator = " --"
83018320
8302- let build_bs_deps () =
8321+
8322+ let internal_package_specs = " -internal-package-specs"
8323+ let build_bs_deps package_specs =
83038324 let bsc_dir = Bsb_build_util. get_bsc_dir cwd in
83048325 let bsb_exe = bsc_dir // " bsb.exe" in
83058326 Bsb_default. walk_all_deps true cwd
83068327 (fun top cwd ->
8307- if top then
8308- Bsb_unix. run_command_execv false { cmd = bsb_exe ; cwd ; args = [|bsb_exe ; regen ; separator|]}
8309- else
8328+ if not top then
83108329 Bsb_unix. run_command_execv true
8311- {cmd = bsb_exe; cwd = cwd; args = [| bsb_exe ; no_dev; regen; separator |]})
8330+ {cmd = bsb_exe; cwd = cwd; args =
8331+ [| bsb_exe ; no_dev; internal_package_specs; package_specs; regen; separator |]})
83128332
83138333let clean_bs_deps () =
83148334 let bsc_dir = Bsb_build_util. get_bsc_dir cwd in
@@ -8319,31 +8339,31 @@ let clean_bs_deps () =
83198339let annoymous filename =
83208340 String_vec. push filename targets
83218341
8342+ let watch_mode = ref false
8343+ let make_world = ref false
83228344
8323-
8324-
8345+
83258346let bsb_main_flags =
83268347 [
8327- " -w" , Arg. Unit watch ,
8348+ " -w" , Arg. Set watch_mode ,
83288349 " Watch mode" ;
8329- no_dev, Arg. Unit (fun _ -> Bsb_config. no_dev := true ),
8330- " (experimental)Build dev dependencies in make-world and dev group" ;
8331- " -no-dev" , Arg. Set Bsb_config. no_dev,
8332- " (experimental)Don't build dev directories(internal for -make-world)" ;
8333- (* "-init", Arg.Unit create_bs_config ,
8334- " Create an simple bsconfig.json"
8335- ;
8336- *)
8337- regen, Arg. Set force_regenerate,
8350+ no_dev, Arg. Set Bsb_config. no_dev,
8351+ " (internal)Build dev dependencies in make-world and dev group(in combination with -regen)" ;
8352+ regen, Arg. Set force_regenerate,
83388353 " Always regenerate build.ninja no matter bsconfig.json is changed or not (for debugging purpose)"
83398354 ;
8355+ internal_package_specs, Arg. String Bsb_default. internal_override_package_specs,
8356+ " (internal)Overide package specs (in combination with -regen)" ;
83408357 " -clean-world" , Arg. Unit clean_bs_deps,
83418358 " Clean all bs dependencies" ;
8342- " -make-world" , Arg. Unit build_bs_deps ,
8359+ " -make-world" , Arg. Set make_world ,
83438360 " Build all dependencies and itself "
83448361 ]
83458362
8346- let regenerate_ninja cwd bsc_dir forced =
8363+ (* * Regenerate ninja file and return None if we dont need regenerate
8364+ otherwise return some info
8365+ *)
8366+ let regenerate_ninja cwd bsc_dir forced : Bsb_default.package_specs option =
83478367 let output_deps = Bsb_config. lib_bs // bsdeps in
83488368 let reason =
83498369 if forced then " Regenerating ninja (triggered by command line -regen)"
@@ -8361,9 +8381,11 @@ let regenerate_ninja cwd bsc_dir forced =
83618381 stamp = (Unix. stat x).st_mtime
83628382 }
83638383 )
8364- |> (fun x -> Bsb_dep_infos. store ~cwd output_deps (Array. of_list x))
8365-
8384+ |> (fun x -> Bsb_dep_infos. store ~cwd output_deps (Array. of_list x));
8385+ Some (Bsb_default. get_package_specs () )
8386+ (* This makes sense since we did parse the json file *)
83668387 end
8388+ else None
83678389
83688390let ninja_error_message = " ninja (required for bsb build system) is not installed, \n \
83698391please visit https://github.com/ninja-build/ninja to have it installed\n "
@@ -8417,7 +8439,7 @@ let () =
84178439 (* see discussion #929 *)
84188440 if Array. length Sys. argv < = 1 then
84198441 begin
8420- regenerate_ninja cwd bsc_dir false ;
8442+ ignore ( regenerate_ninja cwd bsc_dir false ) ;
84218443 ninja_command ninja [||]
84228444 end
84238445 else
@@ -8427,17 +8449,54 @@ let () =
84278449 ->
84288450 begin
84298451 Arg. parse bsb_main_flags annoymous usage;
8430- regenerate_ninja cwd bsc_dir ! force_regenerate;
8431- (* String_vec.iter (fun s -> print_endline s) targets; *)
8452+ let deps = regenerate_ninja cwd bsc_dir ! force_regenerate in
8453+ (* [-make-world] should never be combined with [-package-specs] *)
8454+ if ! make_world then
8455+ let deps =
8456+ match deps with
8457+ | None ->
8458+ let json = Ext_json. parse_json_from_file Literals. bsconfig_json in
8459+ begin match json with
8460+ | `Obj map ->
8461+ map
8462+ |? (Bsb_build_schemas. package_specs,
8463+ `Arr Bsb_default. set_package_specs_from_array)
8464+ |> ignore ;
8465+ Bsb_default. get_package_specs ()
8466+ | _ -> assert false
8467+ end
8468+ | Some spec -> spec in
8469+ build_bs_deps ( String_set. fold
8470+ (fun k acc -> k ^ " ," ^ acc ) deps Ext_string. empty ) ;
8471+ if ! watch_mode then
8472+ watch ()
84328473 (* ninja is not triggered in this case *)
84338474 end
84348475 | `Split (bsb_args,ninja_args)
84358476 ->
84368477 begin
84378478 Arg. parse_argv bsb_args bsb_main_flags annoymous usage ;
8438- (* String_vec.iter (fun s -> print_endline s) targets; *)
8439- regenerate_ninja cwd bsc_dir ! force_regenerate;
8440- ninja_command ninja ninja_args
8479+ let deps = (regenerate_ninja cwd bsc_dir ! force_regenerate) in
8480+ (* [-make-world] should never be combined with [-package-specs] *)
8481+ if ! make_world then
8482+ let deps =
8483+ match deps with
8484+ | None ->
8485+ let json = Ext_json. parse_json_from_file Literals. bsconfig_json in
8486+ begin match json with
8487+ | `Obj map ->
8488+ map
8489+ |? (Bsb_build_schemas. package_specs,
8490+ `Arr Bsb_default. set_package_specs_from_array)
8491+ |> ignore ;
8492+ Bsb_default. get_package_specs ()
8493+ | _ -> assert false
8494+ end
8495+ | Some spec -> spec in
8496+ build_bs_deps ( String_set. fold
8497+ (fun k acc -> k ^ " ," ^ acc ) deps Ext_string. empty ) ;
8498+ if ! watch_mode then watch ()
8499+ else ninja_command ninja ninja_args
84418500 end
84428501 end
84438502 (* with x ->
0 commit comments