diff --git a/src/dune_rules/dune_package.ml b/src/dune_rules/dune_package.ml index 2accf9909f1..fed163cffcc 100644 --- a/src/dune_rules/dune_package.ml +++ b/src/dune_rules/dune_package.ml @@ -90,7 +90,7 @@ module Lib = struct ; field_o "default_implementation" (no_loc Lib_name.encode) default_implementation ; field_o "main_module_name" Module_name.encode main_module_name - ; field_l "modes" sexp (Mode.Dict.Set.encode modes.ocaml) + ; field_l "modes" sexp (Lib_mode.Map.Set.encode modes) ; field_l "obj_dir" sexp (Obj_dir.encode obj_dir) ; field_o "modules" Modules.encode modules ; field_o "special_builtin_support" @@ -131,7 +131,7 @@ module Lib = struct in let+ synopsis = field_o "synopsis" string and+ loc = loc - and+ modes = field_l "modes" Mode.decode + and+ modes = field_l "modes" Lib_mode.decode and+ kind = field "kind" Lib_kind.decode and+ archives = mode_paths "archives" and+ plugins = mode_paths "plugins" @@ -165,7 +165,7 @@ module Lib = struct and+ instrumentation_backend = field_o "instrumentation.backend" (located Lib_name.decode) in - let modes = Mode.Dict.Set.of_list modes in + let modes = Lib_mode.Map.Set.of_list modes in let entry_modules = Modules.entry_modules modules |> List.map ~f:Module.name in @@ -190,7 +190,6 @@ module Lib = struct Some (Lib_info.Inherited.This (Modules.wrapped modules)) in let entry_modules = Lib_info.Source.External (Ok entry_modules) in - let modes = { Lib_mode.Map.ocaml = modes; melange = false } in let modules = Lib_info.Source.External (Some modules) in Lib_info.create ~path_kind:External ~loc ~name ~kind ~status ~src_dir ~orig_src_dir ~obj_dir ~version ~synopsis ~main_module_name diff --git a/src/dune_rules/install_rules.ml b/src/dune_rules/install_rules.ml index 5a97fd7a410..ce1c2e50302 100644 --- a/src/dune_rules/install_rules.ml +++ b/src/dune_rules/install_rules.ml @@ -134,8 +134,8 @@ end = struct make_entry Lib source ?dst)) in let { Lib_config.has_native; ext_obj; _ } = lib_config in - let modes = Dune_file.Mode_conf.Set.eval lib.modes.ocaml ~has_native in - let { Mode.Dict.byte; native } = modes in + let modes = Dune_file.Mode_conf.Lib.Set.eval lib.modes ~has_native in + let { Lib_mode.Map.ocaml = { Mode.Dict.byte; native }; melange } = modes in let module_files = let inside_subdir f = match lib_subdir with @@ -147,30 +147,30 @@ end = struct in let cm_dir m cm_kind = let visibility = Module.visibility m in - let dir' = Obj_dir.cm_dir external_obj_dir (Ocaml cm_kind) visibility in + let dir' = Obj_dir.cm_dir external_obj_dir cm_kind visibility in if Path.equal (Path.build dir) dir' then None else Path.basename dir' |> inside_subdir |> Option.some in let virtual_library = Library.is_virtual lib in + let if_ b (cm_kind, f) = + if b then + match f with + | None -> [] + | Some f -> [ (cm_kind, f) ] + else [] + in let modules = let common m = - let cm_file kind = - Obj_dir.Module.cm_file obj_dir m ~kind:(Ocaml kind) - in - let if_ b (cm_kind, f) = - if b then - match f with - | None -> [] - | Some f -> [ (cm_kind, f) ] - else [] - in - let open Cm_kind in - [ if_ true (Cmi, cm_file Cmi) - ; if_ native (Cmx, cm_file Cmx) - ; if_ (byte && virtual_library) (Cmo, cm_file Cmo) + let cm_file kind = Obj_dir.Module.cm_file obj_dir m ~kind in + let open Lib_mode.Cm_kind in + [ if_ (native || byte) (Ocaml Cmi, cm_file (Ocaml Cmi)) + ; if_ native (Ocaml Cmx, cm_file (Ocaml Cmx)) + ; if_ (byte && virtual_library) (Ocaml Cmo, cm_file (Ocaml Cmo)) ; if_ (native && virtual_library) - (Cmx, Obj_dir.Module.o_file obj_dir m ~ext_obj) + (Ocaml Cmx, Obj_dir.Module.o_file obj_dir m ~ext_obj) + ; if_ melange (Melange Cmi, cm_file (Melange Cmi)) + ; if_ melange (Melange Cmj, cm_file (Melange Cmj)) ] |> List.concat in @@ -179,15 +179,19 @@ end = struct in let modules_impl = List.concat_map installable_modules.impl ~f:(fun m -> - common m - @ List.filter_map Ml_kind.all ~f:(fun ml_kind -> - let open Option.O in - let+ cmt = - Obj_dir.Module.cmt_file obj_dir m ~ml_kind - ~cm_kind:(Ocaml Cmi) - in - (Cm_kind.Cmi, cmt)) - |> set_dir m) + let cmt_files = + List.concat_map Ml_kind.all ~f:(fun ml_kind -> + let open Lib_mode.Cm_kind in + List.concat_map + [ (native || byte, Ocaml Cmi); (melange, Melange Cmi) ] + ~f:(fun (condition, kind) -> + if_ condition + ( kind + , Obj_dir.Module.cmt_file obj_dir m ~ml_kind + ~cm_kind:kind ))) + in + + common m @ cmt_files |> set_dir m) in let modules_vlib = List.concat_map installable_modules.vlib ~f:(fun m -> @@ -199,7 +203,10 @@ end = struct in let* lib_files, dll_files = let+ lib_files = lib_files ~dir ~dir_contents ~lib_config info in - let dll_files = dll_files ~modes ~dynlink:lib.dynlink ~ctx info in + let dll_files = + let modes = modes.ocaml in + dll_files ~modes ~dynlink:lib.dynlink ~ctx info + in (lib_files, dll_files) in let+ execs = lib_ppxs ctx ~scope ~lib in diff --git a/src/dune_rules/lib_mode.ml b/src/dune_rules/lib_mode.ml index 881ad138356..c15ee007bb6 100644 --- a/src/dune_rules/lib_mode.ml +++ b/src/dune_rules/lib_mode.ml @@ -1,7 +1,28 @@ +open Stdune + type t = | Ocaml of Ocaml.Mode.t | Melange +let equal x y = + match (x, y) with + | Ocaml o1, Ocaml o2 -> Ocaml.Mode.equal o1 o2 + | Ocaml _, _ | _, Ocaml _ -> false + | Melange, Melange -> true + +let decode = + let open Dune_sexp.Decoder in + enum [ ("byte", Ocaml Byte); ("native", Ocaml Native); ("melange", Melange) ] + +let choose byte native melange = function + | Ocaml Byte -> byte + | Ocaml Native -> native + | Melange -> melange + +let to_string = choose "byte" "native" "melange" + +let encode t = Dune_sexp.Encoder.string (to_string t) + module Cm_kind = struct type t = | Ocaml of Ocaml.Cm_kind.t @@ -51,6 +72,8 @@ let of_cm_kind : Cm_kind.t -> t = function | Melange (Cmi | Cmj) -> Melange module Map = struct + let mode_equal = equal + type 'a t = { ocaml : 'a Ocaml.Mode.Dict.t ; melange : 'a @@ -83,6 +106,23 @@ module Map = struct let equal = equal Bool.equal + let to_list (t : t) = + let l = [] in + let l = if t.ocaml.native then Ocaml Native :: l else l in + let l = if t.ocaml.byte then Ocaml Byte :: l else l in + let l = if t.melange then Melange :: l else l in + l + + let encode t = List.map ~f:encode (to_list t) + + let of_list l = + { ocaml = + { byte = List.mem l (Ocaml Byte) ~equal:mode_equal + ; native = List.mem l (Ocaml Native) ~equal:mode_equal + } + ; melange = List.mem l Melange ~equal:mode_equal + } + let to_dyn { ocaml; melange } = let open Dyn in record diff --git a/src/dune_rules/lib_mode.mli b/src/dune_rules/lib_mode.mli index bf9a3858997..03112e68197 100644 --- a/src/dune_rules/lib_mode.mli +++ b/src/dune_rules/lib_mode.mli @@ -2,6 +2,8 @@ type t = | Ocaml of Ocaml.Mode.t | Melange +val decode : t Dune_sexp.Decoder.t + module Cm_kind : sig type t = | Ocaml of Ocaml.Cm_kind.t @@ -54,6 +56,10 @@ module Map : sig module Set : sig type nonrec t = bool t + val encode : t -> Dune_sexp.t list + + val of_list : mode list -> t + val to_dyn : t -> Dyn.t val equal : t -> t -> bool diff --git a/src/dune_rules/melange.ml b/src/dune_rules/melange.ml index 39da8cff45e..d6a034c891b 100644 --- a/src/dune_rules/melange.ml +++ b/src/dune_rules/melange.ml @@ -39,6 +39,10 @@ module Cm_kind = struct end end +module Install = struct + let dir = "melange" +end + let js_basename m = match Module.file ~ml_kind:Impl m with | Some s -> ( diff --git a/src/dune_rules/melange.mli b/src/dune_rules/melange.mli index e0c41fd17ed..a8f5dfdb9de 100644 --- a/src/dune_rules/melange.mli +++ b/src/dune_rules/melange.mli @@ -29,4 +29,8 @@ module Cm_kind : sig end end +module Install : sig + val dir : string +end + val js_basename : Module.t -> Filename.t diff --git a/src/dune_rules/melange_rules.ml b/src/dune_rules/melange_rules.ml index e57b0f0ab54..eaff4db7aeb 100644 --- a/src/dune_rules/melange_rules.ml +++ b/src/dune_rules/melange_rules.ml @@ -16,7 +16,30 @@ let ocaml_flags sctx ~dir melange = let ocaml_version = (Super_context.context sctx).version in Super_context.with_vendored_flags ~ocaml_version flags -let lib_output_dir ~target_dir ~lib_dir = +let lib_output_dir ~sctx ~target_dir lib = + let info = Lib.info lib in + let lib_dir = + match Lib_info.status info with + | Private _ -> + let lib = Lib.Local.of_lib_exn lib in + let info = Lib.Local.info lib in + Lib_info.src_dir info + | Public _ -> + let package_name = Option.value_exn (Lib_info.package info) in + let bctx = (Super_context.context sctx).build_dir in + let info = Lib.info lib in + let src_dir = Lib_info.src_dir info in + Path.Build.L.relative bctx + [ "node_modules" + ; Package.Name.to_string package_name + ; Path.Source.to_string (Path.drop_build_context_exn src_dir) + ] + | Installed | Installed_private -> + let package_name = Option.value_exn (Lib_info.package info) in + let bctx = (Super_context.context sctx).build_dir in + Path.Build.L.relative bctx + [ "node_modules"; Package.Name.to_string package_name ] + in Path.Build.append_source target_dir (Path.Build.drop_build_context_exn lib_dir) @@ -24,16 +47,6 @@ let make_js_name ~js_ext ~dst_dir m = let name = Melange.js_basename m ^ js_ext in Path.Build.relative dst_dir name -let local_of_lib ~loc lib = - match Lib.Local.of_lib lib with - | Some s -> s - | None -> - let lib_name = Lib.name lib in - User_error.raise ~loc - [ Pp.textf "The external library %s cannot be used" - (Lib_name.to_string lib_name) - ] - let impl_only_modules_defined_in_this_lib sctx lib = let open Memo.O in let+ modules = Dir_contents.modules_of_lib sctx lib >>| Option.value_exn in @@ -82,12 +95,11 @@ let js_targets_of_modules modules ~js_ext ~dst_dir = Path.Set.add acc target else acc) -let js_targets_of_libs sctx libs ~js_ext ~loc ~target_dir = +let js_targets_of_libs sctx libs ~js_ext ~target_dir = let of_lib lib = let open Memo.O in let+ modules = impl_only_modules_defined_in_this_lib sctx lib in - let lib_dir = local_of_lib ~loc lib |> Lib.Local.info |> Lib_info.src_dir in - let dst_dir = lib_output_dir ~target_dir ~lib_dir in + let dst_dir = lib_output_dir ~sctx ~target_dir lib in List.rev_map modules ~f:(fun m -> Path.build @@ make_js_name ~js_ext ~dst_dir m) in @@ -108,9 +120,7 @@ let build_js ~loc ~dir ~pkg_name ~mode ~module_system ~dst_dir ~obj_dir ~sctx let* compiler = Melange_binary.melc sctx ~loc:(Some loc) ~dir in let src = Obj_dir.Module.cm_file_exn obj_dir m ~kind:(Melange Cmj) in let output = make_js_name ~js_ext ~dst_dir m in - let obj_dir = - [ Command.Args.A "-I"; Path (Path.build (Obj_dir.melange_dir obj_dir)) ] - in + let obj_dir = [ Command.Args.A "-I"; Path (Obj_dir.melange_dir obj_dir) ] in let melange_package_args = let pkg_name_args = match pkg_name with @@ -130,7 +140,7 @@ let build_js ~loc ~dir ~pkg_name ~mode ~module_system ~dst_dir ~obj_dir ~sctx ; As melange_package_args ; A "-o" ; Target output - ; Dep (Path.build src) + ; Dep src ]) let setup_emit_cmj_rules ~sctx ~dir ~scope ~expander ~dir_contents @@ -202,7 +212,7 @@ let setup_emit_cmj_rules ~sctx ~dir ~scope ~expander ~dir_contents @@ let open Resolve.Memo.O in Compilation_context.requires_link cctx - >>= js_targets_of_libs sctx ~js_ext ~loc:mel.loc ~target_dir + >>= js_targets_of_libs sctx ~js_ext ~target_dir in Action_builder.paths deps) |> Rules.Produce.Alias.add_deps alias @@ -253,6 +263,7 @@ let setup_entries_js ~sctx ~dir ~dir_contents ~scope ~compile_info ~target_dir (Path.Build.drop_build_context_exn (Dir_contents.dir dir_contents)) in Memo.parallel_iter modules_for_js ~f:(fun m -> + let obj_dir = Obj_dir.of_local obj_dir in build_js ~dir ~loc ~pkg_name ~mode ~module_system:mel.module_system ~dst_dir ~obj_dir ~sctx ~includes ~js_ext m) @@ -266,7 +277,7 @@ let setup_js_rules_libraries ~dir ~scope ~target_dir ~sctx ~requires_link ~mode Lib.DB.get_compile_info (Scope.libs scope) lib_name ~allow_overlaps:mel.allow_overlapping_dependencies in - let info = local_of_lib ~loc:mel.loc lib |> Lib.Local.info in + let info = Lib.info lib in let loc = Lib_info.loc info in let build_js = let obj_dir = Lib_info.obj_dir info in @@ -284,12 +295,7 @@ let setup_js_rules_libraries ~dir ~scope ~target_dir ~sctx ~requires_link ~mode | None -> Memo.return () | Some vlib -> let* vlib = Resolve.Memo.read_memo vlib in - let dst_dir = - let lib_dir = - local_of_lib ~loc vlib |> Lib.Local.info |> Lib_info.src_dir - in - lib_output_dir ~target_dir ~lib_dir - in + let dst_dir = lib_output_dir ~sctx ~target_dir vlib in let* includes = let+ requires_link = Lib.Compile.for_lib @@ -303,10 +309,7 @@ let setup_js_rules_libraries ~dir ~scope ~target_dir ~sctx ~requires_link ~mode >>= Memo.parallel_iter ~f:(build_js ~dir ~dst_dir ~includes) in let* source_modules = impl_only_modules_defined_in_this_lib sctx lib in - let dst_dir = - let lib_dir = Lib_info.src_dir info in - lib_output_dir ~target_dir ~lib_dir - in + let dst_dir = lib_output_dir ~sctx ~target_dir lib in Memo.parallel_iter source_modules ~f:(build_js ~dir ~dst_dir ~includes)) let setup_emit_js_rules ~dir_contents ~dir ~scope ~sctx mel = diff --git a/src/dune_rules/obj_dir.ml b/src/dune_rules/obj_dir.ml index fcc005a5214..f40ac563f00 100644 --- a/src/dune_rules/obj_dir.ml +++ b/src/dune_rules/obj_dir.ml @@ -45,8 +45,9 @@ module External = struct if private_lib then Some (Path.relative dir ".public_cmi") else None in let public_cmi_melange_dir = - if private_lib then Some (Path.relative dir ".public_cmi_melange") - else None + let melange_dir = Path.relative dir Melange.Install.dir in + if private_lib then Some (Path.relative melange_dir ".public_cmi_melange") + else Some melange_dir in { public_dir = dir ; private_dir @@ -78,7 +79,8 @@ module External = struct Code_error.raise "External.cm_dir" [ ("t", to_dyn t) ] | Ocaml Cmi, Public, _ -> public_cmi_ocaml_dir t | Melange Cmi, Public, _ -> public_cmi_melange_dir t - | (Ocaml (Cmo | Cmx) | Melange Cmj), _, _ -> t.public_dir + | Melange Cmj, _, _ -> public_cmi_melange_dir t + | Ocaml (Cmo | Cmx), _, _ -> t.public_dir let encode { public_dir diff --git a/test/blackbox-tests/test-cases/melange/basic-install.t b/test/blackbox-tests/test-cases/melange/basic-install.t new file mode 100644 index 00000000000..f4179a9e67f --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/basic-install.t @@ -0,0 +1,51 @@ +Test that we can install melange mode libraries + + $ cat >dune-project < (lang dune 3.6) + > (package (name foo)) + > (using melange 0.1) + > EOF + $ cat >dune < (library + > (modes melange) + > (public_name foo)) + > EOF + + $ cat >foo.ml < let x = "foo" + > EOF + + $ dune build @install + $ cat ./_build/default/foo.install + lib: [ + "_build/install/default/lib/foo/META" + "_build/install/default/lib/foo/dune-package" + "_build/install/default/lib/foo/foo.ml" + "_build/install/default/lib/foo/melange/foo.cmi" {"melange/foo.cmi"} + "_build/install/default/lib/foo/melange/foo.cmj" {"melange/foo.cmj"} + "_build/install/default/lib/foo/melange/foo.cmt" {"melange/foo.cmt"} + ] + + $ cat ./_build/install/default/lib/foo/dune-package + (lang dune 3.7) + (name foo) + (sections (lib .)) + (files + (lib + (META dune-package foo.ml melange/foo.cmi melange/foo.cmj melange/foo.cmt))) + (library + (name foo) + (kind normal) + (main_module_name Foo) + (modes melange) + (modules + (singleton (name Foo) (obj_name foo) (path Foo) (visibility public) (impl)))) + + $ dune install --prefix prefix + Installing prefix/lib/foo/META + Installing prefix/lib/foo/dune-package + Installing prefix/lib/foo/foo.ml + Installing prefix/lib/foo/melange/foo.cmi + Installing prefix/lib/foo/melange/foo.cmj + Installing prefix/lib/foo/melange/foo.cmt + diff --git a/test/blackbox-tests/test-cases/melange/depend-on-installed.t b/test/blackbox-tests/test-cases/melange/depend-on-installed.t new file mode 100644 index 00000000000..4da5c826539 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/depend-on-installed.t @@ -0,0 +1,59 @@ +Test dependency on installed package + + $ mkdir a b prefix + + $ cat > a/dune-project < (lang dune 3.6) + > (package (name a)) + > (using melange 0.1) + > EOF + $ cat > a/dune < (library + > (modes melange) + > (public_name a)) + > EOF + + $ cat > a/foo.ml < let x = "foo" + > EOF + + $ dune build --root a + Entering directory 'a' + Leaving directory 'a' + + $ dune install --root a --prefix $PWD/prefix + Installing $TESTCASE_ROOT/prefix/lib/a/META + Installing $TESTCASE_ROOT/prefix/lib/a/a.ml + Installing $TESTCASE_ROOT/prefix/lib/a/dune-package + Installing $TESTCASE_ROOT/prefix/lib/a/foo.ml + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmt + + $ cat >b/dune-project < (lang dune 3.6) + > (package (name b)) + > (using melange 0.1) + > EOF + + $ cat > b/dune < (library + > (modes melange) + > (public_name b) + > (libraries a)) + > EOF + + $ cat > b/bar.ml < let x = A.Foo.x + > EOF + + $ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build --root b @install --display=short + Entering directory 'b' + ocamldep .b.objs/bar.ml.d + melc .b.objs/melange/b.{cmi,cmj,cmt} + melc .b.objs/melange/b__Bar.{cmi,cmj,cmt} + Leaving directory 'b' + diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/app.ml b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/app.ml new file mode 100644 index 00000000000..ed453bf811b --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/app.ml @@ -0,0 +1 @@ +let x = Js.log Lib1.x diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune new file mode 100644 index 00000000000..897eb6d7fc9 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune @@ -0,0 +1,5 @@ +(melange.emit + (target dist) + (alias dist) + (libraries lib) + (module_system commonjs)) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune-project b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune-project new file mode 100644 index 00000000000..9c0c0afea5b --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune-project @@ -0,0 +1,3 @@ +(lang dune 3.6) +(package (name pkg2)) +(using melange 0.1) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune-workspace b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune-workspace new file mode 100644 index 00000000000..0a32580ffcf --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/dune-workspace @@ -0,0 +1 @@ +(lang dune 3.6) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/dune-project b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/dune-project new file mode 100644 index 00000000000..9856528bc76 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/dune-project @@ -0,0 +1,3 @@ +(lang dune 3.6) +(package (name pkg1)) +(using melange 0.1) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib1/dune b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib1/dune new file mode 100644 index 00000000000..85383ec7427 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib1/dune @@ -0,0 +1,5 @@ +(library + (modes melange) + (name lib1) + (libraries pkg2.npm) + (public_name pkg1.lib1)) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib1/lib1.ml b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib1/lib1.ml new file mode 100644 index 00000000000..a2dd34c6bc6 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib1/lib1.ml @@ -0,0 +1 @@ +let x = "foo" ^ Npm.f diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib2/dune b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib2/dune new file mode 100644 index 00000000000..e6858a1a604 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib2/dune @@ -0,0 +1,5 @@ +(library + (modes melange) + (name lib2) + (libraries lib1) + (public_name pkg1.lib2)) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib2/lib2.ml b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib2/lib2.ml new file mode 100644 index 00000000000..3791bcb5f82 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/inner/lib2/lib2.ml @@ -0,0 +1 @@ +let x = Lib1.x ^ "bar" diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/lib/dune b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/lib/dune new file mode 100644 index 00000000000..ad1618f7cb9 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/lib/dune @@ -0,0 +1,5 @@ +(library + (modes melange) + (name lib) + (libraries pkg1.lib1 pkg1.lib2) + (public_name pkg2.lib)) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/lib/lib.ml b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/lib/lib.ml new file mode 100644 index 00000000000..86e923497f5 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/lib/lib.ml @@ -0,0 +1 @@ +let x = Lib1.x ^ Lib2.x ^ "baz" diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/npm/dune b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/npm/dune new file mode 100644 index 00000000000..aa70f175ba4 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/npm/dune @@ -0,0 +1,4 @@ +(library + (modes melange) + (name npm) + (public_name pkg2.npm)) diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/npm/npm.ml b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/npm/npm.ml new file mode 100644 index 00000000000..fd37e63b9d8 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/npm/npm.ml @@ -0,0 +1 @@ +let f = "npm" diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/run.t b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/run.t new file mode 100644 index 00000000000..b46fcd258ea --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-complex.t/run.t @@ -0,0 +1,6 @@ +Test that libs are correctly installed in a complex setup + +Build js files + $ dune build @dist + $ node _build/default/dist/app.js + foonpm diff --git a/test/blackbox-tests/test-cases/melange/emit-installed-two-modes.t b/test/blackbox-tests/test-cases/melange/emit-installed-two-modes.t new file mode 100644 index 00000000000..013cd36f01e --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed-two-modes.t @@ -0,0 +1,94 @@ +Test dependency on installed package + + $ mkdir a b c prefix + + $ cat > a/dune-project < (lang dune 3.6) + > (package (name a)) + > (using melange 0.1) + > EOF + $ cat > a/dune < (library + > (modes byte melange) + > (public_name a)) + > EOF + + $ cat > a/foo.ml < let x = "foo" + > EOF + + $ dune build --root a + Entering directory 'a' + Leaving directory 'a' + + $ dune install --root a --prefix $PWD/prefix + Installing $TESTCASE_ROOT/prefix/lib/a/META + Installing $TESTCASE_ROOT/prefix/lib/a/a.cma + Installing $TESTCASE_ROOT/prefix/lib/a/a.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/a.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/a.ml + Installing $TESTCASE_ROOT/prefix/lib/a/a__Foo.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/a__Foo.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/dune-package + Installing $TESTCASE_ROOT/prefix/lib/a/foo.ml + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmt + + $ cat >b/dune-project < (lang dune 3.6) + > (using melange 0.1) + > EOF + + $ cat > b/dune < (melange.emit + > (target dist) + > (alias dist) + > (libraries a) + > (module_system commonjs)) + > EOF + + $ cat > b/bar.ml < let x = Js.log A.Foo.x + > EOF + + $ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build --root b @dist --display=short + Entering directory 'b' + melc dist/node_modules/a/a.js + melc dist/node_modules/a/foo.js + melc .dist.mobjs/melange/melange__Bar.{cmi,cmj,cmt} + melc dist/bar.js + Leaving directory 'b' + + $ node b/_build/default/dist/bar.js + foo + + $ cat >c/dune-project < (lang dune 3.6) + > (using melange 0.1) + > EOF + + $ cat > c/dune < (melange.emit + > (target dist) + > (alias dist) + > (libraries a) + > (module_system commonjs)) + > EOF + + $ cat > c/dune < (executable + > (name bar) + > (modes byte) + > (libraries a)) + > EOF + + $ cat > c/bar.ml < let () = print_endline A.Foo.x + > EOF + + $ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune exec ./c/bar.exe + foo diff --git a/test/blackbox-tests/test-cases/melange/emit-installed.t b/test/blackbox-tests/test-cases/melange/emit-installed.t new file mode 100644 index 00000000000..e41f38bd631 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-installed.t @@ -0,0 +1,62 @@ +Test dependency on installed package + + $ mkdir a b prefix + + $ cat > a/dune-project < (lang dune 3.6) + > (package (name a)) + > (using melange 0.1) + > EOF + $ cat > a/dune < (library + > (modes melange) + > (public_name a)) + > EOF + + $ cat > a/foo.ml < let x = "foo" + > EOF + + $ dune build --root a + Entering directory 'a' + Leaving directory 'a' + + $ dune install --root a --prefix $PWD/prefix + Installing $TESTCASE_ROOT/prefix/lib/a/META + Installing $TESTCASE_ROOT/prefix/lib/a/a.ml + Installing $TESTCASE_ROOT/prefix/lib/a/dune-package + Installing $TESTCASE_ROOT/prefix/lib/a/foo.ml + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/melange/a__Foo.cmt + + $ cat >b/dune-project < (lang dune 3.6) + > (using melange 0.1) + > EOF + + $ cat > b/dune < (melange.emit + > (target dist) + > (alias dist) + > (libraries a) + > (module_system commonjs)) + > EOF + + $ cat > b/bar.ml < let x = Js.log A.Foo.x + > EOF + + $ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build --root b @dist --display=short + Entering directory 'b' + melc dist/node_modules/a/a.js + melc dist/node_modules/a/foo.js + melc .dist.mobjs/melange/melange__Bar.{cmi,cmj,cmt} + melc dist/bar.js + Leaving directory 'b' + + $ node b/_build/default/dist/bar.js + foo diff --git a/test/blackbox-tests/test-cases/melange/emit-private.t b/test/blackbox-tests/test-cases/melange/emit-private.t new file mode 100644 index 00000000000..be00322caaf --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-private.t @@ -0,0 +1,56 @@ +Test dependency on a private library in the same package as melange.emit + + $ cat >dune-project < (lang dune 3.6) + > (package (name a)) + > (using melange 0.1) + > EOF + + $ mkdir a b prefix + + $ cat > a/dune < (library + > (name a) + > (modes melange) + > (package a)) + > EOF + + $ cat > a/foo.ml < let x = "foo" + > EOF + + $ dune build + + $ dune install --prefix $PWD/prefix + Installing $TESTCASE_ROOT/prefix/lib/a/META + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/.public_cmi_melange/a.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/.public_cmi_melange/a.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/.public_cmi_melange/a.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/.public_cmi_melange/a__Foo.cmi + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/.public_cmi_melange/a__Foo.cmj + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/.public_cmi_melange/a__Foo.cmt + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/a.ml + Installing $TESTCASE_ROOT/prefix/lib/a/__private__/a/foo.ml + Installing $TESTCASE_ROOT/prefix/lib/a/dune-package + + $ cat > b/dune < (melange.emit + > (target dist) + > (alias dist) + > (libraries a) + > (package a) + > (module_system commonjs)) + > EOF + + $ cat > b/bar.ml < let x = Js.log A.Foo.x + > EOF + + $ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build @dist --display=short + melc b/dist/a/a.js + melc b/.dist.mobjs/melange/melange__Bar.{cmi,cmj,cmt} + melc b/dist/a/foo.js + melc b/dist/b/bar.js + + $ node _build/default/b/dist/b/bar.js + foo diff --git a/test/blackbox-tests/test-cases/melange/emit-two-dune-projects.t b/test/blackbox-tests/test-cases/melange/emit-two-dune-projects.t new file mode 100644 index 00000000000..892231e9c01 --- /dev/null +++ b/test/blackbox-tests/test-cases/melange/emit-two-dune-projects.t @@ -0,0 +1,86 @@ +Test dependency on installed package + + $ mkdir xyz + + $ cat > xyz/dune-project < (lang dune 3.6) + > (package (name aa_fe)) + > (using melange 0.1) + > EOF + $ cat > xyz/dune < (library + > (modes melange) + > (name aa_fe_melange) + > (public_name aa_fe.melange)) + > EOF + + $ cat > xyz/foo.ml < let x = "foo" + > EOF + + $ cat >dune-project < (lang dune 3.6) + > (using melange 0.1) + > EOF + + $ cat >dune-workspace < (lang dune 3.6) + > EOF + + $ cat > dune < (melange.emit + > (target dist) + > (alias dist) + > (libraries aa_fe.melange) + > (module_system commonjs)) + > EOF + + $ cat > bar.ml < let x = Js.log Aa_fe_melange.Foo.x + > EOF + + $ dune build @dist + + $ node _build/default/dist/bar.js + foo + +Move inner lib to a subfolder inside its dune-project + + $ cd xyz + $ mkdir inner + $ mv dune-project inner + $ mv dune inner + $ mv foo.ml inner + $ cd - + $TESTCASE_ROOT + + $ dune build @dist + + $ node _build/default/dist/bar.js + foo + +Move everything except the workspace to a subfolder + + $ mkdir abc + $ mv dune-project abc + $ mv dune abc + $ mv bar.ml abc + + $ dune build @dist + + $ node _build/default/abc/dist/abc/bar.js + foo + +Move back inner lib to main folder + + $ cd xyz/inner + $ mv dune-project .. + $ mv dune .. + $ mv foo.ml .. + $ cd - + $TESTCASE_ROOT + + $ dune build @dist + + $ node _build/default/abc/dist/abc/bar.js + foo diff --git a/test/blackbox-tests/test-cases/melange/public.t/my_project/dune b/test/blackbox-tests/test-cases/melange/public.t/my_project/dune index ab3cfb68055..322c0a6da1d 100644 --- a/test/blackbox-tests/test-cases/melange/public.t/my_project/dune +++ b/test/blackbox-tests/test-cases/melange/public.t/my_project/dune @@ -1,5 +1,4 @@ (melange.emit - (package pkg) (target output) (entries c) (alias melange) 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 5850d072c97..79efeeb362a 100644 --- a/test/blackbox-tests/test-cases/melange/public.t/run.t +++ b/test/blackbox-tests/test-cases/melange/public.t/run.t @@ -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/my_project/app/b.js | + $ dune rules $output/node_modules/pkg/my_project/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/my_project/app/b.js | + $ dune rules $output/node_modules/pkg/my_project/app/b.js | > grep -e "--bs-package-name" --after-context=1 --bs-package-name pkg @@ -35,70 +35,4 @@ Path to app_B is non-relative (broken) $ dune clean $ dune build @all - File "my_project/app/dune", line 1, characters 0-78: - 1 | (library - 2 | (name app) - 3 | (public_name pkg.app) - 4 | (libraries lib) - 5 | (modes melange)) - Error: No rule found for my_project/app/.app.objs/byte/app.cmi - File "my_project/app/dune", line 1, characters 0-78: - 1 | (library - 2 | (name app) - 3 | (public_name pkg.app) - 4 | (libraries lib) - 5 | (modes melange)) - Error: No rule found for my_project/app/.app.objs/byte/app.cmt - File "my_project/app/dune", line 1, characters 0-78: - 1 | (library - 2 | (name app) - 3 | (public_name pkg.app) - 4 | (libraries lib) - 5 | (modes melange)) - Error: No rule found for my_project/app/.app.objs/byte/app__B.cmi - File "my_project/app/dune", line 1, characters 0-78: - 1 | (library - 2 | (name app) - 3 | (public_name pkg.app) - 4 | (libraries lib) - 5 | (modes melange)) - Error: No rule found for my_project/app/.app.objs/byte/app__B.cmt - File "my_project/app/dune", line 1, characters 0-78: - 1 | (library - 2 | (name app) - 3 | (public_name pkg.app) - 4 | (libraries lib) - 5 | (modes melange)) - Error: No rule found for my_project/app/.app.objs/byte/app__B.cmti - File "my_project/lib/dune", line 1, characters 0-61: - 1 | (library - 2 | (name lib) - 3 | (public_name pkg.lib) - 4 | (modes melange)) - Error: No rule found for my_project/lib/.lib.objs/byte/lib.cmi - File "my_project/lib/dune", line 1, characters 0-61: - 1 | (library - 2 | (name lib) - 3 | (public_name pkg.lib) - 4 | (modes melange)) - Error: No rule found for my_project/lib/.lib.objs/byte/lib.cmt - File "my_project/lib/dune", line 1, characters 0-61: - 1 | (library - 2 | (name lib) - 3 | (public_name pkg.lib) - 4 | (modes melange)) - Error: No rule found for my_project/lib/.lib.objs/byte/lib__A.cmi - File "my_project/lib/dune", line 1, characters 0-61: - 1 | (library - 2 | (name lib) - 3 | (public_name pkg.lib) - 4 | (modes melange)) - Error: No rule found for my_project/lib/.lib.objs/byte/lib__A.cmt - File "my_project/lib/dune", line 1, characters 0-61: - 1 | (library - 2 | (name lib) - 3 | (public_name pkg.lib) - 4 | (modes melange)) - Error: No rule found for my_project/lib/.lib.objs/byte/lib__A.cmti - [1]