06b01a51835e46861a41ebca0239257dde40677d
[bpt/coccinelle.git] / Makefile
1 # Copyright 2005-2008, 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 eclipse: depend all
111 configure:
112 ./configure
113
114 all: rec $(EXEC)
115 opt: rec.opt $(EXEC).opt
116 all.opt: opt
117
118 rec:
119 set -e; for i in $(MAKESUBDIRS); \
120 do $(MAKE) -C $$i OCAMLCFLAGS="$(OCAMLCFLAGS)" all; done
121 rec.opt:
122 set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i all.opt; done
123 clean::
124 set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i clean; done
125
126
127 $(EXEC): $(LIBS) $(OBJS)
128 $(OCAMLC) $(BYTECODE_STATIC) -o $@ $(SYSLIBS) $^
129
130 $(EXEC).opt: $(LIBS:.cma=.cmxa) $(OPTOBJS)
131 $(OCAMLOPT) $(STATIC) -o $@ $(SYSLIBS:.cma=.cmxa) $(OPTLIBFLAGS) $^
132
133 $(EXEC).top: $(LIBS) $(OBJS)
134 $(OCAMLMKTOP) -custom -o $@ $(SYSLIBS) $^
135
136 clean::
137 rm -f $(TARGET) $(TARGET).opt $(TARGET).top
138
139
140 clean::
141 rm -f dllpycaml_stubs.so
142
143
144 .PHONY: tools all configure
145
146 tools:
147 $(MAKE) -C tools
148 clean::
149 $(MAKE) -C tools clean
150
151
152 static:
153 rm -f spatch.opt spatch
154 $(MAKE) STATIC="-ccopt -static" spatch.opt
155 cp spatch.opt spatch
156
157 purebytecode:
158 rm -f spatch.opt spatch
159 $(MAKE) BYTECODE_STATIC="" spatch
160
161
162 ##############################################################################
163 # Install
164 ##############################################################################
165
166 # don't remove DESTDIR, it can be set by package build system like ebuild
167 install: all
168 mkdir -p $(DESTDIR)$(BINDIR)
169 mkdir -p $(DESTDIR)$(LIBDIR)
170 mkdir -p $(DESTDIR)$(SHAREDIR)
171 cp spatch $(DESTDIR)$(BINDIR)
172 cp -f dllpycaml_stubs.so $(DESTDIR)$(LIBDIR)
173 cp standard.h $(DESTDIR)$(SHAREDIR)
174 cp standard.iso $(DESTDIR)$(SHAREDIR)
175 mkdir -p $(DESTDIR)$(SHAREDIR)/python
176 cp -a python/coccilib $(DESTDIR)$(SHAREDIR)/python
177 @echo ""
178 @echo "You can also install spatch by copying the program spatch"
179 @echo "(available in this directory) anywhere you want and"
180 @echo "give it the right options to find its configuration files."
181
182 uninstall:
183 rm -f $(DESTDIR)$(BINDIR)/spatch
184 rm -f $(DESTDIR)$(LIBDIR)/dllpycaml_stubs.so
185 rm -f $(DESTDIR)$(SHAREDIR)/standard.h
186 rm -f $(DESTDIR)$(SHAREDIR)/standard.iso
187 rm -rf $(DESTDIR)$(SHAREDIR)/python/coccilib
188
189
190
191 version:
192 @echo $(VERSION)
193
194
195 ##############################################################################
196 # Package rules
197 ##############################################################################
198
199 PACKAGE=coccinelle-$(VERSION)
200
201 BINSRC=spatch env.sh env.csh standard.h standard.iso \
202 *.txt docs/* \
203 demos/foo.* demos/simple.*
204 # $(PYLIB) python/coccilib/ demos/printloc.*
205 BINSRC2=$(BINSRC:%=$(PACKAGE)/%)
206
207 TMP=/tmp
208 OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;')
209
210 # Procedure to do first time:
211 # cd ~/release
212 # cvs checkout coccinelle
213 # cd coccinelle
214 # cvs update -d -P
215 # touch **/*
216 # make licensify
217
218 # Procedure to do each time:
219 # cvs update
220 # ./configure --without-python
221 # make package
222 # make website
223 # Check also that run an ocaml in /usr/bin
224
225 # To test you can try compile and run spatch from different instances
226 # like my ~/coccinelle, ~/release/coccinelle, and the /tmp/coccinelle-0.X
227 # downloaded from the website.
228
229 # For 'make srctar' it must done from a clean
230 # repo such as ~/release/coccinelle. It must also be a repo where
231 # the scripts/licensify has been run at least once.
232 # For the 'make bintar' I can do it from my original repo.
233
234
235 package:
236 make srctar
237 make bintar
238 make staticbintar
239 make bytecodetar
240
241 # I currently pre-generate the parser so the user does not have to
242 # install menhir on his machine. I also do a few cleanups like 'rm todo_pos'.
243 # You may have first to do a 'make licensify'.
244 srctar:
245 make clean
246 cp -a . $(TMP)/$(PACKAGE)
247 cd $(TMP)/$(PACKAGE); cd parsing_cocci/; make parser_cocci_menhir.ml
248 cd $(TMP)/$(PACKAGE); rm todo_pos
249 cd $(TMP); tar cvfz $(PACKAGE).tgz --exclude=CVS $(PACKAGE)
250 rm -rf $(TMP)/$(PACKAGE)
251
252
253 bintar: all
254 rm -f $(TMP)/$(PACKAGE)
255 ln -s `pwd` $(TMP)/$(PACKAGE)
256 cd $(TMP); tar cvfz $(PACKAGE)-bin-x86.tgz --exclude=CVS $(BINSRC2)
257 rm -f $(TMP)/$(PACKAGE)
258
259 staticbintar: all.opt
260 rm -f $(TMP)/$(PACKAGE)
261 ln -s `pwd` $(TMP)/$(PACKAGE)
262 make static
263 cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-static.tgz --exclude=CVS $(BINSRC2)
264 rm -f $(TMP)/$(PACKAGE)
265
266 # add ocaml version in name ?
267 bytecodetar: all
268 rm -f $(TMP)/$(PACKAGE)
269 ln -s `pwd` $(TMP)/$(PACKAGE)
270 make purebytecode
271 cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude=CVS $(BINSRC2)
272 rm -f $(TMP)/$(PACKAGE)
273
274 clean::
275 rm -f $(PACKAGE)
276 rm -f $(PACKAGE)-bin-x86.tgz
277 rm -f $(PACKAGE)-bin-x86-static.tgz
278 rm -f $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz
279
280
281
282 TOLICENSIFY=ctl engine parsing_cocci popl popl09 python
283 licensify:
284 ocaml tools/licensify.ml
285 set -e; for i in $(TOLICENSIFY); do cd $$i; ocaml ../tools/licensify.ml; cd ..; done
286
287 # When checking out the source from diku sometimes I have some "X in the future"
288 # error messages.
289 fixdates:
290 echo do 'touch **/*.*'
291
292 #fixCVS:
293 # cvs update -d -P
294 # echo do 'rm -rf **/CVS'
295
296 ocamlversion:
297 @echo $(OCAMLVERSION)
298
299
300 ##############################################################################
301 # Pad specific rules
302 ##############################################################################
303
304 #TOP=/home/pad/mobile/project-coccinelle
305 WEBSITE=/home/pad/mobile/homepage/software/project-coccinelle
306
307 website:
308 cp $(TMP)/$(PACKAGE).tgz $(WEBSITE)
309 cp $(TMP)/$(PACKAGE)-bin-x86.tgz $(WEBSITE)
310 cp $(TMP)/$(PACKAGE)-bin-x86-static.tgz $(WEBSITE)
311 cp $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz $(WEBSITE)
312
313
314 #TXT=$(wildcard *.txt)
315 syncwiki:
316 # unison ~/public_html/wiki/wiki-LFS/data/pages/ docs/wiki/
317 # set -e; for i in $(TXT); do unison $$i docs/wiki/$$i; done
318
319 darcsweb:
320 # @echo pull from ~/public_html/darcs/c-coccinelle and c-commons and lib-xxx
321
322
323 ##############################################################################
324 # Developer rules
325 ##############################################################################
326
327 test: $(TARGET)
328 ./$(TARGET) -testall
329
330 testparsing:
331 ./$(TARGET) -D standard.h -parse_c -dir tests/
332
333
334
335 # -inline 0 to see all the functions in the profile.
336 # Can also use the profile framework in commons/ and run your program
337 # with -profile.
338 forprofiling:
339 $(MAKE) OPTFLAGS="-p -inline 0 " opt
340
341 clean::
342 rm -f gmon.out
343
344 tags:
345 otags -no-mli-tags -r .
346
347 dependencygraph:
348 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
349 ocamldot -fullgraph /tmp/dependfull.depend > /tmp/dependfull.dot
350 dot -Tps /tmp/dependfull.dot > /tmp/dependfull.ps
351
352 ##############################################################################
353 # Misc rules
354 ##############################################################################
355
356 # each member of the project can have its own test.ml. this file is
357 # not under CVS.
358 test.ml:
359 echo "let foo_ctl () = failwith \"there is no foo_ctl formula\"" \
360 > test.ml
361
362 beforedepend:: test.ml
363
364
365 #INC=$(dir $(shell which ocaml))
366 #INCX=$(INC:/=)
367 #INCY=$(dir $(INCX))
368 #INCZ=$(INCY:/=)/lib/ocaml
369 #
370 #prim.o: prim.c
371 # gcc -c -o prim.o -I $(INCZ) prim.c
372
373
374 ##############################################################################
375 # Generic ocaml rules
376 ##############################################################################
377
378 .SUFFIXES: .ml .mli .cmo .cmi .cmx
379
380 .ml.cmo:
381 $(OCAMLC) -c $<
382 .mli.cmi:
383 $(OCAMLC) -c $<
384 .ml.cmx:
385 $(OCAMLOPT) -c $<
386
387 .ml.mldepend:
388 $(OCAMLC) -i $<
389
390 clean::
391 rm -f *.cm[iox] *.o *.annot
392
393 clean::
394 rm -f *~ .*~ *.exe #*#
395
396 beforedepend::
397
398 depend:: beforedepend
399 $(OCAMLDEP) *.mli *.ml > .depend
400 set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i depend; done
401
402 -include .depend