@@ -7926,6 +7926,10 @@ val run_commands : command list -> unit
7926
7926
val run_command_execv : bool -> command -> unit
7927
7927
7928
7928
(* val run_command_execvp : command -> unit *)
7929
+
7930
+ val remove_dirs_recursive : string -> string array -> unit
7931
+
7932
+ val remove_dir_recursive : string -> unit
7929
7933
end = struct
7930
7934
#1 " bsb_unix.ml"
7931
7935
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -8041,12 +8045,40 @@ let run_command_execv fail_exit cmd =
8041
8045
prerr_endline (" * Failure : " ^ cmd.cmd ^ " \n * Location: " ^ cmd.cwd);
8042
8046
if fail_exit then exit eid
8043
8047
end ;
8044
-
8048
+
8045
8049
| Unix. WSIGNALED _ | Unix. WSTOPPED _ ->
8046
8050
begin
8047
8051
prerr_endline (cmd.cmd ^ " interrupted" );
8048
8052
exit 2
8049
8053
end
8054
+
8055
+ (* * it assume you have permissions, so always catch it to fail
8056
+ gracefully
8057
+ *)
8058
+ let rec remove_dirs_recursive cwd roots =
8059
+ Array. iter
8060
+ (fun root ->
8061
+ let cur = Filename. concat cwd root in
8062
+ if Sys. is_directory cur then
8063
+ begin
8064
+ remove_dirs_recursive cur (Sys. readdir cur);
8065
+ Unix. rmdir cur ;
8066
+ end
8067
+ else
8068
+ Sys. remove cur
8069
+ )
8070
+ roots
8071
+
8072
+ let rec remove_dir_recursive dir =
8073
+ if Sys. is_directory dir then
8074
+ begin
8075
+ let files = Sys. readdir dir in
8076
+ for i = 0 to Array. length files - 1 do
8077
+ remove_dir_recursive (Filename. concat dir (Array. unsafe_get files i))
8078
+ done ;
8079
+ Unix. rmdir dir
8080
+ end
8081
+ else Sys. remove dir
8050
8082
(*
8051
8083
let () =
8052
8084
run_commands
@@ -8148,7 +8180,7 @@ let revise_merlin new_content =
8148
8180
let write_ninja_file bsc_dir cwd =
8149
8181
let builddir = Bsb_config. lib_bs in
8150
8182
let () = Bsb_build_util. mkp builddir in
8151
- let bsc, bsdep, bsppx =
8183
+ let bsc, bsdep, bsppx =
8152
8184
bsc_dir // " bsc.exe" ,
8153
8185
bsc_dir // " bsb_helper.exe" ,
8154
8186
bsc_dir // " bsppx.exe" in
@@ -8173,7 +8205,7 @@ let write_ninja_file bsc_dir cwd =
8173
8205
S %s\n \
8174
8206
B %s\n \
8175
8207
FLG -ppx %s\n \
8176
- " lib_ocaml_dir lib_ocaml_dir bsppx
8208
+ " lib_ocaml_dir lib_ocaml_dir bsppx
8177
8209
) in
8178
8210
let () =
8179
8211
match Bsb_default. get_bsc_flags () with
@@ -8185,7 +8217,7 @@ let write_ninja_file bsc_dir cwd =
8185
8217
Bsb_default. get_bs_dependencies ()
8186
8218
|> List. iter (fun package ->
8187
8219
let path = (Bsb_default. resolve_bsb_magic_file ~cwd ~desc: " dependecies"
8188
- (package ^ " /" )// " lib" // " ocaml" ) in
8220
+ (package ^ " /" )// " lib" // " ocaml" ) in
8189
8221
Buffer. add_string buffer " \n S " ;
8190
8222
Buffer. add_string buffer path ;
8191
8223
Buffer. add_string buffer " \n B " ;
@@ -8303,6 +8335,7 @@ let cwd = Sys.getcwd ()
8303
8335
8304
8336
8305
8337
let watch () =
8338
+ print_endline " \n Start Watching now " ;
8306
8339
let bsb_watcher =
8307
8340
Bsb_build_util. get_bsc_dir cwd // " bsb_watcher.js" in
8308
8341
let bsb_watcher =
@@ -8321,36 +8354,54 @@ let separator = "--"
8321
8354
8322
8355
let internal_package_specs = " -internal-package-specs"
8323
8356
let build_bs_deps package_specs =
8324
- let bsc_dir = Bsb_build_util. get_bsc_dir cwd in
8325
- let bsb_exe = bsc_dir // " bsb.exe" in
8326
- Bsb_default. walk_all_deps true cwd
8357
+ let bsc_dir = Bsb_build_util. get_bsc_dir cwd in
8358
+ let bsb_exe = bsc_dir // " bsb.exe" in
8359
+ Bsb_default. walk_all_deps true cwd
8327
8360
(fun top cwd ->
8328
- if not top then
8329
- Bsb_unix. run_command_execv true
8330
- {cmd = bsb_exe; cwd = cwd; args =
8331
- [| bsb_exe ; no_dev; internal_package_specs; package_specs; regen; separator |]})
8361
+ if not top then
8362
+ Bsb_unix. run_command_execv true
8363
+ {cmd = bsb_exe; cwd = cwd; args =
8364
+ [| bsb_exe ; no_dev; internal_package_specs; package_specs; regen; separator |]})
8332
8365
8333
- let clean_bs_deps () =
8334
- let bsc_dir = Bsb_build_util. get_bsc_dir cwd in
8335
- let bsb_exe = bsc_dir // " bsb.exe" in
8336
- Bsb_default. walk_all_deps true cwd
8337
- (fun top cwd -> Bsb_unix. run_command_execv (not top)
8338
- {cmd = bsb_exe; cwd = cwd; args = [| bsb_exe ; separator; " -t" ; " clean" |]})
8339
8366
let annoymous filename =
8340
8367
String_vec. push filename targets
8341
8368
8342
8369
let watch_mode = ref false
8343
8370
let make_world = ref false
8344
8371
8345
-
8372
+ let lib_bs = " lib" // " bs"
8373
+ let lib_amdjs = " lib" // " amdjs"
8374
+ let lib_goog = " lib" // " goog"
8375
+ let lib_js = " lib" // " js"
8376
+
8377
+ let clean_bs_garbage cwd =
8378
+ print_string " Doing cleaning in " ;
8379
+ print_endline cwd;
8380
+ let aux x =
8381
+ let x = (cwd // x) in
8382
+ if Sys. file_exists x then
8383
+ Bsb_unix. remove_dir_recursive x in
8384
+ try
8385
+ aux lib_bs ;
8386
+ aux lib_amdjs ;
8387
+ aux lib_goog;
8388
+ aux lib_js
8389
+ with
8390
+ e ->
8391
+ prerr_endline (" Failed to clean due to " ^ Printexc. to_string e)
8392
+
8393
+ let clean_bs_deps () =
8394
+ Bsb_default. walk_all_deps true cwd (fun top cwd ->
8395
+ clean_bs_garbage cwd
8396
+ )
8346
8397
let bsb_main_flags =
8347
8398
[
8348
8399
" -w" , Arg. Set watch_mode,
8349
8400
" Watch mode" ;
8350
8401
no_dev, Arg. Set Bsb_config. no_dev,
8351
8402
" (internal)Build dev dependencies in make-world and dev group(in combination with -regen)" ;
8352
8403
regen, Arg. Set force_regenerate,
8353
- " Always regenerate build.ninja no matter bsconfig.json is changed or not (for debugging purpose)"
8404
+ " Always regenerate build.ninja no matter bsconfig.json is changed or not (for debugging purpose)"
8354
8405
;
8355
8406
internal_package_specs, Arg. String Bsb_default. internal_override_package_specs,
8356
8407
" (internal)Overide package specs (in combination with -regen)" ;
@@ -8361,7 +8412,7 @@ let bsb_main_flags =
8361
8412
]
8362
8413
8363
8414
(* * Regenerate ninja file and return None if we dont need regenerate
8364
- otherwise return some info
8415
+ otherwise return some info
8365
8416
*)
8366
8417
let regenerate_ninja cwd bsc_dir forced : Bsb_default.package_specs option =
8367
8418
let output_deps = Bsb_config. lib_bs // bsdeps in
@@ -8388,31 +8439,43 @@ let regenerate_ninja cwd bsc_dir forced : Bsb_default.package_specs option =
8388
8439
else None
8389
8440
8390
8441
let ninja_error_message = " ninja (required for bsb build system) is not installed, \n \
8391
- please visit https://github.com/ninja-build/ninja to have it installed\n "
8442
+ please visit https://github.com/ninja-build/ninja to have it installed\n "
8392
8443
let () =
8393
8444
Printexc. register_printer (function
8394
- | Unix. Unix_error (Unix. ENOENT, "execvp" , "ninja" ) ->
8395
- Some ninja_error_message
8396
- | _ -> None
8397
- )
8445
+ | Unix. Unix_error (Unix. ENOENT, "execvp" , "ninja" ) ->
8446
+ Some ninja_error_message
8447
+ | _ -> None
8448
+ )
8449
+
8450
+ let print_string_args (args : string array ) =
8451
+ for i = 0 to Array. length args - 1 do
8452
+ print_string (Array. unsafe_get args i) ;
8453
+ print_string " " ;
8454
+ done ;
8455
+ print_newline ()
8398
8456
8399
-
8400
8457
(* Note that [keepdepfile] only makes sense when combined with [deps] for optimizatoin *)
8401
8458
let ninja_command ninja ninja_args =
8402
8459
let ninja_args_len = Array. length ninja_args in
8403
8460
if ninja_args_len = 0 then
8404
- Unix. execvp ninja [|" ninja" ; " -C" ; Bsb_config. lib_bs |]
8461
+ begin
8462
+ let args = [|" ninja" ; " -C" ; Bsb_config. lib_bs |] in
8463
+ print_string_args args ;
8464
+ Unix. execvp ninja args
8465
+ end
8405
8466
else
8406
8467
let fixed_args_length = 3 in
8407
- begin Unix. execvp ninja
8408
- (Array. init (fixed_args_length + ninja_args_len)
8409
- (fun i -> match i with
8410
- | 0 -> " ninja"
8411
- | 1 -> " -C"
8412
- | 2 -> Bsb_config. lib_bs
8413
- | _ -> Array. unsafe_get ninja_args (i - fixed_args_length) ))
8414
- end
8415
-
8468
+ let args = (Array. init (fixed_args_length + ninja_args_len)
8469
+ (fun i -> match i with
8470
+ | 0 -> " ninja"
8471
+ | 1 -> " -C"
8472
+ | 2 -> Bsb_config. lib_bs
8473
+ | _ -> Array. unsafe_get ninja_args (i - fixed_args_length) )) in
8474
+ print_string_args args ;
8475
+ Unix. execvp ninja args
8476
+
8477
+
8478
+
8416
8479
(* *
8417
8480
Cache files generated:
8418
8481
- .bsdircache in project root dir
@@ -8427,80 +8490,76 @@ let usage = "Usage : bsb.exe <bsb-options> <files> -- <ninja_options>\n\
8427
8490
It is always recommended to run ninja via bsb.exe \n \
8428
8491
Bsb options are:"
8429
8492
8493
+
8494
+ (*
8495
+ let bsb_exe = bsc_dir // "bsb.exe" in
8496
+ Bsb_default.walk_all_deps true cwd
8497
+ (fun top cwd -> Bsb_unix.run_command_execv (not top)
8498
+ {cmd = bsb_exe; cwd = cwd; args = [| bsb_exe ; separator; "-t" ; "clean"|]})
8499
+ *)
8500
+ let make_world_deps deps =
8501
+ print_endline " \n Making the dependency world!" ;
8502
+ let deps =
8503
+ match deps with
8504
+ | None ->
8505
+ let json = Ext_json. parse_json_from_file Literals. bsconfig_json in
8506
+ begin match json with
8507
+ | `Obj map ->
8508
+ map
8509
+ |? (Bsb_build_schemas. package_specs,
8510
+ `Arr Bsb_default. set_package_specs_from_array)
8511
+ |> ignore ;
8512
+ Bsb_default. get_package_specs ()
8513
+ | _ -> assert false
8514
+ end
8515
+ | Some spec -> spec in
8516
+ build_bs_deps ( String_set. fold
8517
+ (fun k acc -> k ^ " ," ^ acc ) deps Ext_string. empty )
8430
8518
let () =
8431
8519
let bsc_dir = Bsb_build_util. get_bsc_dir cwd in
8432
8520
let ninja =
8433
8521
if Sys. win32 then
8434
8522
bsc_dir // " ninja.exe"
8435
8523
else
8436
8524
" ninja"
8437
- in
8525
+ in
8438
8526
(* try *)
8439
- (* see discussion #929 *)
8440
- if Array. length Sys. argv < = 1 then
8441
- begin
8442
- ignore (regenerate_ninja cwd bsc_dir false );
8443
- ninja_command ninja [||]
8444
- end
8445
- else
8446
- begin
8447
- match Ext_array. find_and_split Sys. argv Ext_string. equal " --" with
8448
- | `No_split
8449
- ->
8450
- begin
8451
- Arg. parse bsb_main_flags annoymous usage;
8527
+ (* see discussion #929 *)
8528
+ if Array. length Sys. argv < = 1 then
8529
+ begin
8530
+ ignore (regenerate_ninja cwd bsc_dir false );
8531
+ ninja_command ninja [||]
8532
+ end
8533
+ else
8534
+ begin
8535
+ match Ext_array. find_and_split Sys. argv Ext_string. equal " --" with
8536
+ | `No_split
8537
+ ->
8538
+ begin
8539
+ Arg. parse bsb_main_flags annoymous usage;
8540
+ (* [-make-world] should never be combined with [-package-specs] *)
8541
+ if ! make_world then
8542
+ (* don't regenerate files when we only run [bsb -clean-world] *)
8452
8543
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 ()
8544
+ make_world_deps deps ;
8545
+ if ! watch_mode then
8546
+ watch ()
8473
8547
(* ninja is not triggered in this case *)
8474
- end
8475
- | `Split (bsb_args,ninja_args)
8476
- ->
8477
- begin
8478
- Arg. parse_argv bsb_args bsb_main_flags annoymous usage ;
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
8500
- end
8501
- end
8502
- (* with x ->
8503
- prerr_endline @@ Printexc.to_string x ;
8504
- exit 2*)
8505
- (* with [try, with], there is no stacktrace anymore .. *)
8548
+ end
8549
+ | `Split (bsb_args,ninja_args)
8550
+ ->
8551
+ begin
8552
+ Arg. parse_argv bsb_args bsb_main_flags annoymous usage ;
8553
+ let deps = (regenerate_ninja cwd bsc_dir ! force_regenerate) in
8554
+ (* [-make-world] should never be combined with [-package-specs] *)
8555
+ if ! make_world then
8556
+ make_world_deps deps ;
8557
+ if ! watch_mode then watch ()
8558
+ else ninja_command ninja ninja_args
8559
+ end
8560
+ end
8561
+ (* with x ->
8562
+ prerr_endline @@ Printexc.to_string x ;
8563
+ exit 2*)
8564
+ (* with [try, with], there is no stacktrace anymore .. *)
8506
8565
end
0 commit comments