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