v0.97a
[apc.git] / OMakeroot
blobc6c9a4d146fb737f73e879ec9b2a6ca26f12af35
1 OMakeFlags(-w)
3 if $(not $(defined TARGET_OS))
4     if $(equal $(OSTYPE), Win32)
5         TARGET_OS = win
6         export
7     else
8         TARGET_OS = nix
9         export
10     export
11 #TARGET_OS       = win
12 #TARGET_OS       = nix
14 imt             = imt #$(file build/common/bin/imt)
15 cc              = gcc
16 cxx             = g++
17 ocamlc-cflags   = -warn-error A -g
18 ocamlopt-cflags = -warn-error A
19 ocamlc-lflags   =
20 ocamlopt-lflags =
21 target-flags    =
22 ocamlc          = ocamlc.opt
23 ocamlopt        = ocamlopt.opt
24 ocamldep        = ocamldep
25 host-win32      = $(equal $(OSTYPE), Win32)
26 target-win32    = $(equal $(TARGET_OS), win)
27 cross-win32     = $(and $(target-win32), $(not $(host-win32)))
28 target-mingw    = $(defined mingw)
29 mingw           = $(EMPTY)
30 darwin          = $(equal $(SYSNAME), Darwin)
32 if $(defined top-dir)
33     ls -lR $(top-dir) >/dev/null
35 if $(target-win32)
36     if $(target-mingw)
37         mingw = $(if $(cross-win32), mingwf, $(EMPTY))
38         wine = $(if $(cross-win32), wine, $(EMPTY))
39 #        if $(cross-win32)
40 #            wineserver -p
41         exe = .exe
42         obj = .o
43         dllname(name) =
44             return $(name).dll
45         libname(name) =
46             return lib$(name).a
47         exename(name) =
48             return $(name).exe
49         ocamlc = $(wine) ocamlc.opt.exe
50         ocamlopt = $(wine) ocamlopt.opt.exe
51         if $(not $(cross-win32))
52             ocamldep = ocamldep.exe
53             export
54         cc = $(mingw) gcc
55         cxx = $(mingw) g++
56         c-cflags = -Wall -Werror -g
57         cxx-cflags = -Wall -Werror -g
58         TARGET_OS = mingw
59         export
60     else
61         dxsdk = $(getenv DXSDK_DIR, $(EMPTY))
62         if $(not $(equal $(dxsdk), $(EMPTY)))
63             setenv (INCLUDE, $(getenv INCLUDE)$";$(dxsdk)\include")
64             setenv (LIB, $(getenv LIB)$";$(dxsdk)\lib\x86")
65             export
66         wine = $(if $(cross-win32), wine, $(EMPTY))
67         if $(cross-win32)
68             wineserver -p
69         exe = .exe
70         obj = .obj
71         dllname(name) =
72             return $(name).dll
73         libname(name) =
74             return $(name).lib
75         exename(name) =
76             return $(name).exe
77         ocamlc = $(wine) ocamlc.opt.exe
78         ocamlopt = $(wine) ocamlopt.opt.exe
79         if $(not $(cross-win32))
80             ocamldep = ocamldep.exe
81             export
82         c-cflags = -WX -W4 -Zi -MT
83         cxx-cflags = -WX -W4 -Zi -MT
84         export
85     export
86 else
87     obj = .o
88     exe =
89     switch $(SYSNAME)
90     case Darwin
91         dllname(name) =
92             return lib$(name).a
93         export dllname
94     default
95         dllname(name) =
96             return lib$(name).so
97         export dllname
98     libname(name) =
99         return lib$(name).a
100     exename(name) =
101         return $(name)
102     c-cflags = -Wall -Werror -W -fstrict-aliasing -g -Wno-long-long -pipe
103     cxx-cflags = -Wall -Werror -W -fstrict-aliasing -g -Wno-long-long -pipe
104     c-cflags += -pedantic
105     cxx-cflags = -pedantic
106     export
108 match $(MACHINE)
109 case $"i[3456]86"
110     c-cflags += -DX86_ASSEMBLER
111     x86 = true
112     export
113 case $"Power.*"
114     c-cflags += -DWORDS_BIGENDIAN
115     x86 = false
116     export
117 case $"ppc"
118     c-cflags += -DWORDS_BIGENDIAN
119     x86 = false
120     export
121 default
122     eprintln (Machine "$(MACHINE)" is not recognized)
123     x86 = false
124 #    exit (1)
126 emit-stdmake-rule(name) =
127     if $(defined make-file)
128         t = $(target $(name))
129         deps = $(fullname $(filter-targets $(filter-out %.scan, $(t.build-deps))))
130         stdout = $(make-file)
131         echo $(fullname $(t.target))\: $(deps)
132         d = $(fullname $(dirof $(t.target)))
133         # mucho importante - first char after quotation mark is tab
134         echo "  mkdir -p $d && cd $d && $(t.build-commands)"
135     return
137 caml-emit-stdmake-rule(name) =
138     emit-stdmake-rule($(name))
140 c-emit-stdmake-rule(name) =
141     emit-stdmake-rule($(name))
143 cxx-emit-stdmake-rule(name) =
144     emit-stdmake-rule($(name))
146 emit-stdmake-line(line) =
147     if $(defined make-file)
148         fprintln($(make-file), $(line))
150 emit-stdmake-dep(target, prereq) =
151     emit-stdmake-line($(target)\: $(fullname $(prereq)))
153 .ORDER: .caml-order
154 .caml-order: %.cmi: %.cmo
155 .caml-order: %.cmx: %.cmo
157 caml-sort(files) =
158     return $(file-sort .caml-order, $(files))
160 collect-includes(flags) =
161     dirs[] =
162     next = false
163     foreach (f, $(flags))
164         if $(next)
165             dirs += $f
166             next = false
167             export
168         else
169             f = $(string $f)
170             l = $(f.length)
171             if $(and $(gt $l, 1), \
172                      $(and $(equal $(f.nth 0), -), \
173                            $(equal $(f.nth 1), I)))
174                 if $(gt $l, 2)
175                     dirs += $(removeprefix -I, $f)
176                     export
177                 else
178                     next = true
179                     export
180                 export
181             export
182         export
183     return $(dirs)
185 cpp-digest-deps(flags) =
186     includes = $(collect-includes $(flags))
187     return $(digest-in-path-optional $(includes) ., $&)
189 c-digest-deps() =
190     return cpp-digest-deps($(c-cflags) $(target-flags))
192 cxx-digest-deps() =
193     return cpp-digest-deps($(cxx-cflags) $(target-flags))
195 Shell. +=
196     pr-list(argv) =
197         foreach(a, $(argv))
198             println($a)
200     eecho(argv) =
201         eprintln($(string $(argv)))
203     caml-scan(argv) =
204         emacs-helper = directory $"`"$(absname $(dirof $<))\'
205         depflags = $(mapprefix -I, \
206                      $(collect-includes $(target-flags) $(ocamlc-cflags)))
207         eecho make[0]\: Entering $(emacs-helper)
208         depflags += $(if $(equal $(length $(filter-out %.cmx, $@)), 0),-native,$(EMPTY))
209         cd $(dirof $<) &&                                   \
210         $(ocamldep) $(depflags) $(basename $<) && \
211         eecho make[0]\: Leaving $(emacs-helper) #|| exit 10
213 .SCANNER: %.o.scan: %.c
214     $(cc) -MT $* -M $(target-flags) $(c-cflags) $<
216 .SCANNER: %.o.scan: %.cpp
217     $(cxx) -MT $* -M $(target-flags) $(cxx-cflags) $<
219 %.o: %.c :scanner: %.o.scan \
220     :value: $(c-digest-deps) :value: $(c-emit-stdmake-rule $@)
221     $(cc) -c $(target-flags) $(c-cflags) $<
223 %.o: %.cpp :scanner: %.o.scan \
224     :value: $(cxx-digest-deps) :value: $(cxx-emit-stdmake-rule $@)
225     $(cxx) -c $(target-flags) $(cxx-cflags) $<
227 .SCANNER: %.obj.scan: %.c
228     imt dep7 $* $(target-flags) $(c-cflags) $<
230 .SCANNER: %.obj.scan: %.cpp
231     imt dep7 $* $(target-flags) $(cxx-cflags) $<
233 %.obj: %.c :scanner: %.obj.scan \
234     :value: $(c-digest-deps) :value: $(c-emit-stdmake-rule $@)
235     imt cl -c $(target-flags) $(c-cflags) $<
237 %.obj: %.cpp :scanner: %.obj.scan \
238     :value: $(cxx-digest-deps) :value: $(cxx-emit-stdmake-rule $@)
239     imt cl -c $(target-flags) $(cxx-cflags) $<
241 .SCANNER: %.cmo.scan: %.ml
242     caml-scan
244 .SCANNER: %.cmx.scan: %.ml
245     caml-scan
247 .SCANNER: %.cmi.scan: %.mli
248     caml-scan
250 %.cmi %.cmi-o: %.mli :scanner: %.cmi.scan
251     $(ocamlc) -o $*.cmi -c $(target-flags) $(ocamlc-cflags) $< && touch $*.cmi-o
253 %.cmi %.cmi-x: %.mli :scanner: %.cmi.scan
254     $(ocamlopt) -o $*.cmi -c $(target-flags) $(ocamlopt-cflags) $< \
255         && touch $*.cmi-x
257 %.cmo: %.ml
258     section rule
259         if $(target-exists %.mli)
260             %.cmo: %.ml %.cmi-o %.cmi :value: $(caml-emit-stdmake-rule $@) \
261                 :scanner: %.cmo.scan
262                 $(ocamlc) -o $@ -c $(target-flags) $(ocamlc-cflags) $<
263         else
264             %.cmo: %.ml :scanner: %.cmo.scan :effects: %.cmi \
265                 :value: $(caml-emit-stdmake-rule $@)
266                 $(ocamlc) -o $@ -c $(target-flags) $(ocamlc-cflags) $<
268 if $(target-win32)
269     %.obj %.cmx: %.ml
270         section rule
271             if $(target-exists %.mli)
272                 %.obj %.cmx: %.ml %.cmi-x %.cmi \
273                     :value: $(caml-emit-stdmake-rule $@)
274                     $(ocamlopt) -o $*.cmx -c $(target-flags) \
275                         $(ocamlopt-cflags) $<
276             else
277                 %.obj %.cmx: %.ml :scanner: %.cmx.scan :effects: %.cmi \
278                     :value: $(caml-emit-stdmake-rule $@)
279                     $(ocamlopt) -o $*.cmx -c $(target-flags) \
280                         $(ocamlopt-cflags) $<
281     export
282 else
283     %.o %.cmx: %.ml
284         section rule
285             if $(target-exists %.mli)
286                 %.o %.cmx: %.ml %.cmi-x %.cmi \
287                     :value: $(caml-emit-stdmake-rule $@)
288                     $(ocamlopt) -o $*.cmx -c $(target-flags) \
289                         $(ocamlopt-cflags) $<
290             else
291                 %.o %.cmx: %.ml :scanner: %.cmx.scan :effects: %.cmi \
292                     :value: $(caml-emit-stdmake-rule $@)
293                     $(ocamlopt) -o $*.cmx -c $(target-flags) \
294                         $(ocamlopt-cflags) $<
295     export
297 profile =
298     if $(defined profile)
299         value $(profile)
300     else
301         value debug
303 switch $(profile)
304 case release
305     profile-c-cflags[] = -O2 -DNDEBUG
306     profile-cxx-cflags[] = -O2 -DNDEBUG
307     export
308 case debug
309     profile-c-cflags[] = -DDEBUG
310     profile-cxx-cflags[] = -DDEBUG
311     export
313 build-dir = build/$(TARGET_OS)/$(profile)
315 subdirs[] =
317 if $(not $(defined top-dir))
318     top-dir = $(dir .)
319     export top-dir
321 add-env(subdir) =
322     mkdir -p $(build-dir)/$(subdir)
323     add-project-directories($(subdir))
325 add-env2(subdir) =
326     mkdir -p $(subdir)
327     add-project-directories($(top-dir)/$(subdir))
329 create-env(subdirs) =
330     subdirs += .
331     foreach(subdir, $(subdirs))
332         mkdir -p $(build-dir)/$(subdir)
333     add-project-directories($(subdirs))
335 create-env($(subdirs))
337 #make-file = $(fopen $(build-dir)/Makefile, w)
339 vmount($(top-dir), $(build-dir))
340 bin-path = $(dir $(build-dir)/bin)
342 mkdir -p $(build-dir)
343 mkdir -p $(bin-path)
345 .PHONY: all clean
346 .DEFAULT: all
347 .SUBDIRS: $(build-dir)