summaryrefslogtreecommitdiffstats
path: root/ocamlbuild/examples/example_with_C
diff options
context:
space:
mode:
Diffstat (limited to 'ocamlbuild/examples/example_with_C')
-rw-r--r--ocamlbuild/examples/example_with_C/_tags1
-rw-r--r--ocamlbuild/examples/example_with_C/fib.ml5
-rw-r--r--ocamlbuild/examples/example_with_C/fibwrap.c7
-rw-r--r--ocamlbuild/examples/example_with_C/main.c10
-rw-r--r--ocamlbuild/examples/example_with_C/myocamlbuild.ml35
-rw-r--r--ocamlbuild/examples/example_with_C/x.ml1
6 files changed, 59 insertions, 0 deletions
diff --git a/ocamlbuild/examples/example_with_C/_tags b/ocamlbuild/examples/example_with_C/_tags
new file mode 100644
index 000000000..769cb463b
--- /dev/null
+++ b/ocamlbuild/examples/example_with_C/_tags
@@ -0,0 +1 @@
+<*caml.o>: output_obj
diff --git a/ocamlbuild/examples/example_with_C/fib.ml b/ocamlbuild/examples/example_with_C/fib.ml
new file mode 100644
index 000000000..ef6dbd438
--- /dev/null
+++ b/ocamlbuild/examples/example_with_C/fib.ml
@@ -0,0 +1,5 @@
+let x = X.x
+
+let rec fib n = if n <= 1 then 1 else fib (n - 1) + fib (n - 2)
+
+let () = Callback.register "fib" fib
diff --git a/ocamlbuild/examples/example_with_C/fibwrap.c b/ocamlbuild/examples/example_with_C/fibwrap.c
new file mode 100644
index 000000000..cc2104b67
--- /dev/null
+++ b/ocamlbuild/examples/example_with_C/fibwrap.c
@@ -0,0 +1,7 @@
+ /* -*- C -*- */
+#include <caml/mlvalues.h>
+#include <caml/callback.h>
+int fib(int n)
+{
+ return Int_val(caml_callback(*caml_named_value("fib"), Val_int(n)));
+}
diff --git a/ocamlbuild/examples/example_with_C/main.c b/ocamlbuild/examples/example_with_C/main.c
new file mode 100644
index 000000000..c7f6bb5d2
--- /dev/null
+++ b/ocamlbuild/examples/example_with_C/main.c
@@ -0,0 +1,10 @@
+ /* -*- C -*- */
+#include <stdio.h>
+#include <caml/callback.h>
+extern int fib(int);
+int main(int argc, char** argv)
+{
+ caml_startup(argv);
+ printf("fib(12) = %d\n", fib(12));
+ return 0;
+}
diff --git a/ocamlbuild/examples/example_with_C/myocamlbuild.ml b/ocamlbuild/examples/example_with_C/myocamlbuild.ml
new file mode 100644
index 000000000..f53df7e10
--- /dev/null
+++ b/ocamlbuild/examples/example_with_C/myocamlbuild.ml
@@ -0,0 +1,35 @@
+open Ocamlbuild_plugin;;
+open Command;;
+
+let cc = A"cc";;
+let ar = A"ar";;
+
+dispatch begin function
+| After_rules ->
+ let libasmrun = !*Ocamlbuild_pack.Ocaml_utils.stdlib_dir/"libasmrun.a" in
+
+ flag ["ocaml"; "link"; "output_obj"] (A"-output-obj");
+
+ rule "output C obj"
+ ~deps:["%.cmx"; "%.o"]
+ ~prod:"%caml.o"
+ (Ocamlbuild_pack.Ocaml_compiler.native_link "%.cmx" "%caml.o");
+
+ rule "build C lib"
+ ~deps:["%wrap.o"; "%caml.o"]
+ ~prod:"lib%.a"
+ begin fun env _ ->
+ let wrap_o = env "%wrap.o" and caml_o = env "%caml.o"
+ and lib_a = env "lib%.a" in
+ Seq[cp libasmrun lib_a;
+ Cmd(S[ar; A"r"; Px lib_a; P caml_o; P wrap_o])]
+ end;
+ rule "build main"
+ ~deps:["libfib.a"; "main.o"]
+ ~prod:"main"
+ begin fun _ _ ->
+ Cmd(S[cc; P"main.o"; P"libfib.a"; A"-o"; Px"main"])
+ end;
+| _ -> ()
+end
+
diff --git a/ocamlbuild/examples/example_with_C/x.ml b/ocamlbuild/examples/example_with_C/x.ml
new file mode 100644
index 000000000..7fecab12d
--- /dev/null
+++ b/ocamlbuild/examples/example_with_C/x.ml
@@ -0,0 +1 @@
+let x = 42