New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow generating bytecode executables without the header #6199
Comments
Note: I want to have relocatable OCaml binaries, so that the opam binary cache can work across switches. (Currently the new esy tool uses the hack of rewriting path inside the executables to provide this feature.). On the specific problem of the shebang, there are two ways to do it:
I expect the present feature request to be very useful when playing around to implement option (2). |
Irrespective of whether this breaks the compilation of packages or not, you would also be breaking a long-established tradition. I suspect many users rely on bytecode "executables" to be well, executable. And given the variations in compilation times between bytecode and native, I believe that many people debug using the bytecode versions. |
@yakobowski the build scripts I can test in the opam-repository. People will have to take care of themselves :-) In any case, I now believe that the advantages of relocatability outweigh the costs (but of course we should try to reduce those as well). |
xref with #5950 the (suspended) relocatable compiler issue. |
This issue is (I think) completely addressed by the |
Original bug ID: 6199
Reporter: @alainfrisch
Status: confirmed (set by @damiendoligez on 2014-06-04T20:05:23Z)
Resolution: open
Priority: normal
Severity: feature
Category: configure and build/install
Monitored by: @gasche
Bug description
ocamlc generates bytecode executable starting with a header in charge of launching ocamlrun. Under Unix, this is a simple #! header (containing the absolute path of ocamlrun) and under Windows, this is an ad hoc program obtained from stdlib/header.c. This creates some issues:
Bootstrapping the compiler produces ocamlc/ocamllex executables (stored in the SVN) which depend on the machine where bootstrapping was done. Simply bootstrapping the same version on two different working copies will give different results.
The header encourages to not call ocamlrun explicitly, but this makes it difficult to provide a relocatable binary distribution of the toolchain, or simply to distribute a bytecode executable (if not compiled with -custom, we really need to call ocamlrun anyway).
Under Windows, the header is not tiny (about 223kB). (Arguably, we don't really care.) More importantly, maybe, is that calling a bytecode executable with the header creates two Windows processes, while using ocamlrun explicitly creates only one.
I propose to add a link-time flag to ocamlc to avoid inserting an header in the resulting program (and probably stop setting its executable flag). Or maybe this could simply be a special value for use_runtime. We would then use this flag so that the bootstrap tools (boot/ocamlc, boot/ocamllex) don't contain this header.
This will not fix the idempotency problem completely (because some local configuration values are hardcoded in config.ml), but it will be a good step in this direction. Having real idempotency of the bootstrap procedure would allow a nice application: checking in a CI server that the bootstrap fixpoint is reached in the SVN.
The text was updated successfully, but these errors were encountered: