OSDN Git Service

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