Version française
Home     About     Download     Resources     Contact us    
Browse thread
Ocamlbuild with findlib + camlp4
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Romain Bardou <Romain.Bardou@l...>
Subject: Re: [Caml-list] Ocamlbuild with findlib + camlp4
> Anyway, ideally one should be able to specify in the _tags file the findlib
> packages that each ml file depends upon.

Well, doesn't the following plugin do what you want?

###########################
open Ocamlbuild_plugin
open Command

(* list of packages *)
let packages = ["nums"; "str"; "unix"]

(* ocamlfind command *)
let ocamlfind x = S[A"ocamlfind"; x]

let _ = dispatch begin function
   | Before_options ->
       Options.ocamlc := ocamlfind & A"ocamlc";
       Options.ocamlopt := ocamlfind & A"ocamlopt";
       Options.ocamldep := ocamlfind & A"ocamldep";
       Options.ocamldoc := ocamlfind & A"ocamldoc"
   | After_rules ->
       flag ["ocaml"; "link"; "linkpkg"] & A"-linkpkg";
       List.iter
	(fun pkg -> flag ["ocaml"; "pkg_"^pkg] & S[A"-package"; A pkg])
	packages
   | _ -> ()
end
###########################

This tells Ocamlbuild to use ocamlfind, and also defines some tags:
* The "linkpkg" tag, which adds the "-linkpkg" flag when linking. Tag 
your output files with it (your .byte or .native files), not the source 
files.
* The "pkg_nums", "pkg_str", and "pkg_unix" tags (simply add packages to 
the "packages" list if you need other packages) which add the "-package 
nums", "-package str" and "-package unix" options respectively. Tag your 
source files with the -package options they should use when compiling, 
and your output files with the -package options they should use when 
linking.

As an exercise you could even add a tag "ocamlfind" which would allow 
you to use ocamlfind only when you want to.

Now you should be able to use ocamlfind with different options depending 
on tags.

Disclaimer:
* I know it compiles but I didn't have time to construct a dummy project 
which would allow me to test this extension.
* It does nothing to handle camlp4, but you should be able to add the 
correct options yourself.

Please tell me if it is what you needed or not :)

-- 
Romain Bardou