1168f581abae91d8db1a40aaa0e9b5318562c691
[bpt/coccinelle.git] / .#Makefile.1.122
1 # Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
2 # Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
3 # This file is part of Coccinelle.
4 #
5 # Coccinelle is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, according to version 2 of the License.
8 #
9 # Coccinelle is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # The authors reserve the right to distribute this or future versions of
18 # Coccinelle under other licenses.
19
20
21 #############################################################################
22 # Configuration section
23 #############################################################################
24
25 -include Makefile.config
26
27 VERSION=$(shell cat globals/config.ml |grep version |perl -p -e 's/.*"(.*)".*/$$1/;')
28
29 ##############################################################################
30 # Variables
31 ##############################################################################
32 TARGET=spatch
33
34 SRC=flag_cocci.ml cocci.ml testing.ml test.ml main.ml
35
36
37 ifeq ($(FEATURE_PYTHON),1)
38 PYCMA=pycaml/pycaml.cma
39 PYDIR=pycaml
40 PYLIB=dllpycaml_stubs.so
41 # the following is essential for Coccinelle to compile under gentoo (wierd)
42 OPTLIBFLAGS=-cclib dllpycaml_stubs.so
43 else
44 PYCMA=
45 PYDIR=
46 PYLIB=
47 OPTLIBFLAGS=
48 endif
49
50
51 SYSLIBS=str.cma unix.cma
52 LIBS=commons/commons.cma globals/globals.cma\
53 ctl/ctl.cma \
54 parsing_cocci/cocci_parser.cma parsing_c/parsing_c.cma \
55 engine/cocciengine.cma popl09/popl.cma \
56 extra/extra.cma $(PYCMA) python/coccipython.cma
57
58 MAKESUBDIRS=commons globals menhirlib $(PYDIR) ctl parsing_cocci parsing_c \
59 engine popl09 extra python
60 INCLUDEDIRS=commons commons/ocamlextra globals menhirlib $(PYDIR) ctl \
61 parsing_cocci parsing_c engine popl09 extra python
62
63 ##############################################################################
64 # Generic variables
65 ##############################################################################
66
67 INCLUDES=$(INCLUDEDIRS:%=-I %)
68
69 OBJS= $(SRC:.ml=.cmo)
70 OPTOBJS= $(SRC:.ml=.cmx)
71
72 EXEC=$(TARGET)
73
74 ##############################################################################
75 # Generic ocaml variables
76 ##############################################################################
77
78 OCAMLCFLAGS= #-g -dtypes # -w A
79
80 # for profiling add -p -inline 0
81 # but 'make forprofiling' below does that for you.
82 # This flag is also used in subdirectories so don't change its name here.
83 OPTFLAGS=
84 # the following is essential for Coccinelle to compile under gentoo
85 # but is now defined above in this file
86 #OPTLIBFLAGS=-cclib dllpycaml_stubs.so
87
88 # the OPTBIN variable is here to allow to use ocamlc.opt instead of
89 # ocaml, when it is available, which speeds up compilation. So
90 # if you want the fast version of the ocaml chain tools, set this var
91 # or setenv it to ".opt" in your startup script.
92 OPTBIN= #.opt
93
94 OCAMLC=ocamlc$(OPTBIN) $(OCAMLCFLAGS) $(INCLUDES)
95 OCAMLOPT=ocamlopt$(OPTBIN) $(OPTFLAGS) $(INCLUDES)
96 OCAMLLEX=ocamllex #-ml # -ml for debugging lexer, but slightly slower
97 OCAMLYACC=ocamlyacc -v
98 OCAMLDEP=ocamldep #$(INCLUDES)
99 OCAMLMKTOP=ocamlmktop -g -custom $(INCLUDES)
100
101 # can also be set via 'make static'
102 STATIC= #-ccopt -static
103
104 # can also be unset via 'make purebytecode'
105 BYTECODE_STATIC=-custom
106
107 ##############################################################################
108 # Top rules
109 ##############################################################################
110 .PHONY: all all.opt opt top clean configure
111 .PHONY: $(MAKESUBDIRS) $(MAKESUBDIRS:%=%.opt)
112
113 all:
114 $(MAKE) subdirs
115 $(MAKE) $(EXEC)
116
117 opt:
118 $(MAKE) subdirs.opt
119 $(MAKE) $(EXEC).opt
120
121 all.opt: opt
122 top: $(EXEC).top
123
124 subdirs: $(MAKESUBDIRS)
125 subdirs.opt: $(MAKESUBDIRS:%=%.opt)
126
127 $(MAKESUBDIRS):
128 $(MAKE) -C $@ OCAMLCFLAGS="$(OCAMLCFLAGS)" all
129
130 $(MAKESUBDIRS:%=%.opt):
131 $(MAKE) -C $(@:%.opt=%) OCAMLCFLAGS="$(OCAMLCFLAGS)" all.opt
132
133 commons:
134 globals:
135 menhirlib:
136 parsing_cocci:globals menhirlib
137 parsing_c:parsing_cocci
138 ctl:globals commons
139 engine: parsing_cocci parsing_c ctl
140 popl09:engine
141 extra: parsing_cocci parsing_c ctl
142 pycaml:
143 python:pycaml parsing_cocci parsing_c
144
145 commons.opt:
146 globals.opt:
147 menhirlib.opt:
148 parsing_cocci.opt:globals.opt menhirlib.opt
149 parsing_c.opt:parsing_cocci.opt
150 ctl.opt:globals.opt commons.opt
151 engine.opt: parsing_cocci.opt parsing_c.opt ctl.opt
152 popl09.opt:engine.opt
153 extra.opt: parsing_cocci.opt parsing_c.opt ctl.opt
154 pycaml.opt:
155 python.opt:pycaml.opt parsing_cocci.opt parsing_c.opt
156
157 clean::
158 set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i clean; done
159
160 configure:
161 ./configure
162
163 $(LIBS): #$(MAKESUBDIRS)
164 $(LIBS:.cma=.cmxa): #$(MAKESUBDIRS:%=%.opt)
165
166 $(OBJS):$(LIBS)
167 $(OPTOBJS):$(LIBS:.cma=.cmxa)
168
169 $(EXEC): $(LIBS) $(OBJS)
170 $(OCAMLC) $(BYTECODE_STATIC) -o $@ $(SYSLIBS) $^
171
172 $(EXEC).opt: $(LIBS:.cma=.cmxa) $(OPTOBJS)
173 $(OCAMLOPT) $(STATIC) -o $@ $(SYSLIBS:.cma=.cmxa) $(OPTLIBFLAGS) $^
174
175 $(EXEC).top: $(LIBS) $(OBJS)
176 $(OCAMLMKTOP) -custom -o $@ $(SYSLIBS) $^
177
178 clean::
179 rm -f $(TARGET) $(TARGET).opt $(TARGET).top
180
181 clean::
182 rm -f dllpycaml_stubs.so
183
184
185 .PHONY: tools all configure
186
187 tools:
188 $(MAKE) -C tools
189 clean::
190 $(MAKE) -C tools clean
191
192
193 static:
194 rm -f spatch.opt spatch
195 $(MAKE) STATIC="-ccopt -static" spatch.opt
196 cp spatch.opt spatch
197
198 purebytecode:
199 rm -f spatch.opt spatch
200 $(MAKE) BYTECODE_STATIC="" spatch
201
202
203 ##############################################################################
204 # Install
205 ##############################################################################
206
207 # don't remove DESTDIR, it can be set by package build system like ebuild
208 install: all
209 mkdir -p $(DESTDIR)$(BINDIR)
210 mkdir -p $(DESTDIR)$(LIBDIR)
211 mkdir -p $(DESTDIR)$(SHAREDIR)
212 mkdir -p $(DESTDIR)$(MANDIR)/man1
213 cp spatch $(DESTDIR)$(BINDIR)
214 cp standard.h $(DESTDIR)$(SHAREDIR)
215 cp standard.iso $(DESTDIR)$(SHAREDIR)
216 cp docs/spatch.1 $(DESTDIR)$(MANDIR)/man1/
217 mkdir -p $(DESTDIR)$(SHAREDIR)/python
218 cp -a python/coccilib $(DESTDIR)$(SHAREDIR)/python
219 cp -f dllpycaml_stubs.so $(DESTDIR)$(LIBDIR)
220 @echo ""
221 @echo "You can also install spatch by copying the program spatch"
222 @echo "(available in this directory) anywhere you want and"
223 @echo "give it the right options to find its configuration files."
224
225 uninstall:
226 rm -f $(DESTDIR)$(BINDIR)/spatch
227 rm -f $(DESTDIR)$(LIBDIR)/dllpycaml_stubs.so
228 rm -f $(DESTDIR)$(SHAREDIR)/standard.h
229 rm -f $(DESTDIR)$(SHAREDIR)/standard.iso
230 rm -rf $(DESTDIR)$(SHAREDIR)/python/coccilib
231 rm -f $(DESTDIR)$(MANDIR)/man1/spatch.1
232
233
234
235 version:
236 @echo $(VERSION)
237
238
239 ##############################################################################
240 # Package rules
241 ##############################################################################
242
243 PACKAGE=coccinelle-$(VERSION)
244
245 BINSRC=spatch env.sh env.csh standard.h standard.iso \
246 *.txt docs/* \
247 demos/foo.* demos/simple.*
248 # $(PYLIB) python/coccilib/ demos/printloc.*
249 BINSRC2=$(BINSRC:%=$(PACKAGE)/%)
250
251 TMP=/tmp
252 OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;')
253
254 # Procedure to do first time:
255 # cd ~/release
256 # cvs checkout coccinelle
257 # cd coccinelle
258 # cvs update -d -P
259 # touch **/*
260 # make licensify
261 # remember to comment the -g -dtypes in this Makefile
262
263 # Procedure to do each time:
264 # cvs update
265 # make sure that ocaml is the distribution ocaml of /usr/bin, not ~pad/...
266 # modify globals/config.ml
267 # cd globals/; cvs commit -m"new version" (do not commit from the root!)
268 # ./configure --without-python
269 # make package
270 # make website
271 # Check that run an ocaml in /usr/bin
272
273 # To test you can try compile and run spatch from different instances
274 # like my ~/coccinelle, ~/release/coccinelle, and the /tmp/coccinelle-0.X
275 # downloaded from the website.
276
277 # For 'make srctar' it must done from a clean
278 # repo such as ~/release/coccinelle. It must also be a repo where
279 # the scripts/licensify has been run at least once.
280 # For the 'make bintar' I can do it from my original repo.
281
282
283 package:
284 make srctar
285 make bintar
286 make staticbintar
287 make bytecodetar
288
289 # I currently pre-generate the parser so the user does not have to
290 # install menhir on his machine. I also do a few cleanups like 'rm todo_pos'.
291 # You may have first to do a 'make licensify'.
292 srctar:
293 make clean
294 cp -a . $(TMP)/$(PACKAGE)
295 cd $(TMP)/$(PACKAGE); cd parsing_cocci/; make parser_cocci_menhir.ml
296 cd $(TMP)/$(PACKAGE); rm todo_pos
297 cd $(TMP); tar cvfz $(PACKAGE).tgz --exclude-vcs $(PACKAGE)
298 rm -rf $(TMP)/$(PACKAGE)
299
300
301 bintar: all
302 rm -f $(TMP)/$(PACKAGE)
303 ln -s `pwd` $(TMP)/$(PACKAGE)
304 cd $(TMP); tar cvfz $(PACKAGE)-bin-x86.tgz --exclude-vcs $(BINSRC2)
305 rm -f $(TMP)/$(PACKAGE)
306
307 staticbintar: all.opt
308 rm -f $(TMP)/$(PACKAGE)
309 ln -s `pwd` $(TMP)/$(PACKAGE)
310 make static
311 cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-static.tgz --exclude-vcs $(BINSRC2)
312 rm -f $(TMP)/$(PACKAGE)
313
314 # add ocaml version in name ?
315 bytecodetar: all
316 rm -f $(TMP)/$(PACKAGE)
317 ln -s `pwd` $(TMP)/$(PACKAGE)
318 make purebytecode
319 cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude-vcs $(BINSRC2)
320 rm -f $(TMP)/$(PACKAGE)
321
322 clean::
323 rm -f $(PACKAGE)
324 rm -f $(PACKAGE)-bin-x86.tgz
325 rm -f $(PACKAGE)-bin-x86-static.tgz
326 rm -f $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz
327
328
329
330 TOLICENSIFY=ctl engine parsing_cocci popl popl09 python
331 licensify:
332 ocaml tools/licensify.ml
333 set -e; for i in $(TOLICENSIFY); do cd $$i; ocaml ../tools/licensify.ml; cd ..; done
334
335 # When checking out the source from diku sometimes I have some "X in the future"
336 # error messages.
337 fixdates:
338 echo do 'touch **/*.*'
339
340 #fixCVS:
341 # cvs update -d -P
342 # echo do 'rm -rf **/CVS'
343
344 ocamlversion:
345 @echo $(OCAMLVERSION)
346
347
348 ##############################################################################
349 # Pad specific rules
350 ##############################################################################
351
352 #TOP=/home/pad/mobile/project-coccinelle
353 WEBSITE=/home/pad/mobile/homepage/software/project-coccinelle
354
355 website:
356 cp $(TMP)/$(PACKAGE).tgz $(WEBSITE)
357 cp $(TMP)/$(PACKAGE)-bin-x86.tgz $(WEBSITE)
358 cp $(TMP)/$(PACKAGE)-bin-x86-static.tgz $(WEBSITE)
359 cp $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz $(WEBSITE)
360
361
362 #TXT=$(wildcard *.txt)
363 syncwiki:
364 # unison ~/public_html/wiki/wiki-LFS/data/pages/ docs/wiki/
365 # set -e; for i in $(TXT); do unison $$i docs/wiki/$$i; done
366
367 darcsweb:
368 # @echo pull from ~/public_html/darcs/c-coccinelle and c-commons and lib-xxx
369
370 DARCSFORESTS=commons \
371 parsing_c parsing_cocci engine
372
373 update_darcs:
374 darcs pull
375 set -e; for i in $(DARCSFORESTS); do cd $$i; darcs pull; cd ..; done
376
377 #darcs diff -u
378 diff_darcs:
379 set -e; for i in $(DARCSFORESTS); do cd $$i; darcs diff -u; cd ..; done
380
381
382 ##############################################################################
383 # Developer rules
384 ##############################################################################
385
386 test: $(TARGET)
387 ./$(TARGET) -testall
388
389 testparsing:
390 ./$(TARGET) -D standard.h -parse_c -dir tests/
391
392
393
394 # -inline 0 to see all the functions in the profile.
395 # Can also use the profile framework in commons/ and run your program
396 # with -profile.
397 forprofiling:
398 $(MAKE) OPTFLAGS="-p -inline 0 " opt
399
400 clean::
401 rm -f gmon.out
402
403 tags:
404 otags -no-mli-tags -r .
405
406 dependencygraph:
407 find -name "*.ml" |grep -v "scripts" | xargs ocamldep -I commons -I globals -I ctl -I parsing_cocci -I parsing_c -I engine -I popl09 -I extra > /tmp/dependfull.depend
408 ocamldot -lr /tmp/dependfull.depend > /tmp/dependfull.dot
409 dot -Tps /tmp/dependfull.dot > /tmp/dependfull.ps
410 ps2pdf /tmp/dependfull.ps /tmp/dependfull.pdf
411
412 ##############################################################################
413 # Misc rules
414 ##############################################################################
415
416 # each member of the project can have its own test.ml. this file is
417 # not under CVS.
418 test.ml:
419 echo "let foo_ctl () = failwith \"there is no foo_ctl formula\"" \
420 > test.ml
421
422 beforedepend:: test.ml
423
424
425 #INC=$(dir $(shell which ocaml))
426 #INCX=$(INC:/=)
427 #INCY=$(dir $(INCX))
428 #INCZ=$(INCY:/=)/lib/ocaml
429 #
430 #prim.o: prim.c
431 # gcc -c -o prim.o -I $(INCZ) prim.c
432
433
434 ##############################################################################
435 # Generic ocaml rules
436 ##############################################################################
437
438 .SUFFIXES: .ml .mli .cmo .cmi .cmx
439
440 .ml.cmo:
441 $(OCAMLC) -c $<
442 .mli.cmi:
443 $(OCAMLC) -c $<
444 .ml.cmx:
445 $(OCAMLOPT) -c $<
446
447 .ml.mldepend:
448 $(OCAMLC) -i $<
449
450 clean::
451 rm -f *.cm[iox] *.o *.annot
452
453 clean::
454 rm -f *~ .*~ *.exe #*#
455
456 beforedepend::
457
458 depend:: beforedepend
459 $(OCAMLDEP) *.mli *.ml > .depend
460 set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i depend; done
461
462 -include .depend