OSDN Git Service

enable warn-all
[happyabc/happyabc.git] / OMakefile
1 # ------------------------------
2 # global configuration
3 # ------------------------------
4 PREFIX=
5         if $(not $(defined PREFIX))
6                 value /usr/local
7         else
8                 value $(PREFIX)
9 ENABLE_DEBUG=
10         if $(not $(defined ENABLE_DEBUG))
11                 value false
12         else
13                 value $(ENABLE_DEBUG)
14
15 ENABLE_NATIVE=
16         if $(not $(defined ENABLE_NATIVE))
17                 value true
18         else
19                 value $(ENABLE_NATIVE)
20
21 if $(file-exists VERSION)
22         VERSION=$(shell head -1 VERSION)
23         export
24 else
25         VERSION=local-HEAD
26         export
27
28 # ocamlfind
29 USE_OCAMLFIND = true
30
31 if $(not $(OCAMLFIND_EXISTS))
32    eprintln('This project requires ocamlfind, but is was not found.')
33    eprintln('You need to install ocamlfind and run "omake --configure".')
34    exit 1
35
36 # behavior as traditional cpp
37 CPPFLAGS=-traditional-cpp
38
39 OCAML_WARN_FLAGS=-w A -warn-error A
40 OCAMLFLAGS=$`(OCAML_WARN_FLAGS)
41
42 .PHONY: all install config clean package
43 # ------------------------------
44 # util function
45 # ------------------------------
46 Shell. +=
47     ocaml-clean(argv) =
48       rm -f *.cm[aiox] *.o *.omc *.opt *.run *~ $(argv) *.cmxa *.a *.spot *.spit *.annot *-runner
49
50 # ------------------------------
51 # camlp4 rules
52 # ------------------------------
53 public.UseCamlp4(files) =
54         protected.CAMLP4CMO = $(addprefix $(ROOT)/camlp4/,$(addsuffix .cmo,$(files)))
55         OCAMLPPFLAGS+=-pp 'camlp4o $(CAMLP4CMO)'
56         OCAMLDEPFLAGS+=-pp 'camlp4o $(CAMLP4CMO)'
57         export
58
59         .SCANNER: scan-ocaml-%.ml: %.ml $(CAMLP4CMO)
60
61 # ------------------------------
62 # package
63 # ------------------------------
64 public.MyOCamlPackage(name, files) =
65    # XXX: JYH: these variables should be marked private in 0.9.9
66    protected.OFILES   = $(addsuffix $(EXT_OBJ), $(files))
67    protected.CMOFILES = $(addsuffix .cmo, $(files))
68    protected.CMXFILES = $(addsuffix .cmx, $(files))
69
70    protected.OBJ       = $(file $(name)$(EXT_OBJ))
71    protected.CMO       = $(file $(name).cmo)
72    protected.CMX       = $(file $(name).cmx)
73    protected.CMI       = $(file $(name).cmi)
74    protected.MLI       = $(file $(name).mli)
75
76    protected.BYTE_TARGETS   = $(CMO)
77    protected.NATIVE_TARGETS = $(CMX) $(OBJ)
78
79    protected.TARGETS = $(CMI)
80    if $(NATIVE_ENABLED)
81        TARGETS += $(NATIVE_TARGETS)
82        export
83
84    if $(BYTE_ENABLED)
85        TARGETS += $(BYTE_TARGETS)
86        export
87
88    #
89    # Link commands
90    #
91    protected.BYTE_DEPS = $(CMOFILES)
92    if $(and $(not $(NATIVE_ENABLED)), $(target-exists $(MLI)))
93       BYTE_DEPS += $(CMI)
94       export
95    else
96       BYTE_TARGETS += $(CMI)
97       export
98
99    protected.NATIVE_DEPS = $(CMXFILES) $(OFILES)
100    if $(target-exists $(MLI))
101       NATIVE_DEPS += $(CMI)
102       export
103    else
104       NATIVE_TARGETS += $(CMI)
105       export
106
107    if $(target-exists $(MLI))
108       $(CMI): $(MLI) :scanner: scan-ocaml-$(name).mli
109            $(OCamlC) -c $<
110    elseif $(NATIVE_ENABLED)
111       $(NATIVE_TARGETS) $(CMI): $(NATIVE_DEPS)
112            $(OCAMLFIND) $(OCAMLOPTLINK) $(LAZY_OCAMLFINDFLAGS) $(PREFIXED_OCAMLPACKS) $(OCAMLFLAGS) \
113                $(OCAMLOPTFLAGS) $(OCAML_LIB_FLAGS) -pack -o $(CMX) $(OCamlLinkSort $(CMXFILES))
114    else
115       $(BYTE_TARGETS) $(CMI): $(BYTE_DEPS)
116            $(OCAMLFIND) $(OCAMLC) $(LAZY_OCAMLFINDFLAGS) $(PREFIXED_OCAMLPACKS) $(OCAMLFLAGS) \
117                $(OCAMLCFLAGS) $(OCAML_LIB_FLAGS) -pack -o $(CMO) $(OCamlLinkSort $(CMOFILES))
118
119    return $(TARGETS)
120
121 # ------------------------------
122 # ounit
123 # ------------------------------
124 OUNIT_SRC_DIR=./
125 OUNIT_LIBS[]=
126
127 public.OUnitTest(name,files) =
128         protected.test_file = $(addsuffix Test,$(name))
129         protected.target    = $(addsuffix -runner,$(test_file))
130         protected.src_files = $(addprefix $(OUNIT_SRC_DIR),$(files))
131
132         .PHONY: check check-$(name) clean check-detail-$(name) check-detail
133         OCamlProgram($(target), $(test_file) $(src_files) $(OUNIT_LIBS))
134
135         check-$(name): $(target)
136                 $(addprefix ./,$(target))
137
138         check-$(name): $(target)
139                 $(addprefix ./,$(target))
140         check-detail-$(name): $(target)
141                 ($(addprefix ./,$(target)) -verbose ; true) | tee -a $(ROOT)/unittest.log
142
143         check: check-$(name)
144         check-detail: check-detail-$(name)
145
146         export
147
148 # ------------------------------
149 # other rules
150 # ------------------------------
151 %.mli : %.mlip
152     @rm -f $@
153     @echo "(* CAUTION: this is a generated file.  If you edit it, all changes will be lost! *)" > $@
154     $(CPP) $(CPPFLAGS) $*.mlip >> $@
155     @chmod 444 $@
156
157 .SCANNER: %.mli : %.mlip
158     $(CPP) $(CPPFLAGS) -M $< ;  true
159
160 %.ml: %.mlp
161     @rm -f $@
162     @echo "(* CAUTION: this is a generated file.  If you edit it, all changes will be lost! *)" > $@
163     $(CPP) $(CPPFLAGS) $*.mlp >> $@
164     @chmod 444 $@
165
166 .SCANNER: %.ml : %.mlp
167     $(CPP) $(CPPFLAGS) -M $< /dev/null ; true
168
169 # ------------------------------
170 # config
171 # ------------------------------
172 config: OMakefile.config config.ml
173
174 .INCLUDE: OMakefile.config
175         if $(mem config,$(TARGETS))
176                 rm -f $@
177                 if $(and $(defined RELATIVE),$(RELATIVE))
178                         echo LIB_DIR=$(PREFIX) >> $@
179                         echo SHARE_DIR=$(PREFIX) >> $@
180                         echo BIN_DIR=$(PREFIX) >> $@
181                 else
182                         if $(not $(defined LIB_DIR))
183                                 echo LIB_DIR=$(PREFIX)/lib/habc >> $@
184                         else
185                                 echo LIB_DIR=$(LIB_DIR) >> $@
186                         if $(not $(defined SHARE_DIR))
187                                 echo SHARE_DIR=$(PREFIX)/share/habc >> $@
188                         else
189                                 echo SHARE_DIR=$(SHARE_DIR) >> $@
190                         if $(not $(defined BIN_DIR))
191                                 echo BIN_DIR=$(PREFIX)/bin >> $@
192                         else
193                                 echo BIN_DIR=$(BIN_DIR) >> $@
194
195                 if $(shell-success-null ocamlc$(if $(OCAMLC_OPT_EXISTS), .opt) -annot)
196                         @echo "static.OCAMLFLAGS +=-annot" >> $@
197                 else
198                         @echo "static.OCAMLFLAGS +=-dtypes" >> $@
199                 if $(ENABLE_DEBUG)
200                         @echo "static.OCAMLFLAGS +=-g" >> $@
201                 if $(ENABLE_NATIVE)
202                         @echo "static.NATIVE_ENABLED = true"  >> $@
203                         @echo "static.BYTE_ENABLED   = false" >> $@
204                 else
205                         @echo "static.NATIVE_ENABLED = false" >> $@
206                         @echo "static.BYTE_ENABLED   = true"  >> $@
207
208
209         if $(not $(file-exists OMakefile.config))
210                 @echo "Please refer to the installation instructions in file README.mkdn."
211                 @echo "If you've just unpacked the distribution, something like"
212                 @echo "   omake config"
213                 @echo "   omake all"
214                 @echo "   omake install"
215                 @echo "should work.  But see the file README.mkdn for more details."
216
217 config.ml:
218         if $(mem config,$(TARGETS))
219                 rm -f $@
220                 echo 'let version = "$(VERSION)"' >> $@
221                 if $(and $(defined RELATIVE),$(RELATIVE))
222                         @echo 'let bin_dir   = Str.global_replace (Str.regexp "\\\\") "/" (Filename.dirname Sys.executable_name)' >> $@
223                         @echo 'let share_dir = bin_dir' >> $@
224                         @echo 'let lib_dir   = bin_dir' >> $@
225                 else
226                         @echo 'let bin_dir   = "$(ocaml-escaped  $(BIN_DIR))"' >> $@
227                         @echo 'let share_dir = "$(ocaml-escaped  $(SHARE_DIR))"' >> $@
228                         @echo 'let lib_dir   = "$(ocaml-escaped  $(LIB_DIR))"' >> $@
229                 @echo 'let default_includes = [lib_dir;"."]' >> $@
230                 @echo 'let default_template = share_dir ^ "/template.xml"' >> $@
231                 @echo 'let path_sep="$(PATHSEP)"' >> $@
232                 @echo 'let exe="$(EXE)"' >> $@
233
234
235 ################################################
236 OCAMLINCLUDES += $(ROOT)
237 .SUBDIRS: scm xml driver base lib camlp4
238
239 # ------------------------------
240 # all
241 # ------------------------------
242 habc-scm$(EXE): scm/habc-scm$(EXE)
243         ln-or-cp $^ .
244
245 habc-xml$(EXE): xml/habc-xml$(EXE)
246         ln-or-cp $^ .
247
248 habc$(EXE) : driver/habc$(EXE)
249         ln-or-cp $^ .
250
251 PROGRAM = habc$(EXE) habc-xml$(EXE) habc-scm$(EXE)
252
253 all: config $(PROGRAM) lib
254
255 .DEFAULT: all
256
257 # ------------------------------
258 # install
259 # ------------------------------
260 install: $(PROGRAM)
261         mkdir -p $(BIN_DIR)
262         mkdir -p $(LIB_DIR)
263         mkdir -p $(SHARE_DIR)
264         mkdir -p $(SHARE_DIR)/example
265         $(INSTALL) $(PROGRAM)   $(BIN_DIR)
266         $(INSTALL) share/habc/* $(SHARE_DIR)
267         $(INSTALL) example/*    $(SHARE_DIR)/example/
268         $(INSTALL) lib/habc/*   $(LIB_DIR)
269         if $(or $(equal Win32,$(OSTYPE)),$(equal Cygwin,$(OSTYPE)))
270                 $(INSTALL) win32/swfmill/* $(BIN_DIR)/
271                 $(INSTALL) README.mkdn $(BIN_DIR)/
272
273 # ------------------------------
274 # other
275 # ------------------------------
276 clean:
277         ocaml-clean *.abc $(PROGRAM)
278
279 package:
280         git archive --format=tar --prefix=habc-$(shell cat VERSION)-src/ HEAD | gzip > habc-$(shell cat VERSION)-src.tar.gz
281