be38eac4f92a50696b61c1e8c06aea30b01e7de8
[blender-staging.git] / build_files / make / nan_compile.mk
1 # -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
2 # vim: tabstop=8
3 #
4 # $Id$
5 #
6 # ***** BEGIN GPL LICENSE BLOCK *****
7 #
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License
10 # as published by the Free Software Foundation; either version 2
11 # of the License, or (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software Foundation,
20 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #
22 # The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23 # All rights reserved.
24 #
25 # The Original Code is: all of this file.
26 #
27 # Contributor(s): GSR, Stefan Gartner
28 #
29 # ***** END GPL LICENSE BLOCK *****
30 #
31 # Compile and archive
32
33 include nan_definitions.mk
34
35 CPPFLAGS ?= $(NAN_CPPFLAGS)
36
37 # common parts ---------------------------------------------------
38
39 # Uncomment next lines to enable integrated game engine
40 ifneq ($(NAN_NO_KETSJI), true)
41     CFLAGS  += -DGAMEBLENDER=1
42     ifeq ($(NAN_USE_BULLET), true)
43       CFLAGS  += -DUSE_BULLET
44       CCFLAGS += -DUSE_BULLET
45     endif
46 else
47    CPPFLAGS += -DNO_KETSJI
48 endif
49
50 ifeq ($(BF_PROFILE), true)
51     CFLAGS += -pg
52     CCFLAGS += -pg
53 endif
54
55 ifeq ($(WITH_BF_OPENMP), true)
56     CFLAGS += -fopenmp
57     CCFLAGS += -fopenmp
58 endif
59
60 ifdef NAN_DEBUG
61     CFLAGS += $(NAN_DEBUG)
62     CCFLAGS += $(NAN_DEBUG)
63 endif
64
65 REL_CFLAGS  += -DNDEBUG
66 REL_CCFLAGS += -DNDEBUG
67 DBG_CFLAGS  += -g
68 DBG_CCFLAGS += -g
69
70 # OS dependent parts ---------------------------------------------------
71
72 ifeq ($(OS),darwin)
73     CC ?= gcc
74     CCC ?= g++
75     ifeq ($(MACOSX_DEPLOYMENT_TARGET), 10.4)
76         CC = gcc-4.0
77         CCC = g++-4.0
78     else
79         ifeq ($(MACOSX_DEPLOYMENT_TARGET), 10.5)
80             CC  = gcc-4.2
81             CCC = g++-4.2
82         endif
83     endif
84     ifeq ($(CPU),powerpc)
85         CFLAGS  += -pipe -fPIC -mcpu=7450 -mtune=G5 -funsigned-char -fno-strict-aliasing
86         CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
87     else
88         CFLAGS  += -pipe -fPIC -funsigned-char
89         CCFLAGS += -pipe -fPIC -funsigned-char
90     endif
91
92     CFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
93     CCFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
94
95     ifeq ($(MACOSX_ARCHITECTURE), $(findstring $(MACOSX_ARCHITECTURE), "i386 x86_64"))
96         REL_CFLAGS += -O2 -ftree-vectorize -msse -msse2 -msse3
97         REL_CCFLAGS += -O2 -ftree-vectorize -msse -msse2 -msse3
98     else
99         REL_CFLAGS += -O2
100         REL_CCFLAGS += -O2
101     endif
102
103     CPPFLAGS += -D_THREAD_SAFE
104
105     ifeq ($(WITH_COCOA), true)
106         CPPFLAGS += -DGHOST_COCOA
107     endif
108     ifeq ($(USE_QTKIT), true)
109         CPPFLAGS += -DUSE_QTKIT
110     endif
111
112     NAN_DEPEND  = true
113     OPENGL_HEADERS = /System/Library/Frameworks/OpenGL.framework
114     AR = ar
115     ARFLAGS = ruv
116     RANLIB = ranlib
117     ARFLAGSQUIET = ru
118 endif
119
120 ifeq ($(OS),freebsd)
121     CC  ?= gcc
122     CCC ?= g++
123     JAVAC = javac
124     JAVAH = javah
125     CFLAGS  += -pipe -fPIC -funsigned-char -fno-strict-aliasing
126     CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
127     REL_CFLAGS  += -O2
128     REL_CCFLAGS += -O2
129     CPPFLAGS += -D_THREAD_SAFE
130     NAN_DEPEND = true
131     OPENGL_HEADERS  = /usr/X11R6/include
132     JAVA_HEADERS = /usr/local/jdk1.3.1/include
133     JAVA_SYSTEM_HEADERS = /usr/local/jdk1.3.1/include/freebsd
134     AR = ar
135     ARFLAGS = ruv
136     ARFLAGSQUIET = ru
137 endif
138
139 ifeq ($(OS),irix)
140     ifeq ($(IRIX_USE_GCC),true)
141         CC  ?= gcc
142         CCC ?= g++
143         CFLAGS += -fPIC -funsigned-char -fno-strict-aliasing -mabi=n32 -mips4
144         CCFLAGS += -fPIC -fpermissive -funsigned-char -fno-strict-aliasing -mabi=n32 -mips4
145         REL_CFLAGS += -O2
146         REL_CCFLAGS += -O2 
147         DBG_CFLAGS += -g3 -gdwarf-2 -ggdb
148         DBG_CCFLAGS += -g3 -gdwarf-2 -ggdb
149     else
150         CC  ?= cc
151         CCC ?= CC
152         CFLAGS  += -n32 -mips3 -Xcpluscomm
153         CCFLAGS += -n32 -mips3 -Xcpluscomm -LANG:std
154         ifdef MIPS73_ISOHEADERS
155             CCFLAGS += -LANG:libc_in_namespace_std=off -I$(MIPS73_ISOHEADERS)
156         else
157             CCFLAGS += -LANG:libc_in_namespace_std=off
158         endif
159         REL_CFLAGS  += -n32 -mips3 -O2 -OPT:Olimit=0
160         REL_CCFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
161     endif
162     OPENGL_HEADERS = /usr/include
163     NAN_DEPEND = true
164     AR = CC
165     ARFLAGS = -ar -o
166     ARFLAGSQUIET = -ar -o
167 endif
168
169 ifeq ($(OS),linux)
170     CC  ?= gcc
171     CCC ?= g++
172 #    CFLAGS += -pipe
173 #    CCFLAGS += -pipe
174     CFLAGS  += -pipe -fPIC -funsigned-char -fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
175     CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
176     REL_CFLAGS  += -O2
177     REL_CCFLAGS += -O2
178     NAN_DEPEND = true
179   ifeq ($(CPU),alpha)
180     CFLAGS += -mieee
181   endif
182     OPENGL_HEADERS = /usr/X11R6/include
183     AR = ar
184     ARFLAGS = ruv
185     ARFLAGSQUIET = ru
186 endif
187
188 ifeq ($(OS),openbsd)
189     CC  ?= gcc
190     CCC ?= g++
191     CFLAGS  += -pipe -fPIC -funsigned-char -fno-strict-aliasing
192     CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
193     REL_CFLAGS  += -O2
194     REL_CCFLAGS += -O2
195     NAN_DEPEND = true
196     CPPFLAGS += -D__FreeBSD__
197     OPENGL_HEADERS = /usr/X11R6/include
198     AR = ar
199     ARFLAGS = ruv
200     ARFLAGSQUIET = ru
201 endif
202
203 ifeq ($(OS),solaris)
204     # Adding gcc flag to $CC is not good, however if its not there makesdna wont build - Campbell
205     ifeq (x86_64, $(findstring x86_64, $(CPU)))
206         CC  ?= gcc -m64
207         CCC ?= g++ -m64
208     else
209         CC  ?= gcc
210         CCC ?= g++
211         #CC  ?= cc
212         #CCC ?= CC
213     endif
214
215     JAVAC = javac
216     JAVAH = javah
217     CFLAGS  += -pipe -fPIC -funsigned-char -fno-strict-aliasing
218     CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
219 #    CFLAGS  += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -KPIC -DPIC -xchar=unsigned"
220 #    CCFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -xlibmopt -features=tmplife -norunpath -KPIC -DPIC -xchar=unsigned"
221
222     # Note, you might still want to compile a 32 bit binary if you have a 64bit system. if so remove the following lines
223 #    ifeq ($(findstring 64,$(CPU)), 64)
224 #        CFLAGS  += -m64
225 #        CCFLAGS += -m64
226 #    endif
227
228     REL_CFLAGS  += -O2
229     REL_CCFLAGS += -O2
230
231     NAN_DEPEND = true
232 #    ifeq ($(CPU),sparc)
233     ifeq ($(findstring sparc,$(CPU)), sparc)
234         OPENGL_HEADERS = /usr/openwin/share/include
235         CPPFLAGS += -DSUN_OGL_NO_VERTEX_MACROS
236         JAVA_HEADERS = /usr/java/include
237         JAVA_SYSTEM_HEADERS = /usr/java/include/solaris
238     else
239         # OPENGL_HEADERS = /usr/X11/include/mesa
240         OPENGL_HEADERS = /usr/X11/include/
241     endif
242     AR = ar
243     ARFLAGS = ruv
244     ARFLAGSQUIET = ru
245 endif
246
247 ifeq ($(OS),windows)
248   ifeq ($(FREE_WINDOWS),true)
249     CC  ?= gcc
250     CCC ?= g++
251     CFLAGS += -pipe -mno-cygwin -mwindows -funsigned-char -fno-strict-aliasing
252     CCFLAGS += -pipe -mno-cygwin -mwindows -funsigned-char -fno-strict-aliasing
253     CPPFLAGS += -DFREE_WINDOWS
254     REL_CFLAGS += -O2
255     REL_CCFLAGS += -O2
256     NAN_DEPEND = true
257     #OPENGL_HEADERS = /usr/include/w32api
258     OPENGL_HEADERS = ./
259     AR = ar
260     ARFLAGS = ruv
261     ARFLAGSQUIET = ru
262     WINRC = $(wildcard *.rc)
263     RANLIB = ranlib
264   else
265     CC  ?= $(SRCHOME)/tools/cygwin/cl_wrapper.pl
266     CCC ?= $(SRCHOME)/tools/cygwin/cl_wrapper.pl
267     JAVAC = $(SRCHOME)/tools/cygwin/java_wrapper.pl -c
268     JAVAH = $(SRCHOME)/tools/cygwin/java_wrapper.pl -h
269     REL_CFLAGS  += /O2
270     REL_CCFLAGS += /O2 -GX
271     DBG_CFLAGS  += /Fd$(DIR)/debug/
272     DBG_CCFLAGS += /Fd$(DIR)/debug/
273     CFLAGS += /MT
274     CCFLAGS += /MT
275     NAN_DEPEND = true
276     OPENGL_HEADERS = .
277     CPPFLAGS += -DWIN32 -D_WIN32 -D__WIN32
278     CPPFLAGS += -D_M_IX86
279     CPPFLAGS += -I"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/include"
280     JAVA_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include
281     JAVA_SYSTEM_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include/win32
282     CPP = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
283     AR = ar
284     ARFLAGS = ruv
285     ARFLAGSQUIET = ru
286     WINRC = $(wildcard *.rc)
287   endif
288 endif
289
290 ifeq (debug, $(findstring debug, $(MAKECMDGOALS)))
291     export DEBUG_DIR=debug/
292 endif
293
294 ifneq (x$(DEBUG_DIR), x)
295     CFLAGS +=$(DBG_CFLAGS)
296     CCFLAGS+=$(DBG_CCFLAGS)
297 else
298     CFLAGS +=$(REL_CFLAGS)
299     CCFLAGS+=$(REL_CCFLAGS)
300 endif
301
302 # Note: include nan_warn's LEVEL_*_WARNINGS after CC/OS have been set.
303 include nan_warn.mk
304
305 # compile rules
306
307 default: all
308
309 $(DIR)/$(DEBUG_DIR)%.o: %.c
310     ifdef NAN_DEPEND
311         @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
312                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
313                 > $(DIR)/$(DEBUG_DIR)$*.d; \
314                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
315     endif
316     ifdef NAN_QUIET
317         @echo " -- $< -- "
318         @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
319     else
320         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
321     endif
322
323 $(DIR)/$(DEBUG_DIR)%.o: %.cpp
324     ifdef NAN_DEPEND
325         @set -e; $(CCC) -M $(CPPFLAGS) $< 2>/dev/null \
326                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
327                 > $(DIR)/$(DEBUG_DIR)$*.d; \
328                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
329     endif
330     ifdef NAN_QUIET
331         @echo " -- $< -- "
332         @$(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
333     else
334         $(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
335     endif
336
337 $(DIR)/$(DEBUG_DIR)%.o: %.mm
338     ifdef NAN_DEPEND
339         @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
340                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
341                 > $(DIR)/$(DEBUG_DIR)$*.d; \
342                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
343     endif
344     ifdef NAN_QUIET
345         @echo " -- $< -- "
346         @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
347     else
348         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
349     endif
350
351 $(DIR)/$(DEBUG_DIR)%.o: %.m
352     ifdef NAN_DEPEND
353         @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
354                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
355                 > $(DIR)/$(DEBUG_DIR)$*.d; \
356                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
357     endif
358     ifdef NAN_QUIET
359         @echo " -- $< -- "
360         @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
361     else
362         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
363     endif
364
365
366 $(DIR)/$(DEBUG_DIR)%.res: %.rc
367 ifeq ($(FREE_WINDOWS),true)
368         windres $< -O coff -o $@
369 else
370         $(SRCHOME)/tools/cygwin/cl_wrapper.pl - rc /fo$@ $<
371 endif
372
373 $(DIR)/$(DEBUG_DIR)%.class: %.java
374     ifdef JARS
375         $(JAVAC) -verbose -g -deprecation -sourcepath . -classpath "$(JARS)" -d $(DIR)/$(DEBUG_DIR) $<
376     else
377         $(JAVAC) -verbose -g -deprecation -d $(DIR)/$(DEBUG_DIR) $<
378     endif
379
380 $(DIR)/$(DEBUG_DIR)%.h: $(DIR)/$(DEBUG_DIR)%.class
381         $(JAVAH) -classpath $(DIR)/$(DEBUG_DIR) -d $(DIR)/$(DEBUG_DIR) -jni $*
382
383 %.h:
384         @echo "WARNING: Fake header creation rule used, dependencies will be remade"
385
386 CSRCS  ?= $(wildcard *.c)
387 CCSRCS ?= $(wildcard *.cpp)
388 JSRCS  ?= $(wildcard *.java)
389
390 ifdef NAN_DEPEND
391 -include $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.d) $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.d) $(OCCSRCS:$.mm=$(DIR)/$(DEBUG_DIR)%.d) $(OCSRCS:$.m=$(DIR)/$(DEBUG_DIR)%.d)
392 endif
393
394 OBJS_AR := $(OBJS)
395 OBJS_AR += $(CSRCS:%.c=%.o)
396 OBJS_AR += $(CCSRCS:%.cpp=%.o)
397 OBJS_AR += $(OCCSRCS:%.mm=%.o)
398 OBJS_AR += $(OCSRCS:%.m=%.o)
399 OBJS_AR += $(WINRC:%.rc=%.res)
400
401 OBJS += $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.o)
402 OBJS += $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.o)
403 OBJS += $(OCCSRCS:%.mm=$(DIR)/$(DEBUG_DIR)%.o)
404 OBJS += $(OCSRCS:%.m=$(DIR)/$(DEBUG_DIR)%.o)
405 OBJS += $(WINRC:%.rc=$(DIR)/$(DEBUG_DIR)%.res)
406
407 JCLASS += $(JSRCS:%.java=$(DIR)/$(DEBUG_DIR)%.class)
408
409 LIB_a = $(DIR)/$(DEBUG_DIR)lib$(LIBNAME).a
410
411 $(LIB_a): $(OBJS)
412    # $OBJS can be empty except for some spaces
413     ifneq (x, x$(strip $(OBJS)))
414       ifdef NAN_PARANOID
415         @$(RM) $(LIB_a)
416         ifdef NAN_QUIET
417         @echo " -- lib: lib$(LIBNAME).a -- "
418         @cd $(DIR)/$(DEBUG_DIR); $(AR) $(ARFLAGSQUIET) $@ $(OBJS_AR)
419         else
420         cd $(DIR)/$(DEBUG_DIR); $(AR) $(ARFLAGS) $@ $(OBJS_AR)
421         endif
422       else
423         ifdef NAN_QUIET
424         @echo " -- lib: lib$(LIBNAME).a -- "
425         @$(AR) $(ARFLAGSQUIET) $@ $?
426         else
427         $(AR) $(ARFLAGS) $@ $?
428         endif
429       endif
430       ifdef RANLIB
431         $(RANLIB) $@
432       endif
433     endif
434
435 ALLTARGETS ?= $(LIB_a)
436
437 all debug :: makedir $(ALLTARGETS)
438
439 lib: $(LIB_a)
440
441 creator: $(OBJS)
442         @echo "====> make creator subtarget in `pwd | sed 's/^.*develop\///'`"
443         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)cre
444         @$(MAKE) lib CSRCS="$(CRE_CSRCS)" LIBNAME=$(LIBNAME)$@
445
446 publisher: $(OBJS)
447         @echo "====> make publisher subtarget in `pwd | sed 's/^.*develop\///'`"
448         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)pub
449         @$(MAKE) lib CSRCS="$(PUB_CSRCS)" LIBNAME=$(LIBNAME)$@
450
451 player: $(OBJS)
452         @echo "====> make player subtarget in `pwd | sed 's/^.*develop\///'`"
453         @$(MAKE) makedir DIR=$(DIR)/player/$(DEBUG_DIR)
454         @$(MAKE) lib CSRCS="$(SAP_CSRCS)" LIBNAME=$(LIBNAME)$@
455
456 clean:: optclean debugclean
457
458 optclean::
459         @-[ ! -d $(DIR) ] || ( cd $(DIR) && \
460             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
461
462 debugclean::
463         @-[ ! -d $(DIR)/debug ] || ( cd $(DIR)/debug && \
464             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
465
466 .PHONY: makedir
467 makedir::
468         @# don't use mkdir -p. Cygwin will try to make network paths and fail
469         @[ -d $(DIR) ] || mkdir $(DIR)
470         @[ -d $(DIR)/debug ] || mkdir $(DIR)/debug
471