diff options
Diffstat (limited to 'ocamlbuild/examples/example_with_C')
-rw-r--r-- | ocamlbuild/examples/example_with_C/_tags | 1 | ||||
-rw-r--r-- | ocamlbuild/examples/example_with_C/fib.ml | 5 | ||||
-rw-r--r-- | ocamlbuild/examples/example_with_C/fibwrap.c | 7 | ||||
-rw-r--r-- | ocamlbuild/examples/example_with_C/main.c | 10 | ||||
-rw-r--r-- | ocamlbuild/examples/example_with_C/myocamlbuild.ml | 35 | ||||
-rw-r--r-- | ocamlbuild/examples/example_with_C/x.ml | 1 |
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 |