Commit | Line | Data |
---|---|---|
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 | 20 | my $project = |
34e49164 | 21 | "coccinelle"; |
0708f913 | 22 | my $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 | ||
29 | my $prefix="/usr/local"; | |
30 | my $python=1; | |
174d1640 | 31 | my $noocamlscripting=0; |
0708f913 | 32 | my $opt=".opt"; |
978fd7e5 | 33 | my $tarzan=1; |
90aeb998 C |
34 | my $pydir="pycaml"; |
35 | my $menhirdir="menhirlib"; | |
36 | my $sexpdir="ocamlsexp"; | |
34e49164 C |
37 | |
38 | local $_ = 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 | ||
58 | my $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; | |
71 | sub pr2 { print STDERR "@_\n" } | |
0708f913 | 72 | sub cat { |
34e49164 C |
73 | my ($what) = @_; |
74 | my @list; | |
75 | open(TMP, $what); | |
76 | while(<TMP>) { push @list, "$_"; } | |
77 | \@list; | |
78 | } | |
79 | sub notb { !$_[0] } | |
80 | sub mapf { my ($f, $xs) = @_; [ map { &$f($_) } @{$xs} ] } | |
81 | sub plural { my ($e) = @_; if ($e > 1) { "s" } else { "" } } | |
82 | ||
83 | sub 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 | ###################################################################### | |
97 | pr2 "Checking your configuration.\n"; | |
98 | ||
99 | my $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 | 112 | unless ($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 | 119 | my $ocamlprefix = $noocamlscripting ? "no" : "yes"; |
174d1640 | 120 | |
0708f913 | 121 | if ($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 | ||
179 | pr2 ""; | |
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. | |
186 | We need 3.XX", | |
187 | ); | |
188 | ||
34e49164 C |
189 | #--------------------------------------------------------------------- |
190 | # More developers tools | |
191 | #--------------------------------------------------------------------- | |
192 | ||
193 | #--------------------------------------------------------------------- | |
194 | # Librairies | |
195 | #--------------------------------------------------------------------- | |
196 | ||
3a314143 C |
197 | # Python dev |
198 | if($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 |
225 | my $syspydir=`ocamlfind query pycaml 2> /dev/null | xargs echo -n`; | |
226 | ||
227 | if($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 | |
235 | my $sysmenhirdir=`ocamlfind query menhirLib 2> /dev/null | xargs echo -n`; | |
236 | ||
237 | if($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 | |
245 | my $syssexpdir=`ocamlfind query sexplib 2> /dev/null | xargs echo -n`; | |
246 | ||
247 | if($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 | 268 | if($error) { |
34e49164 C |
269 | pr2 " |
270 | ---------------------------------------------------------------------- | |
0708f913 | 271 | !!!! There seems to have problem, we have found $error missing package" . |
34e49164 | 272 | plural($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 |
276 | on the $project website. !!!! | |
277 | ---------------------------------------------------------------------- | |
278 | "; | |
0708f913 | 279 | } else { |
34e49164 | 280 | |
174d1640 C |
281 | pr2 |
282 | "---------------------------------------------------------------------- | |
34e49164 C |
283 | |
284 | All seems fine for $project. | |
285 | ||
286 | To compile $project type: | |
708f4980 C |
287 | \$ make depend |
288 | \$ make all | |
289 | ||
290 | Or alternatively, for the optimized version: | |
291 | \$ make all.opt | |
b1b2de81 | 292 | If you want both, you could use: |
708f4980 C |
293 | \$ make world |
294 | ||
34e49164 C |
295 | |
296 | To install type: | |
708f4980 | 297 | \$ make install |
34e49164 C |
298 | |
299 | Then, to test $project simply type: | |
708f4980 | 300 | \$ $projectcmdline |
34e49164 C |
301 | |
302 | "; | |
303 | ||
0708f913 C |
304 | if($python) { |
305 | pr2 | |
34e49164 | 306 | "To use the python SmPL feature you may have to set some environment variables. |
174d1640 | 307 | However, they are automatically set by the front-end installed in $prefix/bin. |
34e49164 C |
308 | For bash do: |
309 | export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$prefix/lib | |
174d1640 | 310 | export PYTHONPATH=\$PYTHONPATH:$src/python" |
34e49164 | 311 | } |
174d1640 | 312 | pr2 "----------------------------------------------------------------------"; |
34e49164 C |
313 | } |
314 | ||
34e49164 C |
315 | ###################################################################### |
316 | # Generating the configuration | |
317 | ###################################################################### | |
318 | ||
319 | pr2 "$project target prefix: $prefix (you can use --prefix to override it)"; | |
320 | pr2 "Generating Makefile.config"; | |
321 | open(CONFIG, ">Makefile.config"); | |
322 | print CONFIG "# autogenerated by configure | |
323 | ||
8ba84ae2 C |
324 | # |
325 | INSTALL_PROGRAM?=install -c -m 755 | |
326 | INSTALL_LIB?= install -c -m 755 | |
327 | INSTALL_DATA?= install -c -m 644 | |
328 | ||
34e49164 C |
329 | # Where to install the binary |
330 | BINDIR=$prefix/bin | |
331 | ||
332 | # Where to install the man pages | |
333 | MANDIR=$prefix/man | |
334 | ||
335 | # Where to install the lib | |
336 | LIBDIR=$prefix/lib | |
337 | ||
338 | # Where to install the configuration files | |
339 | SHAREDIR=$src | |
340 | ||
174d1640 C |
341 | BASH_COMPLETION_DIR=/etc/bash_completion.d |
342 | ||
34e49164 C |
343 | # Features |
344 | FEATURE_PYTHON=$python | |
978fd7e5 | 345 | FEATURE_TARZAN=$tarzan |
0708f913 | 346 | |
90aeb998 C |
347 | PYCAMLDIR=$pydir |
348 | MENHIRDIR=$menhirdir | |
349 | SEXPDIR=$sexpdir | |
88e71198 | 350 | DYNLINK=$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. | |
356 | OPTBIN=$opt | |
34e49164 C |
357 | "; |
358 | ||
174d1640 C |
359 | |
360 | my $pythonprefix = $python ? "yes" : "no"; | |
361 | pr2 "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 |
365 | pr2 "Support for ocaml scripting : $ocamlprefix"; |
366 | `cd ocaml; ln -sf ${ocamlprefix}_prepare_ocamlcocci.ml prepare_ocamlcocci.ml;`; | |
367 | `cd ocaml; make depend`; | |
368 | ||
369 | pr2 "Modifying globals/config.ml"; | |
b1b2de81 | 370 | my $command = "perl -p -e 's#Not_found.\*#Not_found->\\\"$src\\\"#' globals/config.ml.in > globals/config.ml"; |
34e49164 C |
371 | `$command`; |
372 |