Usage with js_of_ocaml
dboris opened this issue · comments
Here's a minimal example:
open Js_of_ocaml
open Js_of_ocaml_lwt
let on_btn_click _ _ =
Logs_lwt.debug (fun m -> m "Clicked")
let main _ =
let btn =
Js.Opt.get
(Dom_html.document##getElementById (Js.string "btn"))
(fun () -> assert false)
in
Lwt_js_events.(async (fun () -> clicks btn on_btn_click));
Js._false
let () =
Logs.set_reporter (Logs_browser.console_reporter ());
Logs.set_level (Some Logs.Debug);
Dom_html.window##.onload := Dom_html.handler main
Compiles fine. When I run this in the browser, I get an error:
Uncaught TypeError: Cannot read property '1' of undefined
at test.ml:18
at bigarray.ml:0
Seems to be in this line:
Logs.set_reporter (Logs_browser.console_reporter ())
Am I doing something wrong?
The example from the distribution runs fine here. If you want me to dig this further please post a full build system for your example somwhere (e.g. in a gist).
Also I don't understand where that bigarray.ml
is coming from please and could you try without lwt
first.
Here's a repo with the example:
https://github.com/dboris/logs-test
Thanks @dboris.
I suspect there's something wrong with dune and/or js_of_ocaml
separate compilation. What we see here may be due to an OCaml runtime system initialization error because some stuff is not being linked in, you may want to open an issue there.
It became clear when I did:
> dune build --profile=release test.bc.js
File "_none_", line 1:
Error: Required module `Logs_browser' is unavailable
Basically you forgot to specify logs.browser
and log.lwt
in your dune
file:
> git diff
diff --git a/dune b/dune
index 69f095d..4afe763 100644
--- a/dune
+++ b/dune
@@ -1,4 +1,4 @@
(executable
(name test)
- (libraries js_of_ocaml-lwt logs)
+ (libraries js_of_ocaml-lwt logs logs.browser logs.lwt)
(preprocess (pps js_of_ocaml-ppx)))
\ No newline at end of file
Please make sure to report this to dune
so that they can see if something better can be done.
Thanks, will do.
What is a good way to figure what package needs to be specified in the dune file? Neither opam show
, nor odig doc
mention logs.browser
and logs.lwt
. I can see them in the package META
file, but is there a better way?
I'd say there's no good way at the moment ocamlfind list
will however list the packages/libraries which might give hints.
The problem here is that the libraries are all installed in the same directory so specifying e.g. only logs
adds -I LIBDIR/logs
and allows to see the cmi of the other libraries so separate compilation works.
If we move to ocaml/RFCs#7 where each library has to live in its own directory. Then you would have gotten an undefined Logs_browser
at compilation time which would have helped to specify the right libraries.
I bet the problem here is that when you use separate compilation in jsoo the linker becomes your html
file so it doesn't check if everything is here like when you link an executable.
I'm not sure if something could maybe added to jsoo_link
for that /cc @hhugo.