From 4cdf5984465cd28ffdc7e06110d0c4c6818a369f Mon Sep 17 00:00:00 2001 From: Antonio Nuno Monteiro Date: Wed, 22 Feb 2023 13:52:13 -0800 Subject: [PATCH] fix(melange): unify public libraries (in-workspace vs external) Signed-off-by: Antonio Nuno Monteiro --- src/dune_rules/melange/melange_rules.ml | 12 +----- src/dune_rules/module_compilation.ml | 41 +++++++++++++------ .../test-cases/melange/public.t/run.t | 6 +-- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/dune_rules/melange/melange_rules.ml b/src/dune_rules/melange/melange_rules.ml index 14cab7610ab..d0c30cdfacb 100644 --- a/src/dune_rules/melange/melange_rules.ml +++ b/src/dune_rules/melange/melange_rules.ml @@ -20,23 +20,13 @@ let output_of_lib ~target_dir lib = let info = Lib.info lib in match Lib_info.status info with | Private _ -> `Private_library_or_emit target_dir - | Installed | Installed_private -> + | Installed | Installed_private | Public _ -> let lib_name = Lib_info.name info in let src_dir = Lib_info.src_dir info in `Public_library ( src_dir , Path.Build.L.relative target_dir [ "node_modules"; Lib_name.to_string lib_name ] ) - | Public _ -> - let lib_name = Lib_info.name info in - let src_dir = Lib_info.src_dir info in - `Public_library - ( src_dir - , Path.Build.L.relative target_dir - [ "node_modules" - ; Lib_name.to_string lib_name - ; Path.Source.to_string (Path.drop_build_context_exn src_dir) - ] ) let make_js_name ~js_ext ~output m = let basename = Melange.js_basename m ^ js_ext in diff --git a/src/dune_rules/module_compilation.ml b/src/dune_rules/module_compilation.ml index e771c83d837..666c5076383 100644 --- a/src/dune_rules/module_compilation.ml +++ b/src/dune_rules/module_compilation.ml @@ -49,21 +49,39 @@ let copy_interface ~sctx ~dir ~obj_dir ~cm_kind m = (Path.build (Obj_dir.Module.cm_file_exn obj_dir m ~kind:cmi_kind)) ~dst:(Obj_dir.Module.cm_public_file_exn obj_dir m ~kind:cmi_kind))) -let melange_args (cm_kind : Lib_mode.Cm_kind.t) lib_name module_ = +let melange_args (cctx : Compilation_context.t) (cm_kind : Lib_mode.Cm_kind.t) + module_ = match cm_kind with | Ocaml (Cmi | Cmo | Cmx) | Melange Cmi -> [] | Melange Cmj -> - let bs_package_name = - match lib_name with - | None -> [] + let bs_package_name, bs_package_output = + let package_output = + Module.file ~ml_kind:Impl module_ |> Option.value_exn |> Path.parent_exn + in + match Compilation_context.public_lib_name cctx with + | None -> ([], package_output) | Some lib_name -> - [ Command.Args.A "--bs-package-name"; A (Lib_name.to_string lib_name) ] - in - let package_output = - Module.file ~ml_kind:Impl module_ |> Option.value_exn |> Path.parent_exn + let dir = + let package_output = Path.as_in_build_dir_exn package_output in + let lib_root_dir = + Path.Build.to_string (Compilation_context.dir cctx) + in + let src_dir = Path.Build.to_string package_output in + let build_dir = + (Compilation_context.super_context cctx |> Super_context.context) + .build_dir + in + String.drop_prefix src_dir ~prefix:lib_root_dir + |> Option.value_exn + |> String.drop_prefix_if_exists ~prefix:"/" + |> Path.Build.relative build_dir + in + + ( [ Command.Args.A "--bs-package-name"; A (Lib_name.to_string lib_name) ] + , Path.build dir ) in Command.Args.A "--bs-stop-after-cmj" :: A "--bs-package-output" - :: Command.Args.Path package_output :: A "--bs-module-name" + :: Command.Args.Path bs_package_output :: A "--bs-module-name" :: A (Melange.js_basename module_) :: bs_package_name @@ -238,10 +256,7 @@ let build_cm cctx ~force_write_cmi ~precompiled_cmi ~cm_kind (m : Module.t) ; Command.Args.as_any (Lib_mode.Cm_kind.Map.get (CC.includes cctx) cm_kind) ; As extra_args - ; S - (melange_args cm_kind - (Compilation_context.public_lib_name cctx) - m) + ; S (melange_args cctx cm_kind m) ; A "-no-alias-deps" ; opaque_arg ; As (Fdo.phase_flags phase) diff --git a/test/blackbox-tests/test-cases/melange/public.t/run.t b/test/blackbox-tests/test-cases/melange/public.t/run.t index 17a224923b0..4d98469115e 100644 --- a/test/blackbox-tests/test-cases/melange/public.t/run.t +++ b/test/blackbox-tests/test-cases/melange/public.t/run.t @@ -4,7 +4,7 @@ Cmj rules should include --bs-package-output $ dune rules my_project/app/.app.objs/melange/app.cmj | > grep -e "--bs-package-output" --after-context=1 --bs-package-output - my_project/app + . Cmj rules should include --bs-package-name $ dune rules my_project/app/.app.objs/melange/app.cmj | @@ -15,13 +15,13 @@ Cmj rules should include --bs-package-name $ output=my_project/output Js rules should include --bs-module-type - $ dune rules $output/node_modules/pkg.app/my_project/app/b.js | + $ dune rules $output/node_modules/pkg.app/b.js | > grep -e "--bs-module-type" --after-context=1 --bs-module-type commonjs Js rules should include --bs-package-name - $ dune rules $output/node_modules/pkg.app/my_project/app/b.js | + $ dune rules $output/node_modules/pkg.app/b.js | > grep -e "--bs-package-name" --after-context=1 --bs-package-name pkg