English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
ocamlbuild and C stubs
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2007-03-07 (22:03)
From: William D. Neumann <wneumann@c...>
Subject: Re: [Caml-list] ocamlbuild and C stubs
On Wed, 7 Mar 2007, Shivkumar Chandrasekaran wrote:

> Is there any (easy) way to use ocamlbuild to handle the automatic 
> (re)-compilation of the C stub files to external libraries? Thanks,

Well, I don't know if it's the best way (I wait for Nicolas to chime in), 
but while playing around with it I tried to get cryptokit to build with 
ocamlbuild.  What I ended up with that worked was a myocamlbuild.ml that 
looks like:

open Ocamlbuild_plugin
open Command
open Arch

let static = false

let zlib = "-DHAVE_ZLIB"
let zlib_lib="-lz"
let zlib_libdir="/usr/lib"
(* let zlib_libdir=/usr/lib64  (* for x86-64 Linux *) *)
let zlib_include="/usr/include"

let libname = "cryptokit"

let cc_map lst = List.fold_right (fun v b -> A"-ccopt"::(A v)::b) lst []
let l_ x = "-L"^x

let _a = "%.a"

let c_files =
   [ "rijndael-alg-fst";  "stubs-aes"
   ; "d3des"; "stubs-des"
   ; "arcfour"; "stubs-arcfour"
   ; "sha1"; "stubs-sha1"
   ; "sha2"; "stubs-sha2"
   ; "sha256"; "stubs-sha256"
   ; "ripemd160"; "stubs-ripemd160"
   ; "pool"; "stubs-pool"
   ; "stubs-md5" ; "stubs-zlib"; "stubs-misc"; "stubs-rng"

let c_objs = List.map (fun f -> f-.-"o") c_files

let _ = dispatch begin function
| Before_rules ->

     rule  "create C library rule"
         begin fun env build ->
           let a = env _a in
           let tags = tags_of_pathname a++"library"++"object"++"archive" in
           Cmd(S([ !Options.ocamlmklib; A"-o"; A libname ]
                 @ (List.map (fun o -> A o) c_objs) @
                 [  A(l_ zlib_libdir); A zlib_lib; T tags ]
     flag  [ "c"; "compile"; ] (S(A"-I"::P".."::(cc_map [("-I"^zlib_include); zlib])));
     flag  [ "library"; "ocaml" ] (S[A"-ccopt"; A(l_ zlib_libdir); A"-cclib"; A zlib_lib]);
     flag  [ "ocaml"; "program" ] (S[A"-ccopt"; A"-L."]);
     if static then flag  [ "byte"; "link" ] (A"-custom");
     flag  [ "byte"; "library"; "link" ]  (S[A"-dllib"; A"-lcryptokit"; A"-cclib"; A"-lcryptokit"]);
     flag  [ "native"; "library"; "link" ]  (S[A"-cclib"; A"-lcryptokit"]);
| _ -> ()

The main thing here being the rule to build the C library.  I then use an 
itarget file to build the library.  This contains


Now, to build the library, I just issue the command
ocamlbuild libcryptokit.otarget

And then to build, for example, the test program I use something like
ocamlbuild test.native -libs nums,unix,cryptokit

I'm sure there's a bunch of cruft in there that could be better handled, 
but it seems to work well for now.

William D. Neumann


"There's just so many extra children, we could just feed the
children to these tigers.  We don't need them, we're not doing 
anything with them.

Tigers are noble and sleek; children are loud and messy."

         -- Neko Case

Life is unfair.  Kill yourself or get over it.
 	-- Black Box Recorder