close_in chan
and upload_file () =
+ let suffix = if not Config.have_ocamlopt then "cmo" else "cmx" in
+
(* Recompile the jobs file(s). *)
let files = get_multijobs_filenames () in
+
+ (* Choose a random name for the output file. time_t is convenient.
+ * See: https://sympa-roc.inria.fr/wws/arc/caml-list/2012-03/msg00276.html?checked_cas=2
+ *)
+ let t = Int64.of_float (time ()) in
+
+ (* Compilation step. *)
List.iter (
fun file ->
let cmd =
if not Config.have_ocamlopt then
(* bytecode *)
- sprintf "%s c -I +camlp4 -I %s -package unix,camlp4.lib -pp 'camlp4o %s/pa_when.cmo' -c %s"
- Config.ocamlfind !libdir !libdir file
- else (
+ sprintf "%s c -for-pack Jobs__%Ld -I +camlp4 -I %s -package unix,camlp4.lib -pp 'camlp4o %s/pa_when.cmo' -c %s"
+ Config.ocamlfind t !libdir !libdir file
+ else
(* native code *)
- let base = Filename.chop_extension file in (* without .ml suffix *)
- sprintf "%s opt -I +camlp4 -I %s -package unix,camlp4.lib -pp 'camlp4o %s/pa_when.cmo' -c %s &&\n%s opt -shared -linkall %s.cmx -o %s.cmxs"
- Config.ocamlfind !libdir !libdir file
- Config.ocamlfind base base
- ) in
+ sprintf "%s opt -for-pack Jobs__%Ld -I +camlp4 -I %s -package unix,camlp4.lib -pp 'camlp4o %s/pa_when.cmo' -c %s"
+ Config.ocamlfind t !libdir !libdir file in
if Sys.command cmd <> 0 then (
eprintf "whenjobs: %s: could not compile jobs script, see earlier errors\n"
file;
)
) files;
- let suffix = if not Dynlink.is_native then "cmo" else "cmxs" in
+ (* Pack into a single file. *)
+ let filename = sprintf "%s/jobs__%Ld.%s" jobsdir t suffix in
+ let cmd =
+ let objects = List.map (
+ fun file ->
+ let base = Filename.chop_extension file in
+ base ^ if not Config.have_ocamlopt then ".cmo" else ".cmx"
+ ) files in
+ sprintf "%s %s -pack -o %s %s"
+ Config.ocamlfind
+ (if not Config.have_ocamlopt then "c" else "opt")
+ filename (String.concat " " objects) in
+ if Sys.command cmd <> 0 then (
+ eprintf "whenjobs: could not pack jobs script, see earlier errors\n";
+ eprintf "compile command was:\n%s\n" cmd;
+ exit 1
+ );
- let compiled_files = List.map (
- fun file ->
- let n = String.length file in
- if n < 4 then assert false;
- sprintf "%s.%s" (String.sub file 0 (n-3)) suffix
- ) files in
+ (* For native code only, write a *.cmxs file. *)
+ let filename =
+ if Config.have_ocamlopt then (
+ let cmd = sprintf "%s opt -shared -linkall %s -o %ss"
+ Config.ocamlfind filename filename in
+ if Sys.command cmd <> 0 then (
+ eprintf "whenjobs: could not convert to *.cmxs, see earlier errors\n";
+ eprintf "compile command was:\n%s\n" cmd;
+ exit 1
+ );
+ filename ^ "s" (* .cmx -> .cmxs *)
+ )
+ else filename in
(* Test-load the jobs files to ensure they make sense. *)
Whenfile.init Whenstate.empty;
- (try
- List.iter Dynlink.loadfile compiled_files
+ (try Dynlink.loadfile filename
with
Dynlink.Error err ->
eprintf "whenjobs: dynlink: %s\n" (Dynlink.error_message err);
- (* Since it failed, unlink the compiled files. *)
- List.iter (fun f -> try unlink f with Unix_error _ -> ()) compiled_files;
+ (* Since it failed, unlink the compiled file. *)
+ (try unlink filename with Unix_error _ -> ());
exit 1
);