configure.ml 7.67 KB
Newer Older
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
#use "topfind";;
#require "findlib";;
open Printf

let usage () =
  print_string "\
Configuration of CDuce.

Usage: ./configure [OPTION]...

Defaults for the options are specified in brackets.

Options:
 --help                display this help and exit

Optional features:
 --with-FEATURE        force support for FEATURE [default: autodetect]
 --without-FEATURE     disable support for FEATURE [default: autodetect]

 Available features:
 ocamlopt              use ocamlopt instead of ocamlc to build CDuce
 pxp_wlex              use wlexers for parsing utf8 with PXP [default: false]
 expat                 support for the expat XML parser
 curl                  support for the libcurl library
 netclient             support for the netclient library

27
OCaml/CDuce interface:
28
 --mliface=DIR         build the interface with the OCaml sources in DIR
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
Installation directories:
 --prefix=PREFIX       install files in PREFIX [/usr/local]
 --bindir=DIR          install user executables in DIR [PREFIX/bin]
 --mandir=DIR          install man documentation in DIR [PREFIX/man]

 --wprefix=WPREFIX     root directory of the web-server [/var/www]
 --cgidir=DIR          install the cgi-bin interpreter in DIR [WPREFIX/cgi-bin]
 --htmldir=DIR         install the website in DIR [WPREFIX/html]
 --sessiondir=DIR      store the open sessions of the cgi-bin in DIR 
                       [/tmp/cduce_sessions]
"

let features = 
  [ "ocamlopt", ref `auto;
    "mliface", ref `auto;
    "expat", ref `auto;
    "curl", ref `auto;
    "netclient", ref `auto;
    "pxp_wlex", ref `no ]
  
let vars = 
  [ "prefix", ref "/usr/local";
    "bindir", ref "";
    "mandir", ref "";

    "wprefix", ref "/var/www";
    "cgidir", ref "";
    "htmldir", ref "";

59
60
61
    "sessiondir", ref "/tmp/cduce_sessions";
    "mliface", ref ""
  ]
62
63
64


let src_dirs = ["/usr/src"; "/usr/local/src"; "/tmp"]
65
66
67
68
	
let fatal s = printf "*** Fatal error: %s\n" s; exit 1
let warning s = printf "* Warning: %s\n" s

69
70
71
72
73
74
75
76
77
78
79
let log s =
  let oc = open_out_gen [ Open_append; Open_creat ] 0o600 "configure.log" in
  output_string oc s;
  output_char oc '\n';
  close_out oc;
  flush stdout

let command s =
  log ("==> " ^ s);
  Sys.command (sprintf "%s 2>> configure.log" s) = 0

80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
let start_with s p =
  let ls = String.length s and lp = String.length p in
  if (ls >= lp) && (String.sub s 0 lp = p)
  then Some (String.sub s lp (ls - lp)) else None
    
let parse_arg s =
  if s = "--help" then (usage (); exit 0)
  else
    match start_with s "--with-" with
      | Some f -> (List.assoc f features) := `yes
      | None ->
    match start_with s "--without-" with
      | Some f -> (List.assoc f features) := `no
      | None ->
    let i = String.index s '=' in
    if i < 2 then raise Not_found;
    let n = String.sub s 2 (i - 2) in
    let v = String.sub s (succ i) (String.length s - i - 1) in
    (List.assoc n vars) := v

let () =
101
  print_endline "Configuring CDuce for compilation...\n";
102
103
104
105
106
107
  (try for i = 1 to Array.length Sys.argv - 1 do parse_arg Sys.argv.(i) done
  with Not_found -> usage (); fatal "Incorrect command line");
  (try Sys.remove "configure.log" with Sys_error _ -> ());
  ignore (Sys.command "uname -a >> configure.log")

let print s = print_string s; flush stdout
108
109
110
111
112

let check_feature f p =
  printf "%s: " f;
  match !(List.assoc f features) with
    | `no -> 
113
	print "disabled\n"; false
114
    | `yes -> 
115
	print "checking... ";
116
	if p () 
117
118
	then (print "ok\n"; true) 
	else (print "failed !\n"; fatal "Required feature is not available")
119
    | `auto -> 
120
	print "autodetecting... ";
121
	if p () 
122
123
124
125
126
	then (print "enabled\n"; true)
	else (print "disabled\n"; false)

let native = 
  check_feature "ocamlopt" (fun () -> command "ocamlfind ocamlopt")
127
128

let check_pkg p () =
129
130
131
132
133
134
  try
(*    ignore (Findlib.package_property
      [ (if native then "native" else "bytecode") ]
      p "archive"); *)
    command 
      (sprintf 
135
	 "ocamlfind ocaml%s -package %s -linkpkg -o configure.try && rm -f configure.try"
136
137
138
	 (if native then "opt" else "c")
	 p)
  with Not_found -> false
139
140

let need_pkg p =
141
  printf "Checking for package %s... " p; flush stdout;
142
  if not (check_pkg p ()) 
143
144
  then (print "failed !\n"; fatal "Required package is not available")
  else (print "ok\n")
145
146
147
148
149
150
151
152
153

let dir ?def d = 
  let s = !(List.assoc d vars) in
  if s <> "" then s
  else match def with 
    | Some x -> x 
    | None -> fatal (sprintf "%s cannot be empty" d)


154
155
156
157
158
let exe = match Sys.os_type with 
  | "Cygwin" ->
      print "Cygwin detected... executable will have .exe extension"; "exe" 
  | _ -> ""

159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
let rec search_sources source_list =
   match source_list with
    |   [] -> (print "\
* Warning: no OCaml sources found in standard locations\n\
* Warning: please specify the source location with --mliface option\n\
* Warning: OCaml interface will not be compiled\n"; "")
    |   dir :: tail -> 
          print ("Looking for Ocaml sources in " ^ dir ^" ...\n"); flush stdout;
          if Sys.command ("find " ^ dir ^ " -maxdepth 3 -name ocamlcomp.sh -fprintf .try %h 2> /dev/null") = 0
          then try 
               let result = input_line (open_in ".try") in 
               ignore(Sys.command "rm .try") ;
               print ("Found OCaml sources in" ^ result ^ "\n");
               result
               with End_of_file -> search_sources tail
          else search_sources tail
175
176


177
let ml_interface = 
178
179
  let dir1 = !(List.assoc "mliface" vars) in 
  let dir = (if dir1 = "" then search_sources src_dirs else dir1) in
180
181
182
183
184
185
186
187
188
  if dir = "" then `no
  else
    let file = if native then "types.cmx" else "types.cmo" in
    printf "Checking for ocaml compiler modules ..."; flush stdout;
    if Sys.file_exists (Filename.concat dir file) 
    then (print "ok (flat model)\n"; `flat dir)
    else
      if Sys.file_exists 
	(Filename.concat (Filename.concat dir "typing") file) then
189
	  (print "ok'\n"; `tree dir)
190
191
      else
	(print "not found\n";
192
193
	 fatal ("Cannot find ocaml compiler compiled modules, eg: " ^ file ^
                "\n*** try configure with the option --mliface=DIR"))
194
  
195
196
let expat = check_feature "expat" (check_pkg "expat")
let curl = check_feature "curl" (check_pkg "curl")
197
let netclient = check_feature "netclient" (check_pkg "netclient")
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
let pxp_wlex = check_feature "pxp_wlex" (check_pkg "pxp-wlex-utf8")
let prefix = dir "prefix"
let bindir = dir ~def:(prefix^"/bin") "bindir"
let mandir = dir ~def:(prefix^"/man") "mandir"
let wprefix = dir "wprefix"
let cgidir = dir ~def:(wprefix^"/cgi-bin") "cgidir"
let htmldir = dir ~def:(wprefix^"/html") "htmldir"
let sessiondir = dir "sessiondir"

let curl,netclient = 
  match curl,netclient with
    | true,true -> 
	warning "Both netclient and curl are available. Will use curl.";
	true,false
    | false,false ->
	warning "No package for loading external URLs.";
	false,false
    | c,n -> c,n

let required_packages = 
  ["camlp4"; "num"; 
   "pcre"; "ulex"; "cgi"; "netstring";
   "pxp-engine"; "pxp-lex-iso88591"
  ]

let () =
  List.iter need_pkg required_packages;
  if not pxp_wlex then need_pkg "pxp-lex-utf8";

227
  print "Creating Makefile.conf...\n";
228
229
230
231

  let out = open_out "Makefile.conf" in
  fprintf out "# This file has been generated by the configure script\n";
  fprintf out "NATIVE=%b\n" native;
232
233
234
235
  (match ml_interface with
    | `no -> fprintf out "ML_INTERFACE=false\n"
    | `flat d -> fprintf out "ML_INTERFACE=flat\nML_MODULES=%s\n" d
    | `tree d -> fprintf out "ML_INTERFACE=tree\nML_MODULES=%s\n" d);
236
237
238
239
240
241
242
243
244
245
246
247
  fprintf out "EXPAT=%b\n" expat;
  fprintf out "CURL=%b\n" curl;
  fprintf out "NETCLIENT=%b\n" netclient;
  fprintf out "PXP_WLEX=%b\n" pxp_wlex;
  fprintf out "BINDIR=%s\n" bindir;
  fprintf out "MANDIR=%s\n" mandir;
  fprintf out "CGI_DIR=%s\n" cgidir;
  fprintf out "HTML_DIR=%s\n" htmldir;
  fprintf out "SESSION_DIR=%s\n" sessiondir;
  fprintf out "EXE=%s\n" exe;
  fprintf out "PROFILE=false\n";
  close_out out