summaryrefslogtreecommitdiff
path: root/ocamldoc/odoc.ml
blob: 029443aa752f14d7e41e207e6fbca08748907703 (plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
(***********************************************************************)
(*                                                                     *)
(*                             OCamldoc                                *)
(*                                                                     *)
(*            Maxence Guesdon, projet Cristal, INRIA Rocquencourt      *)
(*                                                                     *)
(*  Copyright 2001 Institut National de Recherche en Informatique et   *)
(*  en Automatique.  All rights reserved.  This file is distributed    *)
(*  under the terms of the Q Public License version 1.0.               *)
(*                                                                     *)
(***********************************************************************)

(** Main module for bytecode.
@todo coucou le todo*)

open Config
open Clflags
open Misc
open Format
open Typedtree

module M = Odoc_messages

let print_DEBUG s = print_string s ; print_newline ()

(* we check if we must load a module given on the command line *)
let arg_list = Array.to_list Sys.argv
let (plugins, paths) =
  let rec iter (files, incs) = function
      [] | _ :: [] -> (List.rev files, List.rev incs)
    | "-g" :: file :: q when
        ((Filename.check_suffix file "cmo") or
         (Filename.check_suffix file "cma") or
           (Filename.check_suffix file "cmxs")) ->
      iter (file :: files, incs) q
  | "-i" :: dir :: q ->
      iter (files, dir :: incs) q
  | _ :: q ->
        iter (files, incs) q
  in
  iter ([], []) arg_list

let _ = print_DEBUG "Fin analyse des arguments pour le dynamic load"

(** Return the real name of the file to load,
   searching it in the paths if it is
   a simple name and not in the current directory. *)
let get_real_filename name =
   if Filename.basename name <> name then
     name
   else
     (
      let paths = Filename.current_dir_name :: paths @ [Odoc_config.custom_generators_path] in
      try
        let d = List.find
            (fun d -> Sys.file_exists (Filename.concat d name))
            paths
        in
        Filename.concat d name
      with
        Not_found ->
          failwith (M.file_not_found_in_paths paths name)
     )

let load_plugin file =
  let file = Dynlink.adapt_filename file in
  Dynlink.allow_unsafe_modules true;
  try
    let real_file = get_real_filename file in
    ignore(Dynlink.loadfile real_file)
  with
    Dynlink.Error e ->
      prerr_endline (Odoc_messages.load_file_error file (Dynlink.error_message e)) ;
      exit 1
  | Not_found ->
      prerr_endline (Odoc_messages.load_file_error file "Not_found");
      exit 1
  | Sys_error s
  | Failure s ->
      prerr_endline (Odoc_messages.load_file_error file s);
      exit 1
;;
List.iter load_plugin plugins;;

let () = print_DEBUG "Fin du chargement dynamique eventuel"

let () = Odoc_args.parse ()


let loaded_modules =
  List.flatten
    (List.map
       (fun f ->
         Odoc_info.verbose (Odoc_messages.loading f);
         try
           let l = Odoc_analyse.load_modules f in
           Odoc_info.verbose Odoc_messages.ok;
           l
         with Failure s ->
           prerr_endline s ;
           incr Odoc_global.errors ;
           []
       )
       !Odoc_global.load
    )

let modules = Odoc_analyse.analyse_files ~init: loaded_modules !Odoc_global.files

let _ =
  match !Odoc_global.dump with
    None -> ()
  | Some f ->
      try Odoc_analyse.dump_modules f modules
      with Failure s ->
        prerr_endline s ;
        incr Odoc_global.errors


let _ =
  match !Odoc_args.current_generator with
    None ->
      ()
  | Some gen ->
      let generator = Odoc_gen.get_minimal_generator gen in
      Odoc_info.verbose Odoc_messages.generating_doc;
      generator#generate modules;
      Odoc_info.verbose Odoc_messages.ok

let _ =
  if !Odoc_global.errors > 0 then
  (
   prerr_endline (Odoc_messages.errors_occured !Odoc_global.errors) ;
   exit 1
  )
  else
    exit 0