• en

A plugin example for compiling Json printer/parser from .atd file with atdgen

open Ocamlbuild_plugin
open Command

let () =
  Options.use_ocamlfind := true;
  Options.make_links:= false

let atdgen_rules () = 
 let tag_atdgen env patterns =
   List.iter (fun p ->
       tag_file (env p) (Tags.elements (Tags.of_list ["package(atdgen)"]))
     ) patterns in
 rule "atdgen: .atd -> _t.ml*"
    ~prods:["%_t.ml";"%_t.mli"]
    ~dep:"%.atd"
    (begin fun env build ->
      let atdgen = "atdgen" in
      tag_atdgen env ["%_t.ml";"%_t.mli"];
      Cmd (S [A atdgen; A "-t"; P (env "%.atd")]);
     end) ;
  rule "atdgen: .atd -> _j.ml*"
    ~prods:["%_j.ml";"%_j.mli";]
    ~dep:"%.atd"
    (begin fun env build ->
      let atdgen = "atdgen" in
      tag_atdgen env ["%_j.ml"; "%_j.mli"];
      Cmd (S [A atdgen; A "-j"; A "-j-std"; P (env "%.atd")]);
     end) ;
  rule "atdgen: .atd -> _v.ml*"
    ~prods:["%_v.ml";"%_v.mli";]
    ~dep:"%.atd"
    (begin fun env build ->
      let atdgen = "atdgen" in
      tag_atdgen env ["%_v.ml";"%_v.mli";];
      Cmd (S [A atdgen; A "-v"; P (env "%.atd")]);
     end) ;
  ()

let () =
  dispatch begin function
  | After_rules -> atdgen_rules ()
  | _ -> ()
  end

and add tag package(atdgen) into the _tags file:

<{files that use Yojson or Atd library}.{ml,mli,byte,native}>:package(atdgen)