This module offers an higher level api over Dynloader. This retrieves the compiler and a bunch of cmi files embedded in the current executable, and use them to do the compilation of ocaml source files, before loading them using Dynlink. The compilation steps happen in Async.
This is meant to be used in unix only, in particular because it uses /proc to determine the location of the exec code being run.
The convention over the name of the executables inside the archive. All are native executables (.opt)
module Archive_metadata : sig ... end
List of files in the archive embedded into the current executable.
type 'a create_arguments = ( ?persistent_archive_dirpath:string -> 'a ) Dynloader.create_arguments
val create : ( unit -> [ `this_needs_manual_cleaning_after of t ] Async.Deferred.Or_error.t ) create_arguments
This is a special utilisation of the Generic Loader. It relies on a few assumptions, such as a file called ocamlopt.opt is present in the archive, as well as some cmi files, and uses a tmp compilation_directory. A call to this function will retrieve the embedded part of the code, and extract it in the current corresponding directory. The most common use and the default value for
`my_code. Currently this library works with native code only. Called in bytecode, this function will raise. See the documentation of dynloader for other flags, they are passed internally to that module to create the internal dynloader (in _dir, custom_warnings_spec, etc.).
/!\ By using this manual create, you take the responsibility to call
clean t when you're done with all the compilation that you want to do with this compiler. Consider using
load_ocaml_src_files if this makes your life simpler.
val with_compiler : ( f:( t -> 'a Async.Deferred.Or_error.t ) -> unit -> 'a Async.Deferred.Or_error.t ) create_arguments
Call create, do something with the compiler, and then take care of calling clean. In case an exception or a shutdown happen and f never returns, an attempt to clean the compiler is still done via an at_shutdown execution.
This will delete the temporary directory created, and remove all the files, included the files generated by the loader. This function should be used when the compiler has been created using
create for advanced use of this module. For a simpler usage, look at
with_compiler or the functor below.
module type S = sig ... end
This is a wrapper for the similar module in Dynloader that takes care of cleaning the compiler afterwards.