arm: Fix for test running slowly.
[whenjobs.git] / tools / whenjobs.ml
index a9ae7b7..440d425 100644 (file)
@@ -307,22 +307,28 @@ and list_file () =
   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 !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;
@@ -331,24 +337,46 @@ and upload_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
   );