First published version.
[goaljobs.git] / examples / compile-c / compile.ml
diff --git a/examples/compile-c/compile.ml b/examples/compile-c/compile.ml
new file mode 100644 (file)
index 0000000..6cd2e88
--- /dev/null
@@ -0,0 +1,30 @@
+open Goaljobs  (* will be implicit *)
+
+let rec goal all () =
+  require (built "program" ["main.c"; "utils.c"])
+
+(* Goal: build the final program from source files. *)
+and built program sources =
+  target (more_recent [program] sources);
+  List.iter (fun s -> require (compiled s)) sources;
+
+  let objects = List.map (change_file_extension "o") sources in
+  sh "cc %s -o %s" (String.concat " " objects) program
+
+(* Goal: Make sure a C file is compiled (to an object file). *)
+and compiled c_file =
+  let o_file = change_file_extension "o" c_file in
+  target (more_recent [o_file] [c_file]);
+  require (file_exists c_file);
+  sh "cc -c %s -o %s" c_file o_file
+
+(* XXX IMPLICIT *)
+let () =
+  try goal_all ()
+  with
+  | Goal_result (Goal_failed msg) ->
+    prerr_endline ("error: " ^ msg);
+    exit 1
+  | exn ->
+    prerr_endline (Printexc.to_string exn);
+    exit 1