diff --git a/jscomp/bsb/bsb_build_util.ml b/jscomp/bsb/bsb_build_util.ml index db931f8b47..73e2f72f15 100644 --- a/jscomp/bsb/bsb_build_util.ml +++ b/jscomp/bsb/bsb_build_util.ml @@ -124,7 +124,9 @@ let resolve_bsb_magic_file ~cwd ~desc p : result = mkp "/a/b/c/d" ]} *) -let rec mkp dir = +let rec mkp dir = +Bsb_log.info + "@{mkp @} dir: %s @." dir; if not (Sys.file_exists dir) then let parent_dir = Filename.dirname dir in if parent_dir = Filename.current_dir_name then @@ -178,6 +180,7 @@ let rec walk_all_deps_aux (top : bool) (dir : string) (cb : package_context -> unit) = + let () = Bsb_log.info "@{walk_all_deps_aux dir:@} %s @." dir in let bsconfig_json = dir // Literals.bsconfig_json in match Ext_json_parse.parse_json_from_file bsconfig_json with | Obj {map; loc} -> @@ -229,5 +232,31 @@ let rec walk_all_deps_aux let walk_all_deps dir cb = - let visited = String_hashtbl.create 0 in + let visited = String_hashtbl.create 0 in + Bsb_log.info "@{walk_all_deps dir:@} %s @." dir; walk_all_deps_aux visited [] true dir cb + +let build_artifacts_dir = ref None + +let get_build_artifacts_location cwd = + let () = Bsb_log.info "@{get_build_artifacts_location cwd:@} %s @." cwd in + let () = Bsb_log.info "@{get_build_artifacts_location cur__root:@} %s @." (Sys.getenv "cur__root") in + let bad = match !build_artifacts_dir with + | Some(x) -> x + | None -> "not_set" in + let () = Bsb_log.info "@{build_artifacts_dir:@} %s @." bad in + (* If the project's parent folder is not node_modules, we know it's the top level one. *) + if Sys.getenv "cur__root" = cwd then + match !build_artifacts_dir with + | None -> cwd + | Some dir -> dir + else begin + match !build_artifacts_dir with + | None -> + cwd + (* (Filename.dirname (Filename.dirname cwd)) // Bsb_config.lib_lit // Bsb_config.node_modules // project_name *) + | Some dir -> + let project_name = Filename.basename cwd in + let () = Bsb_log.info "@{build_artifacts_location:@} %s @." (dir // Bsb_config.lib_js // project_name) in + dir // Bsb_config.lib_js // project_name + end diff --git a/jscomp/bsb/bsb_build_util.mli b/jscomp/bsb/bsb_build_util.mli index 4cd099763b..cc9cd89ddb 100644 --- a/jscomp/bsb/bsb_build_util.mli +++ b/jscomp/bsb/bsb_build_util.mli @@ -96,3 +96,7 @@ type package_context = { } val walk_all_deps : string -> (package_context -> unit) -> unit + +val build_artifacts_dir : (string option) ref + +val get_build_artifacts_location : string -> string diff --git a/jscomp/bsb/bsb_clean.ml b/jscomp/bsb/bsb_clean.ml index 26773364d0..33c5ad1a9f 100644 --- a/jscomp/bsb/bsb_clean.ml +++ b/jscomp/bsb/bsb_clean.ml @@ -39,7 +39,8 @@ let ninja_clean proj_dir = Bsb_log.warn "@{ninja clean failed@} : %s @." (Printexc.to_string e) let clean_bs_garbage proj_dir = - Bsb_log.info "@{Cleaning:@} in %s@." proj_dir ; + let proj_dir = Bsb_build_util.get_build_artifacts_location proj_dir in + let () = Bsb_log.info "@{Cleaning:@} in %s@." proj_dir in let try_remove x = let x = proj_dir // x in if Sys.file_exists x then @@ -56,8 +57,7 @@ let clean_bs_garbage proj_dir = let clean_bs_deps proj_dir = Bsb_build_util.walk_all_deps proj_dir (fun pkg_cxt -> (* whether top or not always do the cleaning *) - clean_bs_garbage pkg_cxt.proj_dir + clean_bs_garbage (Bsb_build_util.get_build_artifacts_location proj_dir) ) -let clean_self proj_dir = - clean_bs_garbage proj_dir +let clean_self proj_dir = clean_bs_garbage (Bsb_build_util.get_build_artifacts_location proj_dir) diff --git a/jscomp/bsb/bsb_config.ml b/jscomp/bsb/bsb_config.ml index e468ad97e5..06a87d1582 100644 --- a/jscomp/bsb/bsb_config.ml +++ b/jscomp/bsb/bsb_config.ml @@ -45,6 +45,9 @@ let rev_lib_bs_prefix p = rev_lib_bs // p let ocaml_bin_install_prefix p = lib_ocaml // p +let lazy_build_artifacts_dir = "$build_artifacts_dir" +let build_artifacts_dir path = lazy_build_artifacts_dir // path + let lazy_src_root_dir = "$src_root_dir" let proj_rel path = lazy_src_root_dir // path @@ -56,6 +59,4 @@ let proj_rel path = lazy_src_root_dir // path - let cmd_package_specs = ref None - diff --git a/jscomp/bsb/bsb_config.mli b/jscomp/bsb/bsb_config.mli index 5725cfcca1..b144beb5de 100644 --- a/jscomp/bsb/bsb_config.mli +++ b/jscomp/bsb/bsb_config.mli @@ -24,6 +24,7 @@ val ocaml_bin_install_prefix : string -> string +val build_artifacts_dir : string -> string val proj_rel : string -> string val lib_js : string @@ -37,4 +38,3 @@ val rev_lib_bs_prefix : string -> string (** default not install, only when -make-world, its dependencies will be installed *) - diff --git a/jscomp/bsb/bsb_config_parse.ml b/jscomp/bsb/bsb_config_parse.ml index a88a1a858e..d4d1a27a44 100644 --- a/jscomp/bsb/bsb_config_parse.ml +++ b/jscomp/bsb/bsb_config_parse.ml @@ -30,7 +30,7 @@ let resolve_package cwd package_name = let x = Bsb_pkg.resolve_bs_package ~cwd package_name in { Bsb_config_types.package_name ; - package_install_path = x // Bsb_config.lib_ocaml + package_install_path = (Bsb_build_util.get_build_artifacts_location x) // Bsb_config.lib_ocaml } type json_map = Ext_json_types.t String_map.t diff --git a/jscomp/bsb/bsb_ninja_gen.ml b/jscomp/bsb/bsb_ninja_gen.ml index 5a89a3a8db..df29b38c64 100644 --- a/jscomp/bsb/bsb_ninja_gen.ml +++ b/jscomp/bsb/bsb_ninja_gen.ml @@ -120,10 +120,10 @@ let output_ninja_and_namespace_map number_of_dev_groups; } : Bsb_config_types.t) : unit = - - let cwd_lib_bs = per_proj_dir // Bsb_config.lib_bs in + let build_artifacts_dir = Bsb_build_util.get_build_artifacts_location per_proj_dir in + let cwd_lib_bs = build_artifacts_dir // Bsb_config.lib_bs in let ppx_flags = Bsb_build_util.ppx_flags ppx_files in - let oc = open_out_bin (cwd_lib_bs // Literals.build_ninja) in + let oc = open_out_bin (cwd_lib_bs // Literals.build_ninja) in let g_pkg_flg , g_ns_flg = match namespace with | None -> @@ -168,7 +168,8 @@ let output_ninja_and_namespace_map bs_dev_dependencies (fun x -> x.package_install_path)); Bsb_ninja_global_vars.g_ns , g_ns_flg ; - Bsb_build_schemas.bsb_dir_group, "0" (*TODO: avoid name conflict in the future *) + Bsb_build_schemas.bsb_dir_group, "0"; (*TODO: avoid name conflict in the future *) + Bsb_ninja_global_vars.build_artifacts_dir, build_artifacts_dir; |] oc in let bs_groups, bsc_lib_dirs, static_resources = @@ -190,6 +191,7 @@ let output_ninja_and_namespace_map let static_resources = Ext_list.fold_left bs_file_groups [] (fun (acc_resources : string list) {sources; dir; resources; dir_index} -> + let () = Bsb_log.info "@{bs_file_groups dir:@} %s @." dir in let dir_index = (dir_index :> int) in bs_groups.(dir_index) <- Bsb_db_util.merge bs_groups.(dir_index) sources ; source_dirs.(dir_index) <- dir :: source_dirs.(dir_index); @@ -244,7 +246,7 @@ let output_ninja_and_namespace_map Ext_option.iter namespace (fun ns -> let namespace_dir = - per_proj_dir // Bsb_config.lib_bs in + build_artifacts_dir // Bsb_config.lib_bs in Bsb_namespace_map_gen.output ~dir:namespace_dir ns bs_file_groups; diff --git a/jscomp/bsb/bsb_ninja_global_vars.ml b/jscomp/bsb/bsb_ninja_global_vars.ml index 611c9c3f1f..d2d2cda6b2 100644 --- a/jscomp/bsb/bsb_ninja_global_vars.ml +++ b/jscomp/bsb/bsb_ninja_global_vars.ml @@ -50,9 +50,11 @@ let g_ns = "g_ns" let warnings = "warnings" +let build_artifacts_dir = "build_artifacts_dir" + let gentypeconfig = "gentypeconfig" let g_dev_incls = "g_dev_incls" (* path to stdlib *) -let g_stdlib_incl = "g_std_incl" \ No newline at end of file +let g_stdlib_incl = "g_std_incl" diff --git a/jscomp/bsb/bsb_ninja_regen.ml b/jscomp/bsb/bsb_ninja_regen.ml index 80e378b075..df32f17cd9 100644 --- a/jscomp/bsb/bsb_ninja_regen.ml +++ b/jscomp/bsb/bsb_ninja_regen.ml @@ -34,9 +34,16 @@ let regenerate_ninja ~(toplevel_package_specs : Bsb_package_specs.t option) ~forced ~per_proj_dir : Bsb_config_types.t option = + let build_artifacts_dir = Bsb_build_util.get_build_artifacts_location per_proj_dir in let toplevel = toplevel_package_specs = None in - let lib_bs_dir = per_proj_dir // Bsb_config.lib_bs in + let lib_bs_dir = build_artifacts_dir // Bsb_config.lib_bs in let output_deps = lib_bs_dir // bsdeps in + let () = Bsb_log.info + "@{regenerate_ninja@} per_proj_dir : %s @." per_proj_dir in + let () = Bsb_log.info + "@{regenerate_ninja@} lib_bs_dir : %s @." lib_bs_dir in + let () = Bsb_log.info + "@{regenerate_ninja@} output_deps : %s @." output_deps in let check_result = Bsb_ninja_check.check ~per_proj_dir:per_proj_dir @@ -53,26 +60,32 @@ let regenerate_ninja | Other _ -> if check_result = Bsb_bsc_version_mismatch then begin Bsb_log.warn "@{Different compiler version@}: clean current repo@."; - Bsb_clean.clean_self per_proj_dir; - end ; + Bsb_clean.clean_self build_artifacts_dir; + end ; let config = Bsb_config_parse.interpret_json ~toplevel_package_specs ~per_proj_dir in + (* create directory, lib/bs, lib/js, lib/es6 etc *) - Bsb_build_util.mkp lib_bs_dir; + Bsb_build_util.mkp build_artifacts_dir; + Bsb_package_specs.list_dirs_by config.package_specs - (fun x -> - let dir = per_proj_dir // x in (*Unix.EEXIST error*) + (fun x -> + let dir = build_artifacts_dir // x in (*Unix.EEXIST error*) if not (Sys.file_exists dir) then Unix.mkdir dir 0o777); - if toplevel then - Bsb_watcher_gen.generate_sourcedirs_meta - ~name:(lib_bs_dir // Literals.sourcedirs_meta) - config.file_groups + if toplevel then + begin + Bsb_log.info "@{toplevel@} %s @." (lib_bs_dir // Literals.sourcedirs_meta); + Bsb_watcher_gen.generate_sourcedirs_meta + ~name:(lib_bs_dir // Literals.sourcedirs_meta) + config.file_groups + end ; - Bsb_merlin_gen.merlin_file_gen ~per_proj_dir - (Bsb_global_paths.vendor_bsppx) config; + + (*Bsb_merlin_gen.merlin_file_gen ~per_proj_dir + (Bsb_global_paths.vendor_bsppx) config;*) Bsb_ninja_gen.output_ninja_and_namespace_map ~per_proj_dir ~toplevel config ; @@ -81,5 +94,3 @@ let regenerate_ninja Bsb_ninja_check.record ~per_proj_dir ~file:output_deps (Literals.bsconfig_json::config.file_groups.globbed_dirs) ; Some config - - diff --git a/jscomp/bsb/bsb_package_specs.ml b/jscomp/bsb/bsb_package_specs.ml index 78539536d6..2986645083 100644 --- a/jscomp/bsb/bsb_package_specs.ml +++ b/jscomp/bsb/bsb_package_specs.ml @@ -131,8 +131,7 @@ let package_flag ({format; in_source } : spec) dir = (Ext_string.concat3 (string_of_format format) Ext_string.single_colon - (if in_source then dir else - prefix_of_format format // dir)) + dir) let package_flag_of_package_specs (package_specs : t) (dirname : string ) : string = @@ -161,7 +160,7 @@ let get_list_of_output_js output_file_sans_extension (if bs_suffix then Literals.suffix_bs_js else Literals.suffix_js) in - (Bsb_config.proj_rel @@ (if spec.in_source then basename + (Bsb_config.build_artifacts_dir @@ (if spec.in_source then basename else prefix_of_format spec.format // basename)) :: acc ) package_specs [] @@ -174,4 +173,4 @@ let list_dirs_by Spec_set.iter (fun (spec : spec) -> if not spec.in_source then f (prefix_of_format spec.format) - ) package_specs \ No newline at end of file + ) package_specs diff --git a/jscomp/bsb/bsb_parse_sources.ml b/jscomp/bsb/bsb_parse_sources.ml index 818ac24cb5..e90d22c91f 100644 --- a/jscomp/bsb/bsb_parse_sources.ml +++ b/jscomp/bsb/bsb_parse_sources.ml @@ -501,4 +501,3 @@ let clean_re_js root = end | _ -> () | exception _ -> () - \ No newline at end of file diff --git a/jscomp/bsb/bsb_world.ml b/jscomp/bsb/bsb_world.ml index 154598f7ad..a797dce5e5 100644 --- a/jscomp/bsb/bsb_world.ml +++ b/jscomp/bsb/bsb_world.ml @@ -68,15 +68,17 @@ let build_bs_deps cwd (deps : Bsb_package_specs.t) (ninja_args : string array) = in Bsb_build_util.walk_all_deps cwd (fun {top; proj_dir} -> if not top then - begin + begin + let () = Bsb_log.info "@{build_bs_deps proj_dir:@} %s @." proj_dir in let config_opt = Bsb_ninja_regen.regenerate_ninja ~toplevel_package_specs:(Some deps) ~forced:true ~per_proj_dir:proj_dir in (* set true to force regenrate ninja file so we have [config_opt]*) + let build_artifacts_dir = Bsb_build_util.get_build_artifacts_location proj_dir in let command = {Bsb_unix.cmd = vendor_ninja; - cwd = proj_dir // Bsb_config.lib_bs; + cwd = build_artifacts_dir // Bsb_config.lib_bs; args } in let eid = @@ -89,7 +91,7 @@ let build_bs_deps cwd (deps : Bsb_package_specs.t) (ninja_args : string array) = Note that we can check if ninja print "no work to do", then don't need reinstall more *) - Ext_option.iter config_opt (install_targets proj_dir); + Ext_option.iter config_opt (install_targets build_artifacts_dir); end ) @@ -105,4 +107,4 @@ let make_world_deps cwd (config : Bsb_config_types.t option) (ninja_args : strin *) Bsb_config_parse.package_specs_from_bsconfig () | Some config -> config.package_specs in - build_bs_deps cwd deps ninja_args \ No newline at end of file + build_bs_deps cwd deps ninja_args diff --git a/jscomp/main/bsb_main.ml b/jscomp/main/bsb_main.ml index 8e456fd662..65baea2b38 100644 --- a/jscomp/main/bsb_main.ml +++ b/jscomp/main/bsb_main.ml @@ -89,22 +89,22 @@ let exec_command_then_exit command = exit (Sys.command command ) (* Execute the underlying ninja build call, then exit (as opposed to keep watching) *) -let ninja_command_exit ninja_args = +let ninja_command_exit cwd ninja_args = let ninja_args_len = Array.length ninja_args in if Ext_sys.is_windows_or_cygwin then let path_ninja = Filename.quote Bsb_global_paths.vendor_ninja in exec_command_then_exit (if ninja_args_len = 0 then Ext_string.inter3 - path_ninja "-C" Bsb_config.lib_bs + path_ninja "-C" (cwd // Bsb_config.lib_bs) else let args = Array.append - [| path_ninja ; "-C"; Bsb_config.lib_bs|] + [| path_ninja ; "-C"; cwd // Bsb_config.lib_bs|] ninja_args in Ext_string.concat_array Ext_string.single_space args) else - let ninja_common_args = [|"ninja.exe"; "-C"; Bsb_config.lib_bs |] in + let ninja_common_args = [|"ninja.exe"; "-C"; cwd // Bsb_config.lib_bs |] in let args = if ninja_args_len = 0 then ninja_common_args else Array.append ninja_common_args ninja_args in @@ -160,6 +160,9 @@ let install_target config_opt = (* see discussion #929, if we catch the exception, we don't have stacktrace... *) let () = + let getenv_opt env = try Some(Sys.getenv env) + with | Not_found -> None in + let () = Bsb_build_util.build_artifacts_dir := getenv_opt "cur__target_dir" in try begin match Sys.argv with | [| _ |] -> (* specialize this path [bsb.exe] which is used in watcher *) @@ -167,7 +170,7 @@ let () = ~toplevel_package_specs:None ~forced:false ~per_proj_dir:Bsb_global_paths.cwd |> ignore; - ninja_command_exit [||] + ninja_command_exit (Bsb_build_util.get_build_artifacts_location Bsb_global_paths.cwd) [||] | argv -> begin @@ -208,7 +211,7 @@ let () = [bsb -regen ] *) end else if make_world then begin - ninja_command_exit [||] + ninja_command_exit (Bsb_build_util.get_build_artifacts_location Bsb_global_paths.cwd) [||] end else if do_install then begin install_target config_opt end) @@ -228,7 +231,7 @@ let () = if !do_install then install_target config_opt; if !watch_mode then program_exit () - else ninja_command_exit ninja_args + else ninja_command_exit (Bsb_build_util.get_build_artifacts_location Bsb_global_paths.cwd) ninja_args end end end