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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 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 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
|
(*
#use "topfind";;
#require "findlib";;
*)
open Printf
let not_distrib = Sys.file_exists "Makefile.distrib"
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]
pxp support for the PXP XML parser
expat support for the expat XML parser
curl support for the libcurl library
netclient support for the netclient library
cgi support for the cgi library
OCaml/CDuce interface:
--mliface=DIR build the interface with the OCaml sources in DIR
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]
--docdir=DIR install the rest of the doc in DIR [PREFIX/doc/cduce]
";
if not_distrib then print_string "
--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;
"pxp", ref `auto;
"expat", ref `auto;
"curl", ref `auto;
"netclient", ref `auto;
"cgi", ref `auto;
"pxp_wlex", ref `no ]
let vars =
[ "prefix", ref "/usr/local";
"bindir", ref "";
"mandir", ref "";
"docdir", ref "";
"wprefix", ref "/var/www";
"cgidir", ref "";
"htmldir", ref "";
"sessiondir", ref "/tmp/cduce_sessions";
"mliface", ref ""
]
let src_dirs = ["/usr/src"; "/usr/local/src"; "/tmp"]
let fatal s = printf "*** Fatal error: %s\n" s; exit 1
let warning s = printf "* Warning: %s\n" s
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
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 () =
print_endline "Configuring CDuce for compilation...\n";
(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
let check_feature f p =
printf "%s: " f;
match !(List.assoc f features) with
| `no ->
print "disabled\n"; false
| `yes ->
print "checking... ";
if p ()
then (print "ok\n"; true)
else (print "failed !\n"; fatal "Required feature is not available")
| `auto ->
print "autodetecting... ";
if p ()
then (print "enabled\n"; true)
else (print "disabled\n"; false)
let native =
check_feature "ocamlopt" (fun () -> command "ocamlfind ocamlopt")
let check_pkg p () =
try
(* ignore (Findlib.package_property
[ (if native then "native" else "bytecode") ]
p "archive"); *)
command
(sprintf
"ocamlfind ocaml%s -package %s -linkpkg -o configure.try && rm -f configure.try"
(if native then "opt" else "c")
p)
with Not_found -> false
let need_pkg p =
printf "Checking for package %s... " p; flush stdout;
if not (check_pkg p ())
then (print "failed !\n"; fatal "Required package is not available")
else (print "ok\n")
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)
let exe = match Sys.os_type with
| "Win32" ->
print "Win32 detected... executable will have .exe extension\n"; ".exe"
| "Cygwin" ->
print "Cygwin detected... executable will have .exe extension\n"; ".exe"
| _ -> ""
let add_icon = match Sys.os_type with
| "Win32" | "Cygwin" -> true
| _ -> false
let check_mliface dir =
(* Sys.file_exists (Filename.concat dir "typing/types.ml") *)
Sys.file_exists (Filename.concat dir "typing/types.ml")
let ocaml_stdlib () =
if (Sys.command "ocamlc -where > ocaml_stdlib" <> 0) then
fatal "Can't run ocamlc to get OCaml standard library path";
let ic = open_in "ocaml_stdlib" in
let s = input_line ic in
close_in ic;
Sys.remove "ocaml_stdlib";
s
let make_absolute dir =
if Filename.is_relative dir
then Filename.concat (Sys.getcwd ()) dir
else dir
let ml_interface =
let dir1 = !(List.assoc "mliface" vars) in
let dirs = if dir1 = "" then [] else [ make_absolute dir1 ] in
print "ocaml sources... ";
let rec loop = function
| [] ->
print "not found (the interface will not be built)\n";
None
| d::dirs ->
if check_mliface d then
(print ("found: " ^ d ^ "\n"); Some d)
else loop dirs
in
loop dirs
let pxp = check_feature "pxp" (check_pkg "pxp")
let expat = check_feature "expat" (check_pkg "expat")
let curl = check_feature "curl" (check_pkg "curl")
let netclient = check_feature "netclient" (check_pkg "netclient")
let cgi = check_feature "cgi" (check_pkg "netcgi1")
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 docdir = dir ~def:(prefix^"/doc/cduce") "docdir"
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 pxp,expat =
match pxp,expat with
| true,true ->
warning "Both PXP and expat are available. Will build both and use expat by default.";
true,true
| false,false ->
warning "No package for parsing XML documents.";
false,false
| c,n -> c,n
let cgi =
if not(cgi) then
(warning "No cgi package found: dtd2cduce and the web interface won't be built";
false)
else true
let required_packages = ["camlp4"; "num"; "pcre"; "ulex"; "netstring"]
let has_forpack =
print "testing for -for-pack option: ";
let comm =
match Sys.os_type with
| "Win32" -> "ocamlc -for-pack foo"
| _ -> "ocamlc -for-pack foo 2> /dev/null" in
if Sys.command comm = 0 then
(print "available\n"; true)
else
(print "not available\n"; false)
let has_natdynlink =
print "testing for native dynlink: ";
if Sys.command "ocamlopt -o foo dynlink.cmxa && rm -f foo" = 0 then
(printf "available\n"; true)
else
(print "not available\n"; false)
let () =
List.iter need_pkg required_packages;
if pxp then (
need_pkg "pxp-engine";
need_pkg "pxp-lex-iso88591";
if not pxp_wlex then need_pkg "pxp-lex-utf8";
);
print "Creating Makefile.conf...\n";
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;
(match ml_interface with
| Some d -> fprintf out "ML_INTERFACE=true\nOCAML_SRC=%s\n" d
| None -> fprintf out "ML_INTERFACE=false\n");
fprintf out "PXP=%b\n" pxp;
fprintf out "EXPAT=%b\n" expat;
fprintf out "CURL=%b\n" curl;
fprintf out "NETCLIENT=%b\n" netclient;
fprintf out "CGI=%b\n" cgi;
fprintf out "PXP_WLEX=%b\n" pxp_wlex;
fprintf out "BINDIR=%s\n" bindir;
fprintf out "MANDIR=%s\n" mandir;
fprintf out "DOCDIR=%s\n" docdir;
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 "ADDICON=%b\n" add_icon;
fprintf out "PROFILE=false\n";
fprintf out "FORPACK=%b\n" has_forpack;
fprintf out "NATDYNLINK=%b\n" has_natdynlink;
close_out out
|