-
Notifications
You must be signed in to change notification settings - Fork 78
/
Copy pathodoc.ml
130 lines (116 loc) · 3.99 KB
/
odoc.ml
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
(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* 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 GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
(** Main module for bytecode.
@todo todo*)
module M = Odoc_messages
let () = Language_extension.set_universe_and_enable_all
Language_extension.Universe.maximal
(* 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") ||
(Filename.check_suffix file "cma") ||
(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
(** 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 () = 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