Support for building bf-blender under windows with gcc (huge thanks to
[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                 #CPPFLAGS += -I/usr/include/mingw
184                 REL_CFLAGS += -O2
185                 REL_CCFLAGS += -O2
186                 #NAN_DEPEND = true
187                 #OPENGL_HEADERS = /usr/include/w32api
188                 OPENGL_HEADERS = ./
189                 AR = ar
190                 ARFLAGS = ruv
191                 ARFLAGSQUIET = ru
192                 WINRC = $(wildcard *.rc)        
193                 RANLIB = ranlib
194         else
195             CC  = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
196                 CCC = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
197             JAVAC = $(SRCHOME)/tools/cygwin/java_wrapper.pl -c
198             JAVAH = $(SRCHOME)/tools/cygwin/java_wrapper.pl -h
199                 REL_CFLAGS      += /O2
200             REL_CCFLAGS += /O2 -GX
201                 DBG_CFLAGS      += /Fd$(DIR)/debug/
202                 DBG_CCFLAGS += /Fd$(DIR)/debug/
203                 CFLAGS += /MT
204                 CCFLAGS += /MT
205                 NAN_DEPEND = true
206                 OPENGL_HEADERS = .
207                 CPPFLAGS += -DWIN32 -D_WIN32 -D__WIN32
208                 CPPFLAGS += -D_M_IX86
209                 CPPFLAGS += -I"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/include"
210                 JAVA_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include
211                 JAVA_SYSTEM_HEADERS = /cygdrive/c/j2sdk1.4.0-beta3/include/win32
212                 CPP = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
213                 AR = ar
214                 ARFLAGS = ruv
215                 ARFLAGSQUIET = ru
216                 WINRC = $(wildcard *.rc)
217         endif
218 endif
219
220 ifeq (debug, $(findstring debug, $(MAKECMDGOALS)))
221     export DEBUG_DIR=debug/
222 endif
223
224 ifneq (x$(DEBUG_DIR), x)
225     CFLAGS +=$(DBG_CFLAGS)
226     CCFLAGS+=$(DBG_CCFLAGS)
227 else
228     CFLAGS +=$(REL_CFLAGS)
229     CCFLAGS+=$(REL_CCFLAGS)
230 endif
231
232 # Note: include nan_warn's LEVEL_*_WARNINGS after CC/OS have been set.
233 include nan_warn.mk
234
235 # compile rules
236
237 default: all
238
239 $(DIR)/$(DEBUG_DIR)%.o: %.c
240     ifdef NAN_DEPEND
241         @set -e; $(CC) -M $(CPPFLAGS) $< 2>/dev/null \
242                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
243                 > $(DIR)/$(DEBUG_DIR)$*.d; \
244                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
245     endif
246     ifdef NAN_QUIET
247         @echo " -- $< -- "
248         @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
249     else
250         $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
251     endif
252
253 $(DIR)/$(DEBUG_DIR)%.o: %.cpp
254     ifdef NAN_DEPEND
255         @set -e; $(CCC) -M $(CPPFLAGS) $< 2>/dev/null \
256                 | sed 's@\($*\)\.o[ :]*@$(DIR)/$(DEBUG_DIR)\1.o : @g' \
257                 > $(DIR)/$(DEBUG_DIR)$*.d; \
258                 [ -s $(DIR)/$(DEBUG_DIR)$*.d ] || $(RM) $(DIR)/$(DEBUG_DIR)$*.d
259     endif
260     ifdef NAN_QUIET
261         @echo " -- $< -- "
262         @$(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
263     else
264         $(CCC) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
265     endif
266
267 #$(DIR)/$(DEBUG_DIR)%.res: %.rc
268 #       $(SRCHOME)/tools/cygwin/cl_wrapper.pl - rc /fo$@ $<
269
270 $(DIR)/$(DEBUG_DIR)%.res: %.rc
271 ifeq ($(FREE_WINDOWS),true)
272         windres $< -O coff -o $@
273 else
274         $(SRCHOME)/tools/cygwin/cl_wrapper.pl - rc /fo$@ $<
275 endif
276
277 $(DIR)/$(DEBUG_DIR)%.class: %.java
278     ifdef JARS
279         $(JAVAC) -verbose -g -deprecation -sourcepath . -classpath "$(JARS)" -d $(DIR)/$(DEBUG_DIR) $<
280     else
281         $(JAVAC) -verbose -g -deprecation -d $(DIR)/$(DEBUG_DIR) $<
282     endif
283
284 $(DIR)/$(DEBUG_DIR)%.h: $(DIR)/$(DEBUG_DIR)%.class
285         $(JAVAH) -classpath $(DIR)/$(DEBUG_DIR) -d $(DIR)/$(DEBUG_DIR) -jni $*
286
287 %.h:
288         @echo "WARNING: Fake header creation rule used, dependencies will be remade"
289
290 CSRCS  ?= $(wildcard *.c)
291 CCSRCS ?= $(wildcard *.cpp)
292 JSRCS  ?= $(wildcard *.java)
293
294 ifdef NAN_DEPEND
295 -include $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.d) $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.d)
296 endif
297
298 OBJS += $(CSRCS:%.c=$(DIR)/$(DEBUG_DIR)%.o)
299 OBJS += $(CCSRCS:%.cpp=$(DIR)/$(DEBUG_DIR)%.o)
300 OBJS += $(WINRC:%.rc=$(DIR)/$(DEBUG_DIR)%.res)
301
302 JCLASS += $(JSRCS:%.java=$(DIR)/$(DEBUG_DIR)%.class)
303
304 LIB_a = $(DIR)/$(DEBUG_DIR)lib$(LIBNAME).a
305
306 $(LIB_a): $(OBJS)
307    # $OBJS can be empty except for some spaces
308     ifneq (x, x$(strip $(OBJS)))
309       ifdef NAN_PARANOID
310         @$(RM) $(LIB_a)
311         ifdef NAN_QUIET
312         @echo " -- lib: lib$(LIBNAME).a -- "
313         @$(AR) $(ARFLAGSQUIET) $@ $(OBJS)
314         else
315         $(AR) $(ARFLAGS) $@ $(OBJS)
316         endif
317       else
318         ifdef NAN_QUIET
319         @echo " -- lib: lib$(LIBNAME).a -- "
320         @$(AR) $(ARFLAGSQUIET) $@ $?
321         else
322         $(AR) $(ARFLAGS) $@ $?
323         endif
324       endif
325       ifdef RANLIB
326         $(RANLIB) $@
327       endif
328     endif
329
330 ALLTARGETS ?= $(LIB_a)
331
332 all debug :: makedir $(ALLTARGETS)
333
334 lib: $(LIB_a)
335
336 creator: $(OBJS)
337         @echo "====> make creator subtarget in `pwd | sed 's/^.*develop\///'`"
338         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)cre
339         @$(MAKE) lib CSRCS="$(CRE_CSRCS)" LIBNAME=$(LIBNAME)$@
340
341 publisher: $(OBJS)
342         @echo "====> make publisher subtarget in `pwd | sed 's/^.*develop\///'`"
343         @$(MAKE) makedir DIR=$(DIR)/$(DEBUG_DIR)pub
344         @$(MAKE) lib CSRCS="$(PUB_CSRCS)" LIBNAME=$(LIBNAME)$@
345
346 player: $(OBJS)
347         @echo "====> make player subtarget in `pwd | sed 's/^.*develop\///'`"
348         @$(MAKE) makedir DIR=$(DIR)/player/$(DEBUG_DIR)
349         @$(MAKE) lib CSRCS="$(SAP_CSRCS)" LIBNAME=$(LIBNAME)$@
350
351 clean:: optclean debugclean
352
353 optclean::
354         @-[ ! -d $(DIR) ] || ( cd $(DIR) && \
355             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
356
357 debugclean::
358         @-[ ! -d $(DIR)/debug ] || ( cd $(DIR)/debug && \
359             $(RM) *.o *.a *.d *.res ii_files/*.ii *.class *.h )
360
361 .PHONY: makedir
362 makedir::
363         @# don't use mkdir -p. Cygwin will try to make network paths and fail
364         @[ -d $(DIR) ] || mkdir $(DIR)
365         @[ -d $(DIR)/debug ] || mkdir $(DIR)/debug
366