File: generators.ml

package info (click to toggle)
ocaml-obuild 0.1.11-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 796 kB
  • sloc: ml: 6,570; sh: 171; ansic: 34; makefile: 11
file content (65 lines) | stat: -rw-r--r-- 2,862 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
open Ext.Filepath
open Helper
open Gconf

exception GeneratorFailed of string
exception GeneratorNotFound of string

type t = {
  suffix : string;
  modname : (Modname.t -> Modname.t);
  commands : (filepath -> filepath -> string -> string list list);
  generated_files : (filename -> string -> filename);
}

let generators = ref [
    { suffix = "mll";
      modname = (fun m -> m);
      commands = (fun src dest_root _ -> [[Prog.getOcamlLex (); "-o"; (fp_to_string dest_root) ^ ".ml"; fp_to_string src]]);
      generated_files = (fun f _ -> (chop_extension f) <.>  "ml")
    };
    { suffix = "mly";
      modname = (fun m -> m);
      commands = (fun src dest_root _ -> [[Prog.getOcamlYacc (); "-b"; fp_to_string dest_root; fp_to_string src]]);
      generated_files = (fun f _ -> (chop_extension f) <.>  "ml")
    };
    { suffix = "atd";
      modname = (fun m -> Modname.atd_modname m);
      commands = (fun src dest_root moduleName ->
                   let len = String.length moduleName in
                   let ext = String.sub moduleName (len - 2) 2 in
                   match ext with
                   | "_t" ->
                     [[Prog.getAtdGen (); "-t"; fp_to_string src; "-o"; (fp_to_string dest_root)]]
                   | "_v" ->
                     [[Prog.getAtdGen (); "-v"; fp_to_string src; "-o"; (fp_to_string dest_root)]]
                   | "_j" ->
                     [[Prog.getAtdGen (); "-j"; "-j-std"; fp_to_string src; "-o"; (fp_to_string dest_root)]]
                   | _ -> raise (GeneratorFailed ("extension " ^ ext ^ " is unknown"))
                 );
      generated_files = (fun f moduleName -> let base = fn_to_string (chop_extension f) in
                          let len = String.length moduleName in
                          let ext = String.sub moduleName (len - 2) 2 in
                          match ext with
                          | "_t" -> fn (base ^ "_t.ml")
                          | "_v" -> fn (base ^ "_v.ml")
                          | "_j" -> fn (base ^ "_j.ml")
                          | _ -> raise (GeneratorFailed ("extension " ^ ext ^ " is unknown"))
                        )
    };
  ]

let is_generator_ext ext = List.exists (fun gen -> gen.suffix = ext) !generators
let get_generator fp =
  let ext = Filetype.of_filepath fp in
  let s = match ext with Filetype.FileOther s -> s | _ -> raise (GeneratorNotFound (fp_to_string fp)) in
  List.find (fun gen -> gen.suffix = s) !generators
  
let run dest src modName =
  verbose Debug "  generator dest = %s src = %s\n%!" (fp_to_string dest) (fp_to_string src);
  let gen = get_generator src in
  let args = gen.commands src dest modName in
  List.iter (fun arg ->
      match Process.run arg with
      | Process.Success (_, warnings,_) -> print_warnings warnings
      | Process.Failure er -> raise (GeneratorFailed er) ) args