dune
                                
                                 dune copied to clipboard
                                
                                    dune copied to clipboard
                            
                            
                            
                        Improve incrementality of jsoo build
Instead of compiling *.cma files to JavaScript. We can compile individual *.cmos to javascript and link all *.cmo.js together.
This results in a much better incremental build as jsoo no longer recompile compilation units that were not modified.
Linking *.cmo.js into a cma.js should be much faster than any compilation with jsoo.
This can only be done for local libraries as "installed" ones are not required to provide individual cmo. This is fine.
This is following https://discuss.ocaml.org/t/replace-jsoo-link-with-cat-or-esbuild/11600/13?u=hhugo
Does this affect dead code elimination?
It should not affect dead code elimination.
This PR requires a new release of jsoo so that js_of_ocaml link can understand the -a flag. We'll need to add some check to know if the flag is accepted.
I see. I think I discussed doing something like this with @nojb as well to speed up native/bytecode builds and dead code elimination was the sour point as to why this didn't work.
I see. I think I discussed doing something like this with @nojb as well to speed up native/bytecode builds and dead code elimination was the sour point as to why this didn't work.
I don't understand.. this PR is about making jsoo compilation similar to ocamlc. Maybe you're thinking about another optimization .. ?
Oh I see. I didn't read the PR implementation. I thought you meant producing the final .js from the .cmo.js files while completely side-stepping .cma. I see that  you're just speeding up the production of your .cma.js here.
I see. If you wanted to not produce cma files and pass cmos directly, you could implement the "dead code" logic in dune directly. It's not very difficult (jsoo does it for its link command)
I see. If you wanted to not produce cma files and pass cmos directly, you could implement the "dead code" logic in dune directly. It's not very difficult (jsoo does it for its link command)
It's actually more complicated for dune as you need to be able to deal with arbitrary compiler version.
It's actually more complicated for dune as you need to be able to deal with arbitrary compiler version.
How come? Wouldn't this knowledge come from ocamlep?
It's actually more complicated for dune as you need to be able to deal with arbitrary compiler version.
How come? Wouldn't this knowledge come from ocamlep?
I don't think you want to base the logic on ocamldep output. You should let ocamlc decide if a module depend on the implementation of another one. You probably want to just use reloc info inside cmo file format and replicate the small logic for what unit should be linked