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