Final merge of HEAD (bf-blender) into the orange branch.
[blender.git] / source / nan_compile.mk
1 #
2 # $Id$
3 #
4 # ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version. The Blender
10 # Foundation also sells licenses for use in proprietary software under
11 # the Blender License.  See http://www.blender.org/BL/ for information
12 # about this.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software Foundation,
21 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 #
23 # The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24 # All rights reserved.
25 #
26 # The Original Code is: all of this file.
27 #
28 # Contributor(s): none yet.
29 #
30 # ***** END GPL/BL DUAL LICENSE BLOCK *****
31 #
32 # Compile and archive
33
34 include nan_definitions.mk
35
36 CPPFLAGS ?= $(NAN_CPPFLAGS)
37
38 # common parts ---------------------------------------------------
39
40 # Uncomment next lines to enable integrated game engine
41 ifneq ($(NAN_NO_KETSJI), true)
42     CFLAGS  += -DGAMEBLENDER=1
43     CFLAGS  += -DUSE_SUMO_SOLID
44     CCFLAGS += -DUSE_SUMO_SOLID
45     ifeq ($(NAN_USE_BULLET), true)
46       CFLAGS  += -DUSE_BULLET
47       CCFLAGS += -DUSE_BULLET
48     endif
49 else
50    CPPFLAGS += -DNO_KETSJI
51 endif
52
53 ifdef NAN_DEBUG
54     CFLAGS += $(NAN_DEBUG)
55     CCFLAGS += $(NAN_DEBUG)
56 endif
57
58 REL_CFLAGS      += -DNDEBUG
59 REL_CCFLAGS     += -DNDEBUG
60 DBG_CFLAGS      += -g
61 DBG_CCFLAGS     += -g
62
63 # OS dependent parts ---------------------------------------------------
64
65 ifeq ($(OS),beos)
66     CC  = gcc
67     CCC = g++
68     CFLAGS      += -pipe -fPIC
69     CFLAGS      += -pipe -fPIC
70     REL_CFLAGS  += -O2
71     REL_CCFLAGS += -O2
72     NAN_DEPEND  = true
73     OPENGL_HEADERS  = .
74     CPPFLAGS    += -D__BeOS
75     AR  = ar
76     ARFLAGS = ruv
77     ARFLAGSQUIET = ru
78 endif
79
80 ifeq ($(OS),darwin)
81     CC  = gcc
82     CCC = g++
83     CFLAGS      += -pipe -fPIC -ffast-math -mcpu=7450 -mtune=G5
84     CCFLAGS     += -pipe -fPIC 
85 #    REL_CFLAGS += -O2
86 #   REL_CCFLAGS += -O2
87     CPPFLAGS    += -D_THREAD_SAFE
88     NAN_DEPEND  = true
89     OPENGL_HEADERS = /System/Library/Frameworks/OpenGL.framework
90     AR = ar
91     ARFLAGS = ruv
92     RANLIB = ranlib
93     ARFLAGSQUIET = ru
94 endif
95
96 ifeq ($(OS),freebsd)
97     CC  = gcc
98     CCC = g++
99     JAVAC = javac
100     JAVAH = javah
101     CFLAGS      += -pipe -fPIC
102     CCFLAGS     += -pipe -fPIC
103     REL_CFLAGS  += -O2
104     REL_CCFLAGS += -O2
105     CPPFLAGS    += -D_THREAD_SAFE
106     NAN_DEPEND  = true
107     OPENGL_HEADERS  = /usr/X11R6/include
108     JAVA_HEADERS = /usr/local/jdk1.3.1/include
109     JAVA_SYSTEM_HEADERS = /usr/local/jdk1.3.1/include/freebsd
110     AR  = ar
111     ARFLAGS = ruv
112     ARFLAGSQUIET = ru
113 endif
114
115 ifeq ($(OS),irix)
116     CC  = cc
117     CCC = CC
118     CFLAGS      += -n32 -mips3 -Xcpluscomm
119     CCFLAGS     += -n32 -mips3 -Xcpluscomm -LANG:std
120     CCFLAGS     += -LANG:libc_in_namespace_std=off
121     REL_CFLAGS  += -n32 -mips3 -O2 -OPT:Olimit=0
122     REL_CCFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
123     OPENGL_HEADERS = /usr/include
124     NAN_DEPEND = true
125     AR = CC
126     ARFLAGS = -ar -o
127         ARFLAGSQUIET = -ar -o
128 endif
129
130 ifeq ($(OS),linux)
131     CC  = gcc
132     CCC = g++
133 #    CFLAGS     += -pipe
134     CFLAGS      += -pipe -fPIC 
135     CCFLAGS     += -pipe -fPIC
136 #    CCFLAGS    += -pipe
137     REL_CFLAGS  += -O2
138     REL_CCFLAGS += -O2
139     NAN_DEPEND = true
140   ifeq ($(CPU),alpha)
141     CFLAGS += -mieee
142   endif
143     OPENGL_HEADERS = /usr/X11R6/include
144     AR = ar
145     ARFLAGS = ruv
146     ARFLAGSQUIET = ru
147 endif
148
149 ifeq ($(OS),openbsd)
150     CC  = gcc
151     CCC = g++
152     CFLAGS      += -pipe -fPIC
153     CCFLAGS     += -pipe -fPIC
154     REL_CFLAGS  += -O2
155     REL_CCFLAGS += -O2
156     NAN_DEPEND = true
157     CPPFLAGS += -D__FreeBSD__
158     OPENGL_HEADERS = /usr/X11R6/include
159     AR = ar
160     ARFLAGS = ruv
161     ARFLAGSQUIET = ru
162 endif
163
164 ifeq ($(OS),solaris)
165     CC  = gcc
166     CCC = g++
167     JAVAC = javac
168     JAVAH = javah
169     CFLAGS      += -pipe -fPIC
170     CCFLAGS     += -pipe -fPIC
171     REL_CFLAGS  += -O1
172     REL_CCFLAGS += -O1
173     NAN_DEPEND = true
174   ifeq ($(CPU),sparc)
175     OPENGL_HEADERS = /usr/openwin/share/include
176     CPPFLAGS += -DSUN_OGL_NO_VERTEX_MACROS
177     JAVA_HEADERS = /usr/java/include
178     JAVA_SYSTEM_HEADERS = /usr/java/include/solaris
179   else
180     OPENGL_HEADERS = /usr/local/include
181   endif
182     AR = ar
183     ARFLAGS = ruv
184     ARFLAGSQUIET = ru
185 endif
186
187 ifeq ($(OS),windows)
188   ifeq ($(FREE_WINDOWS),true)
189     CC  = gcc
190     CCC = g++
191     CFLAGS += -pipe -mno-cygwin -mwindows
192     CCFLAGS += -pipe -mno-cygwin -mwindows
193     CPPFLAGS += -DFREE_WINDOWS
194     REL_CFLAGS += -O2
195     REL_CCFLAGS += -O2
196     NAN_DEPEND = true
197     #OPENGL_HEADERS = /usr/include/w32api
198     OPENGL_HEADERS = ./
199     AR = ar
200     ARFLAGS = ruv
201     ARFLAGSQUIET = ru
202     WINRC = $(wildcard *.rc)    
203     RANLIB = ranlib
204   else
205     CC  = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
206     CCC = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
207     JAVAC = $(SRCHOME)/tools/cygwin/java_wrapper.pl -c
208     JAVAH = $(SRCHOME)/tools/cygwin/java_wrapper.pl -h
209     REL_CFLAGS  += /O2
210     REL_CCFLAGS += /O2 -GX
211     DBG_CFLAGS  += /Fd$(DIR)/debug/
212     DBG_CCFLAGS += /Fd$(DIR)/debug/
213     CFLAGS += /MT
214     CCFLAGS += /MT
215     NAN_DEPEND = true
216     OPENGL_HEADERS = .
217     CPPFLAGS += -DWIN32 -D_WIN32 -D__WIN32
218     CPPFLAGS += -D_M_IX86
219     CPPFLAGS += -I"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/include"
220     JAVA_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include
221     JAVA_SYSTEM_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include/win32
222     CPP = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
223     AR = ar
224     ARFLAGS = ruv
225     ARFLAGSQUIET = ru
226     WINRC = $(wildcard *.rc)
227   endif
228 endif
229
230 ifeq (debug, $(findstring debug, $(MAKECMDGOALS)))
231     export DEBUG_DIR=debug/
232 endif
233
234 ifneq (x$(DEBUG_DIR), x)
235     CFLAGS +=$(DBG_CFLAGS)
236     CCFLAGS+=$(DBG_CCFLAGS)
237 else
238     CFLAGS +=$(REL_CFLAGS)
239     CCFLAGS+=$(REL_CCFLAGS)
240 endif
241
242 # Note: include nan_warn's LEVEL_*_WARNINGS after CC/OS have been set.
243 include nan_warn.mk
244
245 # compile rules
246
247 default: all
248
249 $(DIR)/$(DEBUG_DIR)%.o: %.c
250     ifdef NAN_DEPEND
251         @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
252                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
253                 > $(DIR)/$(DEBUG_DIR)$*.d; \
254                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
255     endif
256     ifdef NAN_QUIET
257         @echo " -- $< -- "
258         @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
259     else
260         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
261     endif
262
263 $(DIR)/$(DEBUG_DIR)%.o: %.cpp
264     ifdef NAN_DEPEND
265         @set -e; $(CCC) -M $(CPPFLAGS) $< 2>/dev/null \
266                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
267                 > $(DIR)/$(DEBUG_DIR)$*.d; \
268                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
269     endif
270     ifdef NAN_QUIET
271         @echo " -- $< -- "
272         @$(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
273     else
274         $(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
275     endif
276
277 $(DIR)/$(DEBUG_DIR)%.res: %.rc
278 ifeq ($(FREE_WINDOWS),true)
279         windres $< -O coff -o $@
280 else
281         $(SRCHOME)/tools/cygwin/cl_wrapper.pl - rc /fo$@ $<
282 endif
283
284 $(DIR)/$(DEBUG_DIR)%.class: %.java
285     ifdef JARS
286         $(JAVAC) -verbose -g -deprecation -sourcepath . -classpath "$(JARS)" -d $(DIR)/$(DEBUG_DIR) $<
287     else
288         $(JAVAC) -verbose -g -deprecation -d $(DIR)/$(DEBUG_DIR) $<
289     endif
290
291 $(DIR)/$(DEBUG_DIR)%.h: $(DIR)/$(DEBUG_DIR)%.class
292         $(JAVAH) -classpath $(DIR)/$(DEBUG_DIR) -d $(DIR)/$(DEBUG_DIR) -jni $*
293
294 %.h:
295         @echo "WARNING: Fake header creation rule used, dependencies will be remade"
296
297 CSRCS  ?= $(wildcard *.c)
298 CCSRCS ?= $(wildcard *.cpp)
299 JSRCS  ?= $(wildcard *.java)
300
301 ifdef NAN_DEPEND
302 -include $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.d) $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.d)
303 endif
304
305 OBJS += $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.o)
306 OBJS += $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.o)
307 OBJS += $(WINRC:%.rc=$(DIR)/$(DEBUG_DIR)%.res)
308
309 JCLASS += $(JSRCS:%.java=$(DIR)/$(DEBUG_DIR)%.class)
310
311 LIB_a = $(DIR)/$(DEBUG_DIR)lib$(LIBNAME).a
312
313 $(LIB_a): $(OBJS)
314    # $OBJS can be empty except for some spaces
315     ifneq (x, x$(strip $(OBJS)))
316       ifdef NAN_PARANOID
317         @$(RM) $(LIB_a)
318         ifdef NAN_QUIET
319         @echo " -- lib: lib$(LIBNAME).a -- "
320         @$(AR) $(ARFLAGSQUIET) $@ $(OBJS)
321         else
322         $(AR) $(ARFLAGS) $@ $(OBJS)
323         endif
324       else
325         ifdef NAN_QUIET
326         @echo " -- lib: lib$(LIBNAME).a -- "
327         @$(AR) $(ARFLAGSQUIET) $@ $?
328         else
329         $(AR) $(ARFLAGS) $@ $?
330         endif
331       endif
332       ifdef RANLIB
333         $(RANLIB) $@
334       endif
335     endif
336
337 ALLTARGETS ?= $(LIB_a)
338
339 all debug :: makedir $(ALLTARGETS)
340
341 lib: $(LIB_a)
342
343 creator: $(OBJS)
344         @echo "====> make creator subtarget in `pwd | sed 's/^.*develop\///'`"
345         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)cre
346         @$(MAKE) lib CSRCS="$(CRE_CSRCS)" LIBNAME=$(LIBNAME)$@
347
348 publisher: $(OBJS)
349         @echo "====> make publisher subtarget in `pwd | sed 's/^.*develop\///'`"
350         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)pub
351         @$(MAKE) lib CSRCS="$(PUB_CSRCS)" LIBNAME=$(LIBNAME)$@
352
353 player: $(OBJS)
354         @echo "====> make player subtarget in `pwd | sed 's/^.*develop\///'`"
355         @$(MAKE) makedir DIR=$(DIR)/player/$(DEBUG_DIR)
356         @$(MAKE) lib CSRCS="$(SAP_CSRCS)" LIBNAME=$(LIBNAME)$@
357
358 clean:: optclean debugclean
359
360 optclean::
361         @-[ ! -d $(DIR) ] || ( cd $(DIR) && \
362             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
363
364 debugclean::
365         @-[ ! -d $(DIR)/debug ] || ( cd $(DIR)/debug && \
366             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
367
368 .PHONY: makedir
369 makedir::
370         @# don't use mkdir -p. Cygwin will try to make network paths and fail
371         @[ -d $(DIR) ] || mkdir $(DIR)
372         @[ -d $(DIR)/debug ] || mkdir $(DIR)/debug
373