cfa2f9ba075b32ae28238d560650f8bb0588ae36
[perl4caml.git] / Makefile
1 # Interface to Perl from OCaml.
2 # Copyright (C) 2003 Merjis Ltd.
3 # $Id: Makefile,v 1.32 2008-02-23 15:57:58 rich Exp $
4
5 include Makefile.config
6
7 OCAMLC := ocamlc
8 OCAMLOPT := ocamlopt
9 OCAMLMKLIB := ocamlmklib
10 OCAMLDEP := ocamldep
11 OCAMLDOC := ocamldoc
12
13 OCAMLCINCS := -I wrappers
14 OCAMLOPTINCS := $(OCAMLCINCS)
15
16 OCAMLCFLAGS := -w s -g $(OCAMLCINCS)
17 OCAMLOPTFLAGS := -w s $(OCAMLOPTINCS)
18
19 PERLCFLAGS := $(shell perl -e 'use Config; print $$Config{ccflags};')
20
21 CC := gcc
22 CFLAGS := -fPIC -Wall -Wno-unused \
23         -I$(OCAMLLIBDIR) \
24         -I$(PERLINCDIR) $(PERLCFLAGS) \
25         $(EXTRA_CFLAGS)
26
27 LIBPERL := $(shell perl -MExtUtils::Embed -e ldopts)
28
29 SED := sed
30
31 OCAMLDOCFLAGS := -html -stars -sort $(OCAMLCINCS)
32
33 WRAPPERS := \
34         wrappers/pl_Data_Dumper.cmo \
35         wrappers/pl_Date_Calc.cmo \
36         wrappers/pl_Date_Format.cmo \
37         wrappers/pl_Date_Parse.cmo \
38         wrappers/pl_Net_Google_Cache.cmo \
39         wrappers/pl_Net_Google_Response.cmo \
40         wrappers/pl_Net_Google_Search.cmo \
41         wrappers/pl_Net_Google_Spelling.cmo \
42         wrappers/pl_Net_Google.cmo \
43         wrappers/pl_HTML_Element.cmo \
44         wrappers/pl_HTML_Parser.cmo \
45         wrappers/pl_HTML_TreeBuilder.cmo \
46         wrappers/pl_URI.cmo \
47         wrappers/pl_HTTP_Cookies.cmo \
48         wrappers/pl_HTTP_Headers.cmo \
49         wrappers/pl_HTTP_Message.cmo \
50         wrappers/pl_HTTP_Request.cmo \
51         wrappers/pl_HTTP_Request_Common.cmo \
52         wrappers/pl_HTTP_Response.cmo \
53         wrappers/pl_HTML_Form.cmo \
54         wrappers/pl_LWP_UserAgent.cmo \
55         wrappers/pl_Template.cmo \
56         wrappers/pl_WWW_Mechanize.cmo
57
58 all:    perl4caml.cma perl4caml.cmxa META all-examples html
59
60 perl4caml.cma: perl.cmo perl_c.o $(WRAPPERS)
61         $(OCAMLMKLIB) -o perl4caml $(LIBPERL) $^
62
63 perl4caml.cmxa: perl.cmx perl_c.o $(WRAPPERS:.cmo=.cmx)
64         $(OCAMLMKLIB) -o perl4caml $(LIBPERL) $^
65
66 all-examples: examples/test.bc examples/loadpage.bc examples/google.bc \
67         examples/test.opt examples/loadpage.opt examples/google.opt \
68         examples/parsedate.bc examples/parsedate.opt
69
70 TEST_PROGRAMS := $(patsubst %.ml,%.bc,$(wildcard test/*.ml)) \
71         $(patsubst %.ml,%.opt,$(wildcard test/*.ml))
72
73 test: $(TEST_PROGRAMS) run-tests
74
75 check: test
76
77 run-tests:
78         @fails=0; count=0; \
79         export LD_LIBRARY_PATH=`pwd`:$$LD_LIBRARY_PATH; \
80         for prog in $(TEST_PROGRAMS); do \
81           if ! $$prog; then \
82             echo Test $$prog failed; \
83             fails=$$(($$fails+1)); \
84           fi; \
85           count=$$(($$count+1)); \
86         done; \
87         if [ $$fails -eq 0 ]; then \
88           echo All tests succeeded.; \
89           exit 0; \
90         else \
91           echo $$fails/$$count tests failed.; \
92           exit 1; \
93         fi
94
95 %.bc: %.cmo
96         $(OCAMLC) $(OCAMLCFLAGS) perl4caml.cma $^ -o $@
97
98 %.opt: %.cmx
99         $(OCAMLOPT) $(OCAMLOPTFLAGS) -cclib -L. perl4caml.cmxa \
100         $(DYNALOADER_HACK) $^ -o $@
101
102 %.cmi: %.mli
103         $(OCAMLC) $(OCAMLCFLAGS) -c $<
104
105 %.cmo: %.ml
106         $(OCAMLC) $(OCAMLCFLAGS) -c $<
107
108 %.cmx: %.ml
109         $(OCAMLOPT) $(OCAMLOPTFLAGS) -c $<
110
111 .SUFFIXES: .mli .ml .cmi .cmo .cmx
112
113 META:   META.in Makefile.config
114         $(SED)  -e 's/@PACKAGE@/$(PACKAGE)/' \
115                 -e 's/@VERSION@/$(VERSION)/' \
116                 < $< > $@
117
118 # Clean.
119
120 JUNKFILES = core *~ *.bak *.cmi *.cmo *.cmx *.cma *.cmxa *.o *.a *.so \
121         *.bc *.opt
122
123 clean:
124         rm -f META
125         for d in . examples test wrappers; do \
126           (cd $$d; rm -f $(JUNKFILES)); \
127         done
128
129 # Build dependencies.
130
131 ifeq ($(wildcard .depend),.depend)
132 include .depend
133 endif
134
135 depend: .depend
136
137 .depend: $(wildcard *.ml) $(wildcard *.mli) $(wildcard examples/*.ml) \
138         $(wildcard wrappers/*.ml)
139         $(OCAMLDEP) $(OCAMLCINCS) *.mli *.ml examples/*.ml wrappers/*.ml \
140         > .depend
141
142 # Install.
143
144 install:
145         rm -rf $(DESTDIR)$(OCAMLLIBDIR)/perl
146         install -c -m 0755 -d $(DESTDIR)$(OCAMLLIBDIR)/perl
147         install -c -m 0755 -d $(DESTDIR)$(OCAMLLIBDIR)/stublibs
148         install -c -m 0644 perl.cmi perl.mli perl4caml.cma perl4caml.cmxa \
149           perl4caml.a libperl4caml.a META \
150           $(WRAPPERS:.cmo=.ml) $(WRAPPERS:.cmo=.cmi) \
151           $(DESTDIR)$(OCAMLLIBDIR)/perl
152         install -c -m 0644 dllperl4caml.so $(DESTDIR)$(OCAMLLIBDIR)/stublibs
153
154 # Distribution.
155
156 dist:
157         $(MAKE) check-manifest
158         rm -rf $(PACKAGE)-$(VERSION)
159         mkdir $(PACKAGE)-$(VERSION)
160         tar -cf - -T MANIFEST | tar -C $(PACKAGE)-$(VERSION) -xf -
161         tar zcf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)
162         rm -rf $(PACKAGE)-$(VERSION)
163         ls -l $(PACKAGE)-$(VERSION).tar.gz
164
165 check-manifest:
166         @for d in `find -type d -name CVS | grep -v '^\./debian/'`; \
167         do \
168         b=`dirname $$d`/; \
169         awk -F/ '$$1 != "D" {print $$2}' $$d/Entries | \
170         sed -e "s|^|$$b|" -e "s|^\./||"; \
171         done | sort > .check-manifest; \
172         sort MANIFEST > .orig-manifest; \
173         diff -u .orig-manifest .check-manifest; rv=$$?; \
174         rm -f .orig-manifest .check-manifest; \
175         exit $$rv
176
177 # Debian packages.
178
179 dpkg:
180         @if [ 0 != `cvs -q update | wc -l` ]; then \
181         echo Please commit all changes to CVS first.; \
182         exit 1; \
183         fi
184         $(MAKE) dist
185         rm -rf /tmp/dbuild
186         mkdir /tmp/dbuild
187         cp $(PACKAGE)-$(VERSION).tar.gz \
188           /tmp/dbuild/$(PACKAGE)_$(VERSION).orig.tar.gz
189         export CVSROOT=`cat CVS/Root`; \
190           cd /tmp/dbuild && \
191           cvs export \
192           -d $(PACKAGE)-$(VERSION) \
193           -D now merjis/test/perl4caml
194         cd /tmp/dbuild/$(PACKAGE)-$(VERSION) && dpkg-buildpackage -rfakeroot
195         rm -rf /tmp/dbuild/$(PACKAGE)-$(VERSION)
196         ls -l /tmp/dbuild
197
198 # Documentation.
199
200 html:   html/index.html
201
202 html/index.html: $(wildcard *.ml) $(wildcard *.mli) $(wildcard wrappers/*.ml)
203         rm -rf html
204         mkdir html
205         -$(OCAMLDOC) $(OCAMLDOCFLAGS) -d html $^
206
207 .PHONY: depend dist check-manifest html dpkg test run-tests