This is a fun one ;)
[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 line to enable integrated game engine
41 #CFLAGS += -DGAMEBLENDER=1
42
43 ifdef NAN_DEBUG
44     CFLAGS += $(NAN_DEBUG)
45     CCFLAGS += $(NAN_DEBUG)
46 endif
47
48 REL_CFLAGS      += -DNDEBUG
49 REL_CCFLAGS     += -DNDEBUG
50 DBG_CFLAGS      += -g
51 DBG_CCFLAGS     += -g
52
53 # OS dependent parts ---------------------------------------------------
54
55 ifeq ($(OS),beos)
56     CC  = gcc
57     CCC = g++
58     CFLAGS      += -pipe -fPIC
59     CFLAGS      += -pipe -fPIC
60     REL_CFLAGS  += -O2
61     REL_CCFLAGS += -O2
62     NAN_DEPEND  = true
63     OPENGL_HEADERS  = .
64     CPPFLAGS    += -D__BeOS
65     AR  = ar
66     ARFLAGS = ruv
67     ARFLAGSQUIET = ru
68 endif
69
70 ifeq ($(OS),darwin)
71     CC  = gcc
72     CCC = g++
73     CFLAGS      += -pipe -fPIC
74     CCFLAGS     += -pipe -fPIC
75     REL_CFLAGS  += -O
76     REL_CCFLAGS += -O
77     CPPFLAGS    += -D_THREAD_SAFE
78     NAN_DEPEND  = true
79     OPENGL_HEADERS = /System/Library/Frameworks/OpenGL.framework
80     AR = ar
81     ARFLAGS = ruv
82     RANLIB = ranlib
83     ARFLAGSQUIET = ru
84 endif
85
86 ifeq ($(OS),freebsd)
87     CC  = gcc
88     CCC = g++
89     JAVAC = javac
90     JAVAH = javah
91     CFLAGS      += -pipe -fPIC
92     CCFLAGS     += -pipe -fPIC
93     REL_CFLAGS  += -O2
94     REL_CCFLAGS += -O2
95     CPPFLAGS    += -D_THREAD_SAFE
96     NAN_DEPEND  = true
97     OPENGL_HEADERS  = /usr/X11R6/include
98     JAVA_HEADERS = /usr/local/jdk1.3.1/include
99     JAVA_SYSTEM_HEADERS = /usr/local/jdk1.3.1/include/freebsd
100     AR  = ar
101     ARFLAGS = ruv
102     ARFLAGSQUIET = ru
103 endif
104
105 ifeq ($(OS),irix)
106     CC  = cc
107     CCC = CC
108     CFLAGS      += -n32 -mips3 -Xcpluscomm
109     CCFLAGS     += -n32 -mips3 -Xcpluscomm -LANG:std
110     REL_CFLAGS  += -O2 -OPT:Olimit=0
111     REL_CCFLAGS += -O2 -OPT:Olimit=0
112     OPENGL_HEADERS = /usr/include
113     NAN_DEPEND = true
114     AR = CC
115     ARFLAGS = -ar -o
116         ARFLAGSQUIET = -ar -o
117 endif
118
119 ifeq ($(OS),linux)
120     CC  = gcc
121     CCC = g++
122 #    CFLAGS     += -pipe
123     CFLAGS      += -pipe -fPIC
124     CCFLAGS     += -pipe -fPIC
125 #    CCFLAGS    += -pipe
126     REL_CFLAGS  += -O2
127     REL_CCFLAGS += -O2
128     NAN_DEPEND = true
129   ifeq ($(CPU),alpha)
130     CFLAGS += -mieee
131   endif
132     OPENGL_HEADERS = /usr/X11R6/include
133     AR = ar
134     ARFLAGS = ruv
135     ARFLAGSQUIET = ru
136 endif
137
138 ifeq ($(OS),openbsd)
139     CC  = gcc
140     CCC = g++
141     CFLAGS      += -pipe -fPIC
142     CCFLAGS     += -pipe -fPIC
143     REL_CFLAGS  += -O2
144     REL_CCFLAGS += -O2
145     NAN_DEPEND = true
146     CPPFLAGS += -D__FreeBSD__
147     OPENGL_HEADERS = /usr/X11R6/include
148     AR = ar
149     ARFLAGS = ruv
150     ARFLAGSQUIET = ru
151 endif
152
153 ifeq ($(OS),solaris)
154     CC  = gcc
155     CCC = g++
156     JAVAC = javac
157     JAVAH = javah
158     CFLAGS      += -pipe -fPIC
159     CCFLAGS     += -pipe -fPIC
160     REL_CFLAGS  += -O2
161     REL_CCFLAGS += -O2
162     NAN_DEPEND = true
163   ifeq ($(CPU),sparc)
164     OPENGL_HEADERS = /usr/openwin/share/include
165     CPPFLAGS += -DSUN_OGL_NO_VERTEX_MACROS
166     JAVA_HEADERS = /usr/java/include
167     JAVA_SYSTEM_HEADERS = /usr/java/include/solaris
168   else
169     OPENGL_HEADERS = /usr/local/include
170   endif
171     AR = ar
172     ARFLAGS = ruv
173     ARFLAGSQUIET = ru
174 endif
175
176 ifeq ($(OS),windows)
177   ifeq ($(FREE_WINDOWS),true)
178     CC  = gcc
179     CCC = g++
180     CFLAGS += -pipe -mno-cygwin -mwindows
181     CCFLAGS += -pipe -mno-cygwin -mwindows
182     CPPFLAGS += -DFREE_WINDOWS
183     REL_CFLAGS += -O2
184     REL_CCFLAGS += -O2
185     #NAN_DEPEND = true
186     #OPENGL_HEADERS = /usr/include/w32api
187     OPENGL_HEADERS = ./
188     AR = ar
189     ARFLAGS = ruv
190     ARFLAGSQUIET = ru
191     WINRC = $(wildcard *.rc)    
192     RANLIB = ranlib
193   else
194     CC  = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
195     CCC = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
196     JAVAC = $(SRCHOME)/tools/cygwin/java_wrapper.pl -c
197     JAVAH = $(SRCHOME)/tools/cygwin/java_wrapper.pl -h
198     REL_CFLAGS  += /O2
199     REL_CCFLAGS += /O2 -GX
200     DBG_CFLAGS  += /Fd$(DIR)/debug/
201     DBG_CCFLAGS += /Fd$(DIR)/debug/
202     CFLAGS += /MT
203     CCFLAGS += /MT
204     NAN_DEPEND = true
205     OPENGL_HEADERS = .
206     CPPFLAGS += -DWIN32 -D_WIN32 -D__WIN32
207     CPPFLAGS += -D_M_IX86
208     CPPFLAGS += -I"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/include"
209     JAVA_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include
210     JAVA_SYSTEM_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include/win32
211     CPP = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
212     AR = ar
213     ARFLAGS = ruv
214     ARFLAGSQUIET = ru
215     WINRC = $(wildcard *.rc)
216   endif
217 endif
218
219 ifeq (debug, $(findstring debug, $(MAKECMDGOALS)))
220     export DEBUG_DIR=debug/
221 endif
222
223 ifneq (x$(DEBUG_DIR), x)
224     CFLAGS +=$(DBG_CFLAGS)
225     CCFLAGS+=$(DBG_CCFLAGS)
226 else
227     CFLAGS +=$(REL_CFLAGS)
228     CCFLAGS+=$(REL_CCFLAGS)
229 endif
230
231 # Note: include nan_warn's LEVEL_*_WARNINGS after CC/OS have been set.
232 include nan_warn.mk
233
234 # compile rules
235
236 default: all
237
238 $(DIR)/$(DEBUG_DIR)%.o: %.c
239     ifdef NAN_DEPEND
240         @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
241                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
242                 > $(DIR)/$(DEBUG_DIR)$*.d; \
243                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
244     endif
245     ifdef NAN_QUIET
246         @echo " -- $< -- "
247         @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
248     else
249         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
250     endif
251
252 $(DIR)/$(DEBUG_DIR)%.o: %.cpp
253     ifdef NAN_DEPEND
254         @set -e; $(CCC) -M $(CPPFLAGS) $< 2>/dev/null \
255                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
256                 > $(DIR)/$(DEBUG_DIR)$*.d; \
257                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
258     endif
259     ifdef NAN_QUIET
260         @echo " -- $< -- "
261         @$(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
262     else
263         $(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
264     endif
265
266 $(DIR)/$(DEBUG_DIR)%.res: %.rc
267 ifeq ($(FREE_WINDOWS),true)
268         windres $< -O coff -o $@
269 else
270         $(SRCHOME)/tools/cygwin/cl_wrapper.pl - rc /fo$@ $<
271 endif
272
273 $(DIR)/$(DEBUG_DIR)%.class: %.java
274     ifdef JARS
275         $(JAVAC) -verbose -g -deprecation -sourcepath . -classpath "$(JARS)" -d $(DIR)/$(DEBUG_DIR) $<
276     else
277         $(JAVAC) -verbose -g -deprecation -d $(DIR)/$(DEBUG_DIR) $<
278     endif
279
280 $(DIR)/$(DEBUG_DIR)%.h: $(DIR)/$(DEBUG_DIR)%.class
281         $(JAVAH) -classpath $(DIR)/$(DEBUG_DIR) -d $(DIR)/$(DEBUG_DIR) -jni $*
282
283 %.h:
284         @echo "WARNING: Fake header creation rule used, dependencies will be remade"
285
286 CSRCS  ?= $(wildcard *.c)
287 CCSRCS ?= $(wildcard *.cpp)
288 JSRCS  ?= $(wildcard *.java)
289
290 ifdef NAN_DEPEND
291 -include $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.d) $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.d)
292 endif
293
294 OBJS += $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.o)
295 OBJS += $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.o)
296 OBJS += $(WINRC:%.rc=$(DIR)/$(DEBUG_DIR)%.res)
297
298 JCLASS += $(JSRCS:%.java=$(DIR)/$(DEBUG_DIR)%.class)
299
300 LIB_a = $(DIR)/$(DEBUG_DIR)lib$(LIBNAME).a
301
302 $(LIB_a): $(OBJS)
303    # $OBJS can be empty except for some spaces
304     ifneq (x, x$(strip $(OBJS)))
305       ifdef NAN_PARANOID
306         @$(RM) $(LIB_a)
307         ifdef NAN_QUIET
308         @echo " -- lib: lib$(LIBNAME).a -- "
309         @$(AR) $(ARFLAGSQUIET) $@ $(OBJS)
310         else
311         $(AR) $(ARFLAGS) $@ $(OBJS)
312         endif
313       else
314         ifdef NAN_QUIET
315         @echo " -- lib: lib$(LIBNAME).a -- "
316         @$(AR) $(ARFLAGSQUIET) $@ $?
317         else
318         $(AR) $(ARFLAGS) $@ $?
319         endif
320       endif
321       ifdef RANLIB
322         $(RANLIB) $@
323       endif
324     endif
325
326 ALLTARGETS ?= $(LIB_a)
327
328 all debug :: makedir $(ALLTARGETS)
329
330 lib: $(LIB_a)
331
332 creator: $(OBJS)
333         @echo "====> make creator subtarget in `pwd | sed 's/^.*develop\///'`"
334         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)cre
335         @$(MAKE) lib CSRCS="$(CRE_CSRCS)" LIBNAME=$(LIBNAME)$@
336
337 publisher: $(OBJS)
338         @echo "====> make publisher subtarget in `pwd | sed 's/^.*develop\///'`"
339         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)pub
340         @$(MAKE) lib CSRCS="$(PUB_CSRCS)" LIBNAME=$(LIBNAME)$@
341
342 player: $(OBJS)
343         @echo "====> make player subtarget in `pwd | sed 's/^.*develop\///'`"
344         @$(MAKE) makedir DIR=$(DIR)/player/$(DEBUG_DIR)
345         @$(MAKE) lib CSRCS="$(SAP_CSRCS)" LIBNAME=$(LIBNAME)$@
346
347 clean:: optclean debugclean
348
349 optclean::
350         @-[ ! -d $(DIR) ] || ( cd $(DIR) && \
351             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
352
353 debugclean::
354         @-[ ! -d $(DIR)/debug ] || ( cd $(DIR)/debug && \
355             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
356
357 .PHONY: makedir
358 makedir::
359         @# don't use mkdir -p. Cygwin will try to make network paths and fail
360         @[ -d $(DIR) ] || mkdir $(DIR)
361         @[ -d $(DIR)/debug ] || mkdir $(DIR)/debug
362