Ocamlbuild example with C stubs

From Gallium

Jump to: navigation, search

This example is a plugin for compiling cryptokit OCaml library.

 $ cat myocamlbuild.ml
 open Ocamlbuild_plugin
 open Command
 (* Configuration section *)
 let have_zlib = "-DHAVE_ZLIB"
 let zlib_lib = "-lz"
 let zlib_libdir = "-L/usr/lib"
 (* let zlib_libdir = "-L/usr/lib64"  (* for x86-64 Linux *) *)
 let zlib_include = "-I/usr/include"
 let static = true
 (* List of headers *)
 let headers =
   ["arcfour.h"; "d3des.h"; "rijndael-alg-fst.h";
    "ripemd160.h"; "sha1.h"; "sha256.h"]
 dispatch begin function
 | After_rules ->
     (* When one make a C library that use the zlib with ocamlmklib,
        then issue these flags. *)
     flag ["ocamlmklib"; "c"; "use_zlib"]
          (S[A zlib_libdir; A zlib_lib]);
     (* When one compile C code using the zlib *)
     flag ["c"; "compile"; "include_zlib"]
          (S[A"-ccopt"; A zlib_include; A"-ccopt"; A have_zlib]);
     flag ["link"; "ocaml"; "library"; "use_zlib"]
          (S[A"-ccopt"; A zlib_libdir; A"-cclib"; A zlib_lib]);
     (* If `static' is true then every ocaml link in bytecode will add -custom *)
     if static then flag ["link"; "ocaml"; "byte"] (A"-custom");
     (* cryptokit is an ocaml library.
        This will declare use_cryptokit and include_cryptokit *)
     ocaml_lib "cryptokit";
     flag ["link"; "library"; "ocaml"; "byte"; "use_libcryptokit"]
          (S[A"-dllib"; A"-lcryptokit"; A"-cclib"; A"-lcryptokit"]);
     flag ["link"; "library"; "ocaml"; "native"; "use_libcryptokit"]
          (S[A"-cclib"; A"-lcryptokit"]);
     (* When ocaml link something that use the libcryptokit,
        then one need that file to be up to date. *)
     dep  ["link"; "ocaml"; "use_libcryptokit"] ["libcryptokit.a"];
     (* As an approximation all our C files use the headers.
        Note: This will import headers in the build directory. *)
     dep  ["compile"; "c"] headers;
 | _ -> ()
 $ cat _tags
 <*.c>: include_zlib
 "libcryptokit.a": use_zlib
 <cryptokit.cm{x,}a>: use_zlib, use_libcryptokit
 <{,speed}test.{byte,native}>: use_cryptokit, use_unix, use_nums
 $ cat libcryptokit.clib
 rijndael-alg-fst.o stubs-aes.o
 d3des.o stubs-des.o
 arcfour.o stubs-arcfour.o
 sha1.o stubs-sha1.o
 sha256.o stubs-sha256.o
 ripemd160.o stubs-ripemd160.o
 $ cat cryptokit.mllib
 # This command suffice to produce the test file.
 $ ocamlbuild test.native
 # [ ... some warnings ... ]
 Finished, 26 targets (0 cached) in 00:00:04.
 $ ocamlbuild test.native
 Finished, 26 targets (26 cached) in 00:00:00.
 $ ./test.native
 # [ ... some output ... ]
 $ cat all.itarget
 $ cat tests.itarget
 $ ocamlbuild tests.otarget
 # [ ... some warnings ... ]
 Finished, 35 targets (26 cached) in 00:00:01.
Personal tools
Espace privé