Release coccinelle-0.2.5-rc2
[bpt/coccinelle.git] / configure
CommitLineData
34e49164 1#!/usr/bin/perl
708f4980 2
fc1ad971 3# Author: Yoann Padioleau
708f4980 4
34e49164
C
5######################################################################
6# Prelude
7######################################################################
8
9# Yes I know about autoconf ... and autoconf sux.
10
11# assume standard: diff
12# assume standard: perl
13
708f4980 14#TODO check python 2.5 ?
34e49164 15
978fd7e5
C
16# need latex and hevea if want to compile the documentation
17
34e49164
C
18#old: --with-menhir=/path/to/menhirLib or `ocamlfind query menhirLib`
19
0708f913 20my $project =
34e49164 21 "coccinelle";
0708f913 22my $projectcmdline =
978fd7e5 23 "spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c";
34e49164 24
34e49164
C
25######################################################################
26# Options
27######################################################################
28
29my $prefix="/usr/local";
30my $python=1;
174d1640 31my $noocamlscripting=0;
0708f913 32my $opt=".opt";
978fd7e5 33my $tarzan=1;
90aeb998
C
34my $pydir="pycaml";
35my $menhirdir="menhirlib";
36my $sexpdir="ocamlsexp";
34e49164
C
37
38local $_ = join ' ', @ARGV;
39
40# Parse options
c491d8ee 41/-h/ || /--help/ and die "usage: $0 [--prefix=path] [--without-python] [--without-ocaml] [--no-opt]\n\n\t--no-opt\tDo not use the optimimized version of OCaml\n\t--opt\tUse the optimimized version of OCaml\n\n";
34e49164
C
42/--prefix=([^ ]*)/ and $prefix = $1;
43/--without-python/ and $python = 0;
c491d8ee 44/--without-ocaml/ and $noocamlscripting = 1;
0708f913 45/--no-opt/ and $opt = "";
8ba84ae2 46/--opt/ and $opt = ".opt";
34e49164 47
978fd7e5
C
48#tarzan by default (used by score file parsing and now also for sexp_ast_c.ml)
49
50
34e49164
C
51#if($ARGV[0] =~ "--prefix=(.*)") {
52# $prefix = $1;
53#}
54#if($ARGV[1] =~ "--without-python") {
55# $python = 0;
56#}
57
58my $src="$prefix/share/$project";
59
60######################################################################
61# Side effects
62######################################################################
63
64
65######################################################################
66# Helpers
67######################################################################
68#BEGIN { die "need Perl 5 or greater" if $] < 5 ; }
69
70#use Common;
71sub pr2 { print STDERR "@_\n" }
0708f913 72sub cat {
34e49164
C
73 my ($what) = @_;
74 my @list;
75 open(TMP, $what);
76 while(<TMP>) { push @list, "$_"; }
77 \@list;
78}
79sub notb { !$_[0] }
80sub mapf { my ($f, $xs) = @_; [ map { &$f($_) } @{$xs} ] }
81sub plural { my ($e) = @_; if ($e > 1) { "s" } else { "" } }
82
83sub check_config { my ($command, $expect, $msggood, $msgbad) = @_;
84 my $error = 0;
0708f913 85
34e49164
C
86 my $full = cat($command);
87 my $res = join(" ", @{$full});
88# pr2 $res;
89 if(notb($res =~ $expect)) { $error++; pr2 "!!!! $msgbad !!!!"; }
90 else { pr2 $msggood }
91 return $error;
92}
93
94######################################################################
95# Let's go
96######################################################################
97pr2 "Checking your configuration.\n";
98
99my $error = 0;
100
34e49164
C
101#---------------------------------------------------------------------
102# Compilers and runtimes
103#---------------------------------------------------------------------
174d1640 104
0708f913 105$error +=
34e49164 106 check_config("echo \"1;;\\n\" | ocaml |",
174d1640 107 "Objective(.*) 3.\(09|1[0-9]\)",
34e49164
C
108 "OCaml (the wonderful language) is present.",
109 "The program ocaml is missing or is not a good version. We need at least 3.09",
110 );
111
3a314143 112unless ($noocamlscripting) {
174d1640
C
113$noocamlscripting = check_config("echo \"1;;\\n\" | ocaml |",
114 "Objective(.*) 3.1[1-9]",
115 "OCaml >= 3.11 is present. OCaml scripting activated.",
116 "OCaml scripting disabled. We need at least OCaml 3.11",
117 );
c491d8ee 118}
88e71198 119my $ocamlprefix = $noocamlscripting ? "no" : "yes";
174d1640 120
0708f913 121if ($opt eq ".opt") {
8ba84ae2
C
122 my $opt_check = `which ocamlc.opt 2> /dev/null`;
123 if($opt_check =~ "/ocamlc.opt\$") {
124 pr2 "ocamlc.opt is present.";
125 }
126 else {
127 $opt="";
128 pr2 "ocamlc.opt not found";
129 }
130
131 my $opt_check = `which ocamlopt.opt 2> /dev/null`;
132 if($opt_check =~ "/ocamlopt.opt\$") {
133 pr2 "ocamlopt.opt is present.";
134 }
135 else {
136 $opt="";
137 pr2 "ocamlopt.opt not found";
138 }
139
140 my $opt_check = `which ocamldep.opt 2> /dev/null`;
141 if($opt_check =~ "/ocamldep.opt\$") {
142 pr2 "ocamldep.opt is present.";
143 }
144 else {
0708f913 145 $opt="";
8ba84ae2
C
146 pr2 "ocamldep.opt not found";
147 }
148
149 my $opt_check = `which ocamllex.opt 2> /dev/null`;
150 if($opt_check =~ "/ocamllex.opt\$") {
151 pr2 "ocamllex.opt is present.";
0708f913
C
152 }
153 else {
8ba84ae2
C
154 $opt="";
155 pr2 "ocamllex.opt not found";
156 }
157
158 if($opt eq "") {
159 pr2 "At least one native OCaml tool have not been found.";
160 pr2 "Desactivation of all native OCaml tools for compilation.";
0708f913
C
161 }
162}
163
34e49164
C
164#we have cached the result of menhir in the tgz we build.
165
0708f913 166#$error +=
34e49164
C
167# check_config("menhir --version |",
168# "menhir, version 20071212",
169## "menhir, version 2006.*",
170# "Menhir (the parser generator) is present.",
171# "The program menhir is missing or is not a good version.",
172# );
173
174
175#---------------------------------------------------------------
176# Developers tools
177#---------------------------------------------------------------
178
179pr2 "";
180
181$error += check_config(
182 "make -v 2>&1 |grep Make|",
708f4980 183 "GNU Make [^0-9]*3\.[0-9]+.*", #version 3.79.1, 3.81
34e49164
C
184 "make (gnu version) is present.",
185 "The program gnu make is missing or is not a good version.
186We need 3.XX",
187);
188
34e49164
C
189#---------------------------------------------------------------------
190# More developers tools
191#---------------------------------------------------------------------
192
193#---------------------------------------------------------------------
194# Librairies
195#---------------------------------------------------------------------
196
3a314143
C
197# Python dev
198if($python) {
199 if(check_config(
200 "python --version 2>&1 |",
201 "Python 2\.[567]\..*",
202 "python is present",
203 "python is missing or is not a good version."
204 ))
205 {
206 $python=0;
207 }
208 if($python) {
209 my $PY_PREFIX = `python pycaml/getprefix.py | tr -d '\n'`;
210 my $PY_VERSION = `python pycaml/getversion.py | tr -d '\n'`;
211 my $python_hdr = "$PY_PREFIX/include/python$PY_VERSION/Python.h";
212 if(check_config(
213 "ls $python_hdr 2> /dev/null | ",
214 $python_hdr,
215 "Python.h found",
216 "Python.h missing - You need to install python-dev"
217 ))
218 {
219 $python=0
220 }
221 }
222}
223
90aeb998
C
224# pycaml. Binding between Python and OCaml
225my $syspydir=`ocamlfind query pycaml 2> /dev/null | xargs echo -n`;
226
227if($syspydir) {
228 $pydir=$syspydir;
174d1640
C
229 pr2 "'pycaml' library is present in $pydir";
230} else {
231 pr2 "'pycaml' library is not present. A local copy will be used.";
90aeb998
C
232}
233
234# menhirLib. Runtime system for the parsers generated with menhir
235my $sysmenhirdir=`ocamlfind query menhirLib 2> /dev/null | xargs echo -n`;
236
237if($sysmenhirdir) {
238 $menhirdir=$sysmenhirdir;
174d1640
C
239 pr2 "'menhirLib' library is present in $menhirdir";
240} else {
241 pr2 "'menhirLib' library is not present. A local copy will be used..";
90aeb998
C
242}
243
244# sexplib. Runtime system for the parsers generated with menhir
245my $syssexpdir=`ocamlfind query sexplib 2> /dev/null | xargs echo -n`;
246
247if($syssexpdir) {
248 $sexpdir=$syssexpdir;
174d1640
C
249 pr2 "'sexplib' library is present in $sexpdir";
250} else {
251 pr2 "'sexplib' library is not present. A local copy will be used..";
90aeb998
C
252}
253
34e49164
C
254######################################################################
255# Generate config files (platform/portability issues)
256######################################################################
257
258
259######################################################################
260# Generate globals files (features issues)
261######################################################################
262
263######################################################################
0708f913 264# Diagnostic
34e49164
C
265######################################################################
266
267
0708f913 268if($error) {
34e49164
C
269 pr2 "
270----------------------------------------------------------------------
0708f913 271!!!! There seems to have problem, we have found $error missing package" .
34e49164 272plural($error) . ".
0708f913
C
273" . (($error > 1) ? "Some of those packages" : "This package") .
274 " may be installed by picking " . ($error > 1 ? "them" : "it") .
34e49164
C
275 " in $project-dependencies.tgz available
276on the $project website. !!!!
277----------------------------------------------------------------------
278";
0708f913 279} else {
34e49164 280
174d1640
C
281 pr2
282"----------------------------------------------------------------------
34e49164
C
283
284All seems fine for $project.
285
286To compile $project type:
708f4980
C
287 \$ make depend
288 \$ make all
289
290Or alternatively, for the optimized version:
291 \$ make all.opt
b1b2de81 292If you want both, you could use:
708f4980
C
293 \$ make world
294
34e49164
C
295
296To install type:
708f4980 297 \$ make install
34e49164
C
298
299Then, to test $project simply type:
708f4980 300 \$ $projectcmdline
34e49164
C
301
302";
303
0708f913
C
304if($python) {
305 pr2
34e49164 306"To use the python SmPL feature you may have to set some environment variables.
174d1640 307However, they are automatically set by the front-end installed in $prefix/bin.
34e49164
C
308For bash do:
309export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$prefix/lib
174d1640 310export PYTHONPATH=\$PYTHONPATH:$src/python"
34e49164 311 }
174d1640 312 pr2 "----------------------------------------------------------------------";
34e49164
C
313}
314
34e49164
C
315######################################################################
316# Generating the configuration
317######################################################################
318
319pr2 "$project target prefix: $prefix (you can use --prefix to override it)";
320pr2 "Generating Makefile.config";
321open(CONFIG, ">Makefile.config");
322print CONFIG "# autogenerated by configure
323
8ba84ae2
C
324#
325INSTALL_PROGRAM?=install -c -m 755
326INSTALL_LIB?= install -c -m 755
327INSTALL_DATA?= install -c -m 644
328
34e49164
C
329# Where to install the binary
330BINDIR=$prefix/bin
331
332# Where to install the man pages
333MANDIR=$prefix/man
334
335# Where to install the lib
336LIBDIR=$prefix/lib
337
338# Where to install the configuration files
339SHAREDIR=$src
340
174d1640
C
341BASH_COMPLETION_DIR=/etc/bash_completion.d
342
34e49164
C
343# Features
344FEATURE_PYTHON=$python
978fd7e5 345FEATURE_TARZAN=$tarzan
0708f913 346
90aeb998
C
347PYCAMLDIR=$pydir
348MENHIRDIR=$menhirdir
349SEXPDIR=$sexpdir
88e71198 350DYNLINK=$ocamlprefix
90aeb998 351
0708f913
C
352# The OPTBIN variable is here to allow to use ocamlc.opt instead of
353# ocaml, when it is available, which speeds up compilation. So
354# if you want the fast version of the ocaml chain tools, set this var
355# or setenv it to \".opt\" in your startup script.
356OPTBIN=$opt
34e49164
C
357";
358
174d1640
C
359
360my $pythonprefix = $python ? "yes" : "no";
361pr2 "Support for python scripting : $pythonprefix";
362`cd python; ln -sf ${pythonprefix}_pycocci.ml pycocci.ml; `;
34e49164
C
363`cd python; make depend`;
364
174d1640
C
365pr2 "Support for ocaml scripting : $ocamlprefix";
366`cd ocaml; ln -sf ${ocamlprefix}_prepare_ocamlcocci.ml prepare_ocamlcocci.ml;`;
367`cd ocaml; make depend`;
368
369pr2 "Modifying globals/config.ml";
b1b2de81 370my $command = "perl -p -e 's#Not_found.\*#Not_found->\\\"$src\\\"#' globals/config.ml.in > globals/config.ml";
34e49164
C
371`$command`;
372