1 # Copyright 2010, INRIA, University of Copenhagen
2 # Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
3 # Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
4 # Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
5 # This file is part of Coccinelle.
7 # Coccinelle is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, according to version 2 of the License.
11 # Coccinelle is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
19 # The authors reserve the right to distribute this or future versions of
20 # Coccinelle under other licenses.
24 #############################################################################
25 # Configuration section
26 #############################################################################
28 -include Makefile.config
29 -include /etc
/lsb-release
31 VERSION
=$(shell cat globals
/config.ml.in |grep version |perl
-p
-e
's/.*"(.*)".*/$$1/;')
32 CCVERSION
=$(shell cat scripts
/coccicheck
/README |grep
"Coccicheck version" |perl
-p
-e
's/.*version (.*)[ ]*/$$1/;')
33 PKGVERSION
=$(shell dpkg-parsechangelog
-ldebian
/changelog.
$(DISTRIB_CODENAME
) 2> /dev
/null \
34 | sed
-n
's/^Version: \(.*\)/\1/p' )
36 ##############################################################################
38 ##############################################################################
42 SRC
=flag_cocci.ml cocci.ml testing.ml
test.ml main.ml
44 ifeq ($(FEATURE_PYTHON
),1)
46 # the following is essential for Coccinelle to compile under gentoo (weird)
47 #OPTLIBFLAGS=-cclib dllpycaml_stubs.so
53 ifeq ("$(SEXPDIR)","ocamlsexp")
55 OPTSEXPLIB
=sexplib.cmx
58 OPTSEXPLIB
=sexplib.cmxa
61 ifeq ("$(DYNLINK)","no")
67 SEXPSYSCMA
=bigarray.cma nums.cma
69 SYSLIBS
=str.cma unix.cma
$(SEXPSYSCMA
) $(PYCMA
) $(DYNLINK
) # threads.cma
70 LIBS
=commons
/commons.cma \
71 commons
/commons_sexp.cma \
74 parsing_cocci
/cocci_parser.cma parsing_c
/parsing_c.cma \
75 engine
/cocciengine.cma popl09
/popl.cma \
76 extra
/extra.cma python
/coccipython.cma ocaml
/cocciocaml.cma
78 # Should we use the local version of pycaml
79 ifeq ($(FEATURE_PYTHON
),1)
80 ifeq ("$(PYCAMLDIR)","pycaml")
87 # Should we use the local version of menhirLib
88 ifeq ("$(MENHIRDIR)","menhirlib")
94 # Should we use the local version of ocamlsexp
95 ifeq ("$(SEXPDIR)","ocamlsexp")
101 # used for depend: and a little for rec & rec.opt
102 MAKESUBDIRS
=$(LOCALPYCAML
) $(LOCALSEXP
) commons \
103 globals
$(LOCALMENHIR
) ctl parsing_cocci parsing_c \
104 engine popl09 extra python ocaml
107 # It is like MAKESUBDIRS but also
108 # force cleaning of local library copies
109 CLEANSUBDIRS
=pycaml ocamlsexp commons \
110 globals menhirlib ctl parsing_cocci parsing_c \
111 engine popl09 extra python ocaml
113 INCLUDEDIRSDEP
=commons commons
/ocamlextra
$(LOCALSEXP
) \
114 globals
$(LOCALMENHIR
) $(LOCALPYCAML
) ctl \
115 parsing_cocci parsing_c engine popl09 extra python ocaml
117 INCLUDEDIRS
=$(INCLUDEDIRSDEP
) $(SEXPDIR
) $(MENHIRDIR
) $(PYCAMLDIR
)
119 ##############################################################################
121 ##############################################################################
123 INCLUDES
=$(INCLUDEDIRS
:%=-I
%)
125 OBJS
= $(SRC
:.ml
=.cmo
)
126 OPTOBJS
= $(SRC
:.ml
=.cmx
)
130 ##############################################################################
131 # Generic ocaml variables
132 ##############################################################################
136 # for profiling add -p -inline 0
137 # but 'make forprofiling' below does that for you.
138 # This flag is also used in subdirectories so don't change its name here.
139 # To enable backtrace support for native code, you need to put -g in OPTFLAGS
140 # to also link with -g.
143 OCAMLC
=ocamlc
$(OPTBIN
) $(OCAMLCFLAGS
) $(INCLUDES
)
144 OCAMLOPT
=ocamlopt
$(OPTBIN
) $(OPTFLAGS
) $(INCLUDES
)
145 OCAMLLEX
=ocamllex
#-ml # -ml for debugging lexer, but slightly slower
146 OCAMLYACC
=ocamlyacc
-v
147 OCAMLDEP
=ocamldep
$(INCLUDEDIRSDEP
:%=-I
%)
148 OCAMLMKTOP
=ocamlmktop
-g
-custom
$(INCLUDES
)
150 # can also be set via 'make static'
151 CFLAGS
=-pie
-fPIE
-fpic
-fPIC
-static
152 STATICCFLAGS
=$(CFLAGS
:%=-ccopt
%)
153 STATIC
= # $(STATICCFLAGS)
155 # can also be unset via 'make purebytecode'
156 BYTECODE_STATIC
=-custom
158 ##############################################################################
160 ##############################################################################
161 .PHONY
:: all all.opt byte opt top
clean distclean configure
162 .PHONY
:: $(MAKESUBDIRS
) $(MAKESUBDIRS
:%=%.opt
) subdirs subdirs.opt
164 all: Makefile.config byte preinstall
167 all.opt
: opt-compil preinstall
184 +for D in
$(MAKESUBDIRS
); do
$(MAKE
) $$D || exit
1 ; done
185 $(MAKE
) -C commons sexp OCAMLCFLAGS
="$(OCAMLCFLAGS)"
188 +for D in
$(MAKESUBDIRS
); do
$(MAKE
) $$D.opt || exit
1 ; done
189 $(MAKE
) -C commons sexp.opt OPTFLAGS
="$(OPTFLAGS)"
192 $(MAKE
) -C
$@ OCAMLCFLAGS
="$(OCAMLCFLAGS)" all
194 $(MAKESUBDIRS
:%=%.opt
):
195 $(MAKE
) -C
$(@
:%.opt
=%) OPTFLAGS
="$(OPTFLAGS)" all.opt
201 # parsing_cocci: commons globals menhirlib
202 # parsing_c:parsing_cocci
203 # ctl:globals commons
204 # engine: parsing_cocci parsing_c ctl
206 # extra: parsing_cocci parsing_c ctl
208 # python:pycaml parsing_cocci parsing_c
211 set
-e
; for i in
$(CLEANSUBDIRS
); do
$(MAKE
) -C
$$i $@
; done
212 $(MAKE
) -C demos
/spp
$@
214 $(LIBS
): $(MAKESUBDIRS
)
215 $(LIBS
:.cma
=.cmxa
): $(MAKESUBDIRS
:%=%.opt
)
218 $(OPTOBJS
):$(LIBS
:.cma
=.cmxa
)
220 $(EXEC
): $(LIBS
) $(OBJS
)
221 $(OCAMLC
) $(BYTECODE_STATIC
) -o
$@
$(SYSLIBS
) $(SEXPLIB
) $^
223 $(EXEC
).opt
: $(LIBS
:.cma
=.cmxa
) $(OPTOBJS
)
224 $(OCAMLOPT
) $(STATIC
) -o
$@
$(SYSLIBS
:.cma
=.cmxa
) $(OPTSEXPLIB
) $(OPTLIBFLAGS
) $^
226 $(EXEC
).top
: $(LIBS
) $(OBJS
)
227 $(OCAMLMKTOP
) -custom
-o
$@
$(SYSLIBS
) $(SEXPLIB
) $^
230 rm -f
$(TARGET
) $(TARGET
).opt
$(TARGET
).top
232 .PHONY
:: tools configure
238 @echo
"Makefile.config is missing. Have you run ./configure?"
245 if
[ -d tools
] ; then
$(MAKE
) -C tools
distclean ; fi
248 rm -f spatch.opt spatch
249 $(MAKE
) STATIC
="$(STATICCFLAGS)" spatch.opt
253 rm -f spatch.opt spatch
254 $(MAKE
) BYTECODE_STATIC
="" spatch
255 perl
-p
-i
-e
's/^#!.*/#!\/usr\/bin\/ocamlrun/' spatch
258 ##############################################################################
259 # Build documentation
260 ##############################################################################
270 make
-C docs
distclean
272 ##############################################################################
273 # Pre-Install (customization of spatch frontend script)
274 ##############################################################################
276 preinstall
: docs
/spatch
.1 scripts
/spatch scripts
/spatch.opt scripts
/spatch.byte
278 docs
/spatch
.1: Makefile.config
279 $(MAKE
) -C docs spatch
.1
281 # user will use spatch to run spatch.opt (native)
282 scripts
/spatch
: Makefile.config
283 cp scripts
/spatch.sh scripts
/spatch.tmp2
284 sed
"s|SHAREDIR|$(SHAREDIR)|g" scripts
/spatch.tmp2
> scripts
/spatch.tmp
285 sed
"s|LIBDIR|$(LIBDIR)|g" scripts
/spatch.tmp
> scripts
/spatch
286 rm -f scripts
/spatch.tmp2 scripts
/spatch.tmp
288 # user will use spatch to run spatch (bytecode)
289 scripts
/spatch.byte
: Makefile.config
290 cp scripts
/spatch.sh scripts
/spatch.byte.tmp3
291 sed
"s|\.opt||" scripts
/spatch.byte.tmp3
> scripts
/spatch.byte.tmp2
292 sed
"s|SHAREDIR|$(SHAREDIR)|g" scripts
/spatch.byte.tmp2 \
293 > scripts
/spatch.byte.tmp
294 sed
"s|LIBDIR|$(LIBDIR)|g" scripts
/spatch.byte.tmp \
295 > scripts
/spatch.byte
296 rm -f scripts
/spatch.byte.tmp3 \
297 scripts
/spatch.byte.tmp2 \
298 scripts
/spatch.byte.tmp
300 # user will use spatch.opt to run spatch.opt (native)
301 scripts
/spatch.opt
: Makefile.config
302 cp scripts
/spatch.sh scripts
/spatch.opt.tmp2
303 sed
"s|SHAREDIR|$(SHAREDIR)|g" scripts
/spatch.opt.tmp2 \
304 > scripts
/spatch.opt.tmp
305 sed
"s|LIBDIR|$(LIBDIR)|g" scripts
/spatch.opt.tmp \
307 rm -f scripts
/spatch.opt.tmp scripts
/spatch.opt.tmp2
310 rm -f scripts
/spatch scripts
/spatch.byte scripts
/spatch.opt
312 ##############################################################################
314 ##############################################################################
316 # don't remove DESTDIR, it can be set by package build system like ebuild
317 # for staged installation.
319 mkdir
-p
$(DESTDIR
)$(BINDIR
)
320 mkdir
-p
$(DESTDIR
)$(LIBDIR
)
321 mkdir
-p
$(DESTDIR
)$(SHAREDIR
)/ocaml
322 mkdir
-p
$(DESTDIR
)$(SHAREDIR
)/commons
323 mkdir
-p
$(DESTDIR
)$(SHAREDIR
)/globals
324 mkdir
-p
$(DESTDIR
)$(SHAREDIR
)/parsing_c
325 mkdir
-p
$(DESTDIR
)$(MANDIR
)/man1
326 mkdir
-p
$(DESTDIR
)$(MANDIR
)/man3
327 $(INSTALL_DATA
) standard.h
$(DESTDIR
)$(SHAREDIR
)
328 $(INSTALL_DATA
) standard.iso
$(DESTDIR
)$(SHAREDIR
)
329 $(INSTALL_DATA
) ocaml
/coccilib.cmi
$(DESTDIR
)$(SHAREDIR
)/ocaml
/
330 $(INSTALL_DATA
) parsing_c
/*.cmi
$(DESTDIR
)$(SHAREDIR
)/parsing_c
/
331 $(INSTALL_DATA
) commons
/*.cmi
$(DESTDIR
)$(SHAREDIR
)/commons
/
332 $(INSTALL_DATA
) globals
/iteration.cmi
$(DESTDIR
)$(SHAREDIR
)/globals
/
333 $(INSTALL_DATA
) docs
/spatch
.1 $(DESTDIR
)$(MANDIR
)/man1
/
334 $(INSTALL_DATA
) docs
/Coccilib
.3cocci
$(DESTDIR
)$(MANDIR
)/man3
/
335 @if
[ $(FEATURE_PYTHON
) -eq
1 ]; then
$(MAKE
) install-python
; fi
338 mkdir
-p
$(DESTDIR
)$(BASH_COMPLETION_DIR
)
339 $(INSTALL_DATA
) scripts
/spatch.bash_completion \
340 $(DESTDIR
)$(BASH_COMPLETION_DIR
)/spatch
343 mkdir
-p
$(DESTDIR
)$(BINDIR
)
344 $(INSTALL_PROGRAM
) tools
/splitpatch \
345 $(DESTDIR
)$(BINDIR
)/splitpatch
346 $(INSTALL_PROGRAM
) tools
/cocci-send-email.perl \
347 $(DESTDIR
)$(BINDIR
)/cocci-send-email.perl
350 mkdir
-p
$(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/coccigui
351 $(INSTALL_DATA
) python
/coccilib
/*.py \
352 $(DESTDIR
)$(SHAREDIR
)/python
/coccilib
353 $(INSTALL_DATA
) python
/coccilib
/coccigui
/*.py \
354 $(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/coccigui
355 $(INSTALL_DATA
) python
/coccilib
/coccigui
/pygui.glade \
356 $(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/coccigui
357 $(INSTALL_DATA
) python
/coccilib
/coccigui
/pygui.gladep \
358 $(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/coccigui
359 if
[ -f pycaml
/dllpycaml_stubs.so
]; then \
360 $(INSTALL_LIB
) pycaml
/dllpycaml_stubs.so
$(DESTDIR
)$(LIBDIR
) ; fi
362 install: install-common
363 @if
test -x spatch
-a
! -x spatch.opt
; then \
364 $(MAKE
) install-byte
;fi
365 @if
test ! -x spatch
-a
-x spatch.opt
; then \
366 $(MAKE
) install-def
; $(MAKE
) install-opt
;fi
367 @if
test -x spatch
-a
-x spatch.opt
; then \
368 $(MAKE
) install-byte
; $(MAKE
) install-opt
;fi
369 @if
test ! -x spatch
-a
! -x spatch.opt
; then \
370 echo
"\n\n\t==> Run 'make', 'make opt', or both first. <==\n\n";fi
372 @echo
"\tYou can also install spatch by copying the program spatch"
373 @echo
"\t(available in this directory) anywhere you want and"
374 @echo
"\tgive it the right options to find its configuration files."
377 # user will use spatch to run spatch.opt (native)
379 $(INSTALL_PROGRAM
) spatch.opt
$(DESTDIR
)$(SHAREDIR
)
380 $(INSTALL_PROGRAM
) scripts
/spatch
$(DESTDIR
)$(BINDIR
)/spatch
382 # user will use spatch to run spatch (bytecode)
384 $(INSTALL_PROGRAM
) spatch
$(DESTDIR
)$(SHAREDIR
)
385 $(INSTALL_PROGRAM
) scripts
/spatch.byte
$(DESTDIR
)$(BINDIR
)/spatch
387 # user will use spatch.opt to run spatch.opt (native)
389 $(INSTALL_PROGRAM
) spatch.opt
$(DESTDIR
)$(SHAREDIR
)
390 $(INSTALL_PROGRAM
) scripts
/spatch.opt
$(DESTDIR
)$(BINDIR
)/spatch.opt
393 rm -f
$(DESTDIR
)$(BINDIR
)/spatch
394 rm -f
$(DESTDIR
)$(BINDIR
)/spatch.opt
395 rm -f
$(DESTDIR
)$(LIBDIR
)/dllpycaml_stubs.so
396 rm -f
$(DESTDIR
)$(SHAREDIR
)/spatch
397 rm -f
$(DESTDIR
)$(SHAREDIR
)/spatch.opt
398 rm -f
$(DESTDIR
)$(SHAREDIR
)/standard.h
399 rm -f
$(DESTDIR
)$(SHAREDIR
)/standard.iso
400 rm -f
$(DESTDIR
)$(SHAREDIR
)/ocaml
/coccilib.cmi
401 rm -f
$(DESTDIR
)$(SHAREDIR
)/parsing_c
/*.cmi
402 rm -f
$(DESTDIR
)$(SHAREDIR
)/commons
/*.cmi
403 rm -f
$(DESTDIR
)$(SHAREDIR
)/globals
/*.cmi
404 rm -f
$(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/coccigui
/*
405 rm -f
$(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/*.py
406 rmdir
--ignore-fail-on-non-empty
-p \
407 $(DESTDIR
)$(SHAREDIR
)/python
/coccilib
/coccigui
408 rmdir
$(DESTDIR
)$(SHAREDIR
)/globals
409 rmdir
$(DESTDIR
)$(SHAREDIR
)/commons
410 rmdir
$(DESTDIR
)$(SHAREDIR
)/parsing_c
411 rmdir
$(DESTDIR
)$(SHAREDIR
)/ocaml
412 rmdir
$(DESTDIR
)$(SHAREDIR
)
413 rm -f
$(DESTDIR
)$(MANDIR
)/man1
/spatch
.1
414 rm -f
$(DESTDIR
)$(MANDIR
)/man3
/Coccilib
.3cocci
417 rm -f
$(DESTDIR
)$(BASH_COMPLETION_DIR
)/spatch
418 rmdir
--ignore-fail-on-non-empty
-p \
419 $(DESTDIR
)$(BASH_COMPLETION_DIR
)
422 rm -f
$(DESTDIR
)$(BINDIR
)/splitpatch
423 rm -f
$(DESTDIR
)$(BINDIR
)/cocci-send-email.perl
426 @echo
"spatch $(VERSION)"
427 @echo
"spatch $(PKGVERSION) ($(DISTRIB_ID))"
428 @echo
"coccicheck $(CCVERSION)"
431 ##############################################################################
432 # Deb package (for Ubuntu) and release rules
433 ##############################################################################
435 include Makefile.release
437 ##############################################################################
439 ##############################################################################
441 -include Makefile.dev
447 .
/$(TARGET
) -D standard.h
-parse_c
-dir tests
/
451 # -inline 0 to see all the functions in the profile.
452 # Can also use the profile framework in commons/ and run your program
455 $(MAKE
) OPTFLAGS
="-p -inline 0 " opt
461 otags
-no-mli-tags
-r .
464 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
465 ocamldot
-lr
/tmp
/dependfull.depend
> /tmp
/dependfull.dot
466 dot
-Tps
/tmp
/dependfull.dot
> /tmp
/dependfull.ps
467 ps2pdf
/tmp
/dependfull.ps
/tmp
/dependfull.pdf
469 ##############################################################################
471 ##############################################################################
473 # each member of the project can have its own test.ml. this file is
476 echo
"let foo_ctl () = failwith \"there is no foo_ctl formula\"" \
479 beforedepend
:: test.ml
482 #INC=$(dir $(shell which ocaml))
485 #INCZ=$(INCY:/=)/lib/ocaml
488 # gcc -c -o prim.o -I $(INCZ) prim.c
491 ##############################################################################
492 # Generic ocaml rules
493 ##############################################################################
495 .SUFFIXES
: .ml .mli .cmo .cmi .cmx
508 rm -f
*.cm
[iox
] *.o
*.annot
509 rm -f
*~ .
*~
*.exe
#*#
512 set
-e
; for i in
$(MAKESUBDIRS
); do
$(MAKE
) -C
$$i $@
; done
514 rm -f Makefile.config
515 rm -f globals
/config.ml
test.ml
517 rm -f tests
/SCORE_actual.sexp
518 rm -f tests
/SCORE_best_of_both.sexp
519 find
-name
".#*1.*" | xargs
rm -f
523 depend
:: beforedepend
524 $(OCAMLDEP
) *.mli
*.ml
> .depend
525 set
-e
; for i in
$(MAKESUBDIRS
); do
$(MAKE
) -C
$$i $@
; done
528 @if
[ ! -f .depend
] ; then
$(MAKE
) depend
; fi