1#
2# iowolfsp Makefile
3#
4# GNU Make required
5#
6
7COMPILE_PLATFORM=$(shell uname | sed -e 's/_.*//' | tr '[:upper:]' '[:lower:]' | sed -e 's/\//_/g')
8COMPILE_ARCH=$(shell uname -m | sed -e 's/i.86/x86/' | sed -e 's/^arm.*/arm/')
9ARM_VER_CHECK=$(shell uname -m)
10
11ifeq ($(COMPILE_PLATFORM),sunos)
12  # Solaris uname and GNU uname differ
13  COMPILE_ARCH=$(shell uname -p | sed -e 's/i.86/x86/')
14endif
15
16ifndef BUILD_STANDALONE
17  BUILD_STANDALONE =
18endif
19ifndef BUILD_CLIENT
20  BUILD_CLIENT     =
21endif
22ifndef BUILD_SERVER
23  BUILD_SERVER     = 0
24endif
25ifndef BUILD_GAME_SO
26  BUILD_GAME_SO    =
27endif
28ifndef BUILD_GAME_QVM
29  BUILD_GAME_QVM   = 0
30endif
31ifndef BUILD_BASEGAME
32  BUILD_BASEGAME =
33endif
34ifndef BUILD_RENDERER_REND2
35  BUILD_RENDERER_REND2 =
36endif
37ifndef BUILD_ARCHIVE
38  BUILD_ARCHIVE = 0
39endif
40
41#############################################################################
42#
43# If you require a different configuration from the defaults below, create a
44# new file named "Makefile.local" in the same directory as this file and define
45# your parameters there. This allows you to change configuration without
46# causing problems with keeping up to date with the repository.
47#
48#############################################################################
49-include Makefile.local
50
51ifeq ($(COMPILE_PLATFORM),cygwin)
52  PLATFORM=mingw32
53endif
54
55ifndef PLATFORM
56PLATFORM=$(COMPILE_PLATFORM)
57endif
58export PLATFORM
59
60ifeq ($(PLATFORM),mingw32)
61  MINGW=1
62endif
63ifeq ($(PLATFORM),mingw64)
64  MINGW=1
65endif
66
67ifeq ($(COMPILE_ARCH),i386)
68  COMPILE_ARCH=x86
69endif
70ifeq ($(COMPILE_ARCH),i86pc)
71  COMPILE_ARCH=x86
72endif
73
74ifeq ($(COMPILE_ARCH),amd64)
75  COMPILE_ARCH=x86_64
76endif
77ifeq ($(COMPILE_ARCH),x64)
78  COMPILE_ARCH=x86_64
79endif
80
81ifeq ($(COMPILE_ARCH),powerpc)
82  COMPILE_ARCH=ppc
83endif
84ifeq ($(COMPILE_ARCH),powerpc64)
85  COMPILE_ARCH=ppc64
86endif
87
88ifeq ($(COMPILE_ARCH),axp)
89  COMPILE_ARCH=alpha
90endif
91
92ifeq ($(COMPILE_ARCH),sparc64)
93  COMPILE_ARCH=sparc
94endif
95
96ifndef ARCH
97ARCH=$(COMPILE_ARCH)
98endif
99export ARCH
100
101# For historical compatibility reasons on non-windows
102# platform output files use i386 instead of x86
103ifeq ($(ARCH),x86)
104  ifndef MINGW
105    FILE_ARCH=i386
106  endif
107endif
108
109ifndef FILE_ARCH
110FILE_ARCH=$(ARCH)
111endif
112export FILE_ARCH
113
114ifneq ($(PLATFORM),$(COMPILE_PLATFORM))
115  CROSS_COMPILING=1
116else
117  CROSS_COMPILING=0
118
119  ifneq ($(ARCH),$(COMPILE_ARCH))
120    CROSS_COMPILING=1
121  endif
122endif
123export CROSS_COMPILING
124
125ifndef VERSION
126VERSION=1.51c-SP
127endif
128
129ifndef CLIENTBIN
130 ifdef MINGW
131    CLIENTBIN=ioWolfSP
132  else
133    CLIENTBIN=iowolfsp
134  endif
135endif
136
137ifndef SERVERBIN
138  ifdef MINGW
139    SERVERBIN=ioWolfSPDED
140  else
141    SERVERBIN=iowolfspded
142  endif
143endif
144
145ifndef BASEGAME
146BASEGAME=main
147endif
148
149ifndef BASEGAME_CFLAGS
150BASEGAME_CFLAGS=
151endif
152
153ifndef COPYDIR
154COPYDIR="/usr/local/games/wolf"
155endif
156
157ifndef COPYBINDIR
158COPYBINDIR=$(COPYDIR)
159endif
160
161ifndef MOUNT_DIR
162MOUNT_DIR=code
163endif
164
165ifndef BUILD_DIR
166BUILD_DIR=build
167endif
168
169ifndef TEMPDIR
170TEMPDIR=/tmp
171endif
172
173ifndef GENERATE_DEPENDENCIES
174GENERATE_DEPENDENCIES=1
175endif
176
177ifndef USE_OPENAL
178USE_OPENAL=1
179endif
180
181ifndef USE_OPENAL_DLOPEN
182USE_OPENAL_DLOPEN=1
183endif
184
185ifndef USE_CURL
186USE_CURL=0
187endif
188
189ifndef USE_CURL_DLOPEN
190  ifdef MINGW
191    USE_CURL_DLOPEN=0
192  else
193    USE_CURL_DLOPEN=1
194  endif
195endif
196
197ifndef USE_CODEC_VORBIS
198USE_CODEC_VORBIS=0
199endif
200
201ifndef USE_CODEC_OPUS
202USE_CODEC_OPUS=1
203endif
204
205ifndef USE_MUMBLE
206USE_MUMBLE=1
207endif
208
209ifndef USE_VOIP
210USE_VOIP=1
211endif
212
213ifndef USE_FREETYPE
214USE_FREETYPE=1
215endif
216
217ifndef USE_INTERNAL_LIBS
218USE_INTERNAL_LIBS=1
219endif
220
221ifndef USE_INTERNAL_OGG
222USE_INTERNAL_OGG=$(USE_INTERNAL_LIBS)
223endif
224
225ifndef USE_INTERNAL_VORBIS
226USE_INTERNAL_VORBIS=$(USE_INTERNAL_LIBS)
227endif
228
229ifndef USE_INTERNAL_OPUS
230USE_INTERNAL_OPUS=$(USE_INTERNAL_LIBS)
231endif
232
233ifndef USE_INTERNAL_ZLIB
234USE_INTERNAL_ZLIB=$(USE_INTERNAL_LIBS)
235endif
236
237ifndef USE_INTERNAL_JPEG
238USE_INTERNAL_JPEG=$(USE_INTERNAL_LIBS)
239endif
240
241ifndef USE_INTERNAL_FREETYPE
242USE_INTERNAL_FREETYPE=$(USE_INTERNAL_LIBS)
243endif
244
245ifndef USE_LOCAL_HEADERS
246USE_LOCAL_HEADERS=$(USE_INTERNAL_LIBS)
247endif
248
249ifndef USE_RENDERER_DLOPEN
250USE_RENDERER_DLOPEN=1
251endif
252
253ifndef USE_XDG
254USE_XDG=0
255endif
256
257ifndef USE_YACC
258USE_YACC=0
259endif
260
261ifndef DEBUG_CFLAGS
262DEBUG_CFLAGS=-g -O0
263endif
264
265ifndef USE_BLOOM
266USE_BLOOM=1
267endif
268
269ifndef USE_OPENGLES
270USE_OPENGLES=0
271endif
272
273ifndef USE_AUTHORIZE_SERVER
274USE_AUTHORIZE_SERVER=0
275endif
276
277
278#############################################################################
279
280BD=$(BUILD_DIR)/debug-$(PLATFORM)-$(ARCH)
281BR=$(BUILD_DIR)/release-$(PLATFORM)-$(ARCH)
282CDIR=$(MOUNT_DIR)/client
283SDIR=$(MOUNT_DIR)/server
284RDIR=$(MOUNT_DIR)/renderer
285R2DIR=$(MOUNT_DIR)/rend2
286CMDIR=$(MOUNT_DIR)/qcommon
287SDLDIR=$(MOUNT_DIR)/sdl
288ASMDIR=$(MOUNT_DIR)/asm
289SYSDIR=$(MOUNT_DIR)/sys
290GDIR=$(MOUNT_DIR)/game
291CGDIR=$(MOUNT_DIR)/cgame
292BLIBDIR=$(MOUNT_DIR)/botlib
293NDIR=$(MOUNT_DIR)/null
294UIDIR=$(MOUNT_DIR)/ui
295JPDIR=$(MOUNT_DIR)/jpeg-8c
296OGGDIR=$(MOUNT_DIR)/libogg-1.3.3
297VORBISDIR=$(MOUNT_DIR)/libvorbis-1.3.6
298OPUSDIR=$(MOUNT_DIR)/opus-1.2.1
299OPUSFILEDIR=$(MOUNT_DIR)/opusfile-0.9
300ZDIR=$(MOUNT_DIR)/zlib-1.2.11
301FTDIR=$(MOUNT_DIR)/freetype-2.9
302SPLDIR=$(MOUNT_DIR)/splines
303Q3ASMDIR=$(MOUNT_DIR)/tools/asm
304LBURGDIR=$(MOUNT_DIR)/tools/lcc/lburg
305Q3CPPDIR=$(MOUNT_DIR)/tools/lcc/cpp
306Q3LCCETCDIR=$(MOUNT_DIR)/tools/lcc/etc
307Q3LCCSRCDIR=$(MOUNT_DIR)/tools/lcc/src
308SDLHDIR=$(MOUNT_DIR)/SDL2
309LIBSDIR=$(MOUNT_DIR)/libs
310
311bin_path=$(shell which $(1) 2> /dev/null)
312
313# We won't need this if we only build the server
314ifneq ($(BUILD_CLIENT),0)
315  # set PKG_CONFIG_PATH or PKG_CONFIG to influence this, e.g.
316  # PKG_CONFIG_PATH=/opt/cross/i386-mingw32msvc/lib/pkgconfig or
317  # PKG_CONFIG=arm-linux-gnueabihf-$(PKG_CONFIG)
318  ifeq ($(CROSS_COMPILING),0)
319    PKG_CONFIG ?= pkg-config
320  else
321  ifneq ($(PKG_CONFIG_PATH),)
322    PKG_CONFIG ?= pkg-config
323  else
324    # Don't use host pkg-config when cross-compiling.
325    # (unknown-pkg-config is meant to be a non-existant command.)
326    PKG_CONFIG ?= unknown-pkg-config
327  endif
328  endif
329
330  ifneq ($(call bin_path, $(PKG_CONFIG)),)
331    CURL_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags libcurl)
332    CURL_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs libcurl)
333    OPENAL_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags openal)
334    OPENAL_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs openal)
335    SDL_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags sdl2|sed 's/-Dmain=SDL_main//')
336    SDL_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs sdl2)
337  else
338    # assume they're in the system default paths (no -I or -L needed)
339    CURL_LIBS ?= -lcurl
340    OPENAL_LIBS ?= -lopenal
341  endif
342  # Use sdl2-config if all else fails
343  ifeq ($(SDL_CFLAGS),)
344    ifneq ($(call bin_path, sdl2-config),)
345      SDL_CFLAGS = $(shell sdl2-config --cflags)
346      SDL_LIBS = $(shell sdl2-config --libs)
347    endif
348  endif
349endif
350
351#############################################################################
352# SETUP AND BUILD -- LINUX
353#############################################################################
354
355## Defaults
356INSTALL=install
357MKDIR=mkdir -p
358EXTRA_FILES=
359CLIENT_EXTRA_FILES=
360
361ifneq (,$(findstring "$(COMPILE_PLATFORM)", "linux" "gnu_kfreebsd" "kfreebsd-gnu" "gnu"))
362  TOOLS_CFLAGS += -DARCH_STRING=\"$(COMPILE_ARCH)\"
363endif
364
365ifneq (,$(findstring "$(PLATFORM)", "linux" "gnu_kfreebsd" "kfreebsd-gnu" "gnu"))
366
367  BASE_CFLAGS = -Wall -fno-strict-aliasing \
368    -pipe -DUSE_ICON -DARCH_STRING=\\\"$(FILE_ARCH)\\\"
369  CLIENT_CFLAGS += $(SDL_CFLAGS)
370
371  OPTIMIZEVM = -O3
372  OPTIMIZE = $(OPTIMIZEVM) -ffast-math
373
374  ifeq ($(ARCH),x86_64)
375    OPTIMIZEVM = -O3
376    OPTIMIZE = $(OPTIMIZEVM) -ffast-math
377  endif
378  ifeq ($(ARCH),x86)
379    OPTIMIZEVM = -O3 -march=i586
380    OPTIMIZE = $(OPTIMIZEVM) -ffast-math
381  endif
382  ifeq ($(ARCH),ppc)
383    ALTIVEC_CFLAGS = -maltivec
384  endif
385  ifeq ($(ARCH),ppc64)
386    ALTIVEC_CFLAGS = -maltivec
387  endif
388  ifeq ($(ARCH),sparc)
389    OPTIMIZE += -mtune=ultrasparc3 -mv8plus
390    OPTIMIZEVM += -mtune=ultrasparc3 -mv8plus
391  endif
392  ifeq ($(ARCH),sparc64)
393    OPTIMIZE += -mtune=ultrasparc3 -mv8plus
394    OPTIMIZEVM += -mtune=ultrasparc3 -mv8plus
395  endif
396  ifeq ($(ARCH),alpha)
397    # According to http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=410555
398    # -ffast-math will cause the client to die with SIGFPE on Alpha
399    OPTIMIZE = $(OPTIMIZEVM)
400  endif
401
402  SHLIBEXT=so
403  SHLIBCFLAGS=-fPIC -fvisibility=hidden
404  SHLIBLDFLAGS=-shared $(LDFLAGS)
405
406  THREAD_LIBS=-lpthread
407  LIBS=-ldl -lm
408
409  ifeq ($(USE_LOCAL_HEADERS),1)
410    CLIENT_CFLAGS += -I$(SDLHDIR)/include
411  endif
412
413  ifeq ($(USE_INTERNAL_LIBS),1)
414    ifeq ($(CROSS_COMPILING),1)
415      ifeq ($(ARCH),x86)
416      SDL_LIBS = $(LIBSDIR)/linux32/libSDL2main.a \
417                 $(LIBSDIR)/linux32/libSDL2-2.0.so.0.9.0
418      endif
419      ifeq ($(ARCH),x86_64)
420      SDL_LIBS = $(LIBSDIR)/linux64/libSDL2main.a \
421                 $(LIBSDIR)/linux64/libSDL2-2.0.so.0.9.0
422      endif
423    endif
424  endif
425
426  ifeq ($(USE_OPENGLES),1)
427    BUILD_RENDERER_REND2 = 0
428    BASE_CFLAGS += -DUSE_OPENGLES
429    CLIENT_LIBS = $(SDL_LIBS)
430    RENDERER_LIBS = $(SDL_LIBS)
431    SERVER_LIBS =
432  else
433    CLIENT_CFLAGS += $(SDL_CFLAGS)
434    CLIENT_LIBS += $(SDL_LIBS)
435    RENDERER_LIBS += $(SDL_LIBS)
436    SERVER_LIBS =
437  endif
438
439  ifeq ($(USE_OPENAL),1)
440    ifneq ($(USE_OPENAL_DLOPEN),1)
441      CLIENT_LIBS += $(THREAD_LIBS) $(OPENAL_LIBS)
442    endif
443  endif
444
445  ifeq ($(USE_CURL),1)
446    CLIENT_CFLAGS += $(CURL_CFLAGS)
447    ifneq ($(USE_CURL_DLOPEN),1)
448      CLIENT_LIBS += $(CURL_LIBS)
449    endif
450  endif
451
452  ifeq ($(USE_MUMBLE),1)
453    CLIENT_LIBS += -lrt
454  endif
455
456else # ifeq Linux
457
458#############################################################################
459# SETUP AND BUILD -- MAC OS X
460#############################################################################
461
462ifeq ($(PLATFORM),darwin)
463  LIBS = -framework Cocoa
464  CLIENT_LIBS=
465  RENDERER_LIBS=
466  OPTIMIZEVM= -O3
467
468  BASE_CFLAGS = -Wall
469
470  ifeq ($(ARCH),ppc)
471    BASE_CFLAGS += -arch ppc -mmacosx-version-min=10.5 \
472      -DMAC_OS_X_VERSION_MIN_REQUIRED=1050 -DMAC_OS_X_VERSION_MAX_ALLOWED=1060
473    ALTIVEC_CFLAGS = -faltivec
474  endif
475  ifeq ($(ARCH),ppc64)
476    BASE_CFLAGS += -arch ppc64 -mmacosx-version-min=10.5 \
477      -DMAC_OS_X_VERSION_MIN_REQUIRED=1050 -DMAC_OS_X_VERSION_MAX_ALLOWED=1060
478    ALTIVEC_CFLAGS = -faltivec
479  endif
480  ifeq ($(ARCH),x86)
481    OPTIMIZEVM += -march=prescott -mfpmath=sse
482    # x86 vm will crash without -mstackrealign since MMX instructions will be
483    # used no matter what and they corrupt the frame pointer in VM calls
484    BASE_CFLAGS += -arch i386 -mstackrealign -mmacosx-version-min=10.6 \
485      -DMAC_OS_X_VERSION_MIN_REQUIRED=1060
486  endif
487  ifeq ($(ARCH),x86_64)
488    OPTIMIZEVM += -mfpmath=sse
489    BASE_CFLAGS += -arch x86_64 -mmacosx-version-min=10.6 \
490      -DMAC_OS_X_VERSION_MIN_REQUIRED=1060
491  endif
492
493  # When compiling on OSX for OSX, we're not cross compiling as far as the
494  # Makefile is concerned, as target architecture is specified as a compiler
495  # argument
496  ifeq ($(COMPILE_PLATFORM),darwin)
497    CROSS_COMPILING=0
498  endif
499
500  ifeq ($(CROSS_COMPILING),1)
501    ifeq ($(ARCH),ppc)
502      CC=powerpc-apple-darwin10-gcc
503      RANLIB=powerpc-apple-darwin10-ranlib
504    else
505      ifeq ($(ARCH),x86)
506        CC=i686-apple-darwin10-gcc
507        RANLIB=i686-apple-darwin10-ranlib
508      else
509        $(error Architecture $(ARCH) is not supported when cross compiling)
510      endif
511    endif
512  endif
513
514  BASE_CFLAGS += -fno-strict-aliasing -fno-common -pipe
515
516  ifeq ($(USE_OPENAL),1)
517    ifneq ($(USE_OPENAL_DLOPEN),1)
518      ifneq ($(USE_INTERNAL_LIBS),1)
519        CLIENT_CFLAGS += $(OPENAL_CFLAGS)
520        CLIENT_LIBS += $(THREAD_LIBS) $(OPENAL_LIBS)
521      else
522        CLIENT_LIBS += -framework OpenAL
523      endif
524    endif
525  endif
526
527  ifeq ($(USE_CURL),1)
528    CLIENT_CFLAGS += $(CURL_CFLAGS)
529    ifneq ($(USE_CURL_DLOPEN),1)
530      CLIENT_LIBS += $(CURL_LIBS)
531    endif
532  endif
533
534  BASE_CFLAGS += -D_THREAD_SAFE=1
535
536  ifeq ($(USE_LOCAL_HEADERS),1)
537    ifneq ($(findstring $(ARCH),ppc ppc64),)
538      CLIENT_CFLAGS += -I$(SDLHDIR)/include-2.0.1
539    else
540      CLIENT_CFLAGS += -I$(SDLHDIR)/include
541    endif
542  else
543    CLIENT_CFLAGS += $(SDL_CFLAGS)
544  endif
545
546  # We copy sdlmain before ranlib'ing it so that subversion doesn't think
547  #  the file has been modified by each build.
548  ifeq ($(USE_INTERNAL_LIBS),1)
549    LIBSDLMAIN=$(B)/libSDL2main.a
550    LIBSDLMAINSRC=$(LIBSDIR)/macosx/libSDL2main.a
551    CLIENT_LIBS += -framework IOKit $(LIBSDIR)/macosx/libSDL2-2.0.0.dylib
552    RENDERER_LIBS += -framework OpenGL $(LIBSDIR)/macosx/libSDL2-2.0.0.dylib
553  else
554    CLIENT_LIBS += -framework IOKit $(SDL_LIBS)
555    RENDERER_LIBS += -framework OpenGL $(SDL_LIBS)
556  endif
557
558  ifeq ($(USE_INTERNAL_LIBS),1)
559    CLIENT_EXTRA_FILES += $(LIBSDIR)/macosx/libSDL2-2.0.0.dylib $(LIBSDIR)/macosx/libopenal.dylib
560  endif
561
562  OPTIMIZE = $(OPTIMIZEVM) -ffast-math
563
564  SHLIBEXT=dylib
565  SHLIBCFLAGS=-fPIC -fno-common
566  SHLIBLDFLAGS=-dynamiclib $(LDFLAGS) -Wl,-U,_com_altivec
567
568  NOTSHLIBCFLAGS=-mdynamic-no-pic
569
570else # ifeq darwin
571
572
573#############################################################################
574# SETUP AND BUILD -- MINGW32
575#############################################################################
576
577ifdef MINGW
578
579  ifeq ($(CROSS_COMPILING),1)
580    # If CC is already set to something generic, we probably want to use
581    # something more specific
582    ifneq ($(findstring $(strip $(CC)),cc gcc),)
583      CC=
584    endif
585    ifneq ($(findstring $(strip $(CXX)),g++),)
586      CXX=
587    endif
588
589    # We need to figure out the correct gcc and windres
590    ifeq ($(ARCH),x86_64)
591      MINGW_PREFIXES=x86_64-w64-mingw32 amd64-mingw32msvc
592    endif
593    ifeq ($(ARCH),x86)
594      MINGW_PREFIXES=i686-w64-mingw32 i586-mingw32msvc i686-pc-mingw32
595    endif
596
597    ifndef CC
598      CC=$(firstword $(strip $(foreach MINGW_PREFIX, $(MINGW_PREFIXES), \
599         $(call bin_path, $(MINGW_PREFIX)-gcc))))
600    endif
601
602    ifndef CXX
603      CXX=$(firstword $(strip $(foreach MINGW_PREFIX, $(MINGW_PREFIXES), \
604         $(call bin_path, $(MINGW_PREFIX)-g++))))
605    endif
606
607    ifndef WINDRES
608      WINDRES=$(firstword $(strip $(foreach MINGW_PREFIX, $(MINGW_PREFIXES), \
609         $(call bin_path, $(MINGW_PREFIX)-windres))))
610    endif
611  else
612    # Some MinGW installations define CC to cc, but don't actually provide cc,
613    # so check that CC points to a real binary and use gcc if it doesn't
614    ifeq ($(call bin_path, $(CC)),)
615      CC=gcc
616    endif
617
618    ifndef CXX
619      CXX=g++
620    endif
621
622  endif
623
624  # using generic windres if specific one is not present
625  ifndef WINDRES
626    WINDRES=windres
627   endif
628
629  ifeq ($(CC),)
630    $(error Cannot find a suitable cross compiler for $(PLATFORM))
631  endif
632
633  BASE_CFLAGS = -Wall -fno-strict-aliasing \
634    -DUSE_ICON
635
636  # In the absence of wspiapi.h, require Windows XP or later
637  ifeq ($(shell test -e $(CMDIR)/wspiapi.h; echo $$?),1)
638    BASE_CFLAGS += -DWINVER=0x501
639  endif
640
641  ifeq ($(USE_OPENAL),1)
642    CLIENT_CFLAGS += $(OPENAL_CFLAGS)
643    ifneq ($(USE_OPENAL_DLOPEN),1)
644      CLIENT_LDFLAGS += $(OPENAL_LDFLAGS)
645    endif
646  endif
647
648  ifeq ($(ARCH),x86_64)
649    OPTIMIZEVM = -O3
650    OPTIMIZE = $(OPTIMIZEVM) -ffast-math
651    FILE_ARCH=x64
652  endif
653  ifeq ($(ARCH),x86)
654    OPTIMIZEVM = -O3 -march=i586
655    OPTIMIZE = $(OPTIMIZEVM) -ffast-math
656  endif
657
658  SHLIBEXT=dll
659  SHLIBCFLAGS=
660  SHLIBLDFLAGS=-shared $(LDFLAGS)
661
662  BINEXT=.exe
663
664  ifeq ($(CROSS_COMPILING),0)
665    TOOLS_BINEXT=.exe
666  endif
667
668  ifeq ($(COMPILE_PLATFORM),cygwin)
669    TOOLS_BINEXT=.exe
670    TOOLS_CC=$(CC)
671  endif
672
673  LIBS= -lws2_32 -lwinmm -lpsapi
674  # clang 3.5 doesn't support this
675  ifneq ("$(CC)", $(findstring "$(CC)", "clang" "clang++"))
676    CLIENT_LDFLAGS += -mwindows -static -static-libgcc -static-libstdc++
677  endif
678  CLIENT_LIBS = -lgdi32 -lole32
679  RENDERER_LIBS = -lgdi32 -lole32
680
681  ifeq ($(USE_FREETYPE),1)
682    ifneq ($(USE_INTERNAL_FREETYPE),1)
683      FREETYPE_CFLAGS = -Ifreetype2
684    endif
685  endif
686
687  ifeq ($(USE_CURL),1)
688    CLIENT_CFLAGS += $(CURL_CFLAGS)
689    ifneq ($(USE_CURL_DLOPEN),1)
690      ifeq ($(USE_LOCAL_HEADERS),1)
691        CLIENT_CFLAGS += -DCURL_STATICLIB
692        ifeq ($(ARCH),x86_64)
693          CLIENT_LIBS += $(LIBSDIR)/win64/libcurl.a -lcrypt32
694        else
695          CLIENT_LIBS += $(LIBSDIR)/win32/libcurl.a -lcrypt32
696        endif
697      else
698        CLIENT_LIBS += $(CURL_LIBS)
699      endif
700    endif
701  endif
702
703  # libmingw32 must be linked before libSDLmain
704  CLIENT_LIBS += -lmingw32
705  RENDERER_LIBS += -lmingw32
706
707  ifeq ($(USE_LOCAL_HEADERS),1)
708    CLIENT_CFLAGS += -I$(SDLHDIR)/include
709  endif
710
711  ifeq ($(USE_INTERNAL_LIBS),1)
712    ifeq ($(ARCH),x86)
713    CLIENT_LIBS += $(LIBSDIR)/win32/libSDL2main.a \
714                   $(LIBSDIR)/win32/libSDL2.dll.a
715    RENDERER_LIBS += $(LIBSDIR)/win32/libSDL2main.a \
716                     $(LIBSDIR)/win32/libSDL2.dll.a
717    SDLDLL=SDL2.dll
718    CLIENT_EXTRA_FILES += $(LIBSDIR)/win32/SDL2.dll $(LIBSDIR)/win32/OpenAL32.dll
719    endif
720    ifeq ($(ARCH),x86_64)
721    CLIENT_LIBS += $(LIBSDIR)/win64/libSDL264main.a \
722                   $(LIBSDIR)/win64/libSDL264.dll.a
723    RENDERER_LIBS += $(LIBSDIR)/win64/libSDL264main.a \
724                     $(LIBSDIR)/win64/libSDL264.dll.a
725    SDLDLL=SDL264.dll
726    CLIENT_EXTRA_FILES += $(LIBSDIR)/win64/SDL264.dll $(LIBSDIR)/win64/OpenAL64.dll
727    endif
728  else
729    CLIENT_CFLAGS += $(SDL_CFLAGS)
730    CLIENT_LIBS += $(SDL_LIBS)
731    RENDERER_LIBS += $(SDL_LIBS)
732    SDLDLL=SDL2.dll
733  endif
734
735else # ifdef MINGW
736
737#############################################################################
738# SETUP AND BUILD -- *BSD (is dying)
739#############################################################################
740
741ifneq (,$(findstring "$(PLATFORM)", "freebsd" "openbsd" "netbsd" "dragonfly"))
742
743  BASE_CFLAGS = -Wall -fno-strict-aliasing \
744    -pipe -DUSE_ICON -DMAP_ANONYMOUS=MAP_ANON
745  CLIENT_CFLAGS += $(SDL_CFLAGS)
746
747  OPTIMIZEVM = -O3
748  OPTIMIZE = $(OPTIMIZEVM) -ffast-math
749
750  ifeq ($(ARCH),x86_64)
751    OPTIMIZEVM = -O3
752    OPTIMIZE = $(OPTIMIZEVM) -ffast-math
753    FILE_ARCH = amd64
754  endif
755  ifeq ($(ARCH),x86)
756    OPTIMIZEVM = -O3 -march=i586
757    OPTIMIZE = $(OPTIMIZEVM) -ffast-math
758  endif
759  ifeq ($(ARCH),ppc)
760    ALTIVEC_CFLAGS = -maltivec
761  endif
762  ifeq ($(ARCH),ppc64)
763    ALTIVEC_CFLAGS = -maltivec
764  endif
765  ifeq ($(ARCH),sparc)
766    OPTIMIZE += -mtune=ultrasparc3 -mv8plus
767    OPTIMIZEVM += -mtune=ultrasparc3 -mv8plus
768  endif
769  ifeq ($(ARCH),sparc64)
770    OPTIMIZE += -mtune=ultrasparc3 -mv8plus
771    OPTIMIZEVM += -mtune=ultrasparc3 -mv8plus
772  endif
773  ifeq ($(ARCH),alpha)
774    # According to http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=410555
775    # -ffast-math will cause the client to die with SIGFPE on Alpha
776    OPTIMIZE = $(OPTIMIZEVM)
777  endif
778
779  ifeq ($(USE_CURL),1)
780    CLIENT_CFLAGS += $(CURL_CFLAGS)
781    USE_CURL_DLOPEN=0
782  endif
783
784  SHLIBEXT=so
785  SHLIBCFLAGS=-fPIC
786  SHLIBLDFLAGS=-shared $(LDFLAGS)
787
788  THREAD_LIBS=-lpthread
789  LIBS=-lm
790
791  CLIENT_LIBS =
792
793  CLIENT_LIBS += $(SDL_LIBS)
794  RENDERER_LIBS = $(SDL_LIBS)
795
796  ifeq ($(USE_OPENAL),1)
797    ifneq ($(USE_OPENAL_DLOPEN),1)
798      CLIENT_LIBS += $(THREAD_LIBS) $(OPENAL_LIBS)
799    endif
800  endif
801
802  ifeq ($(USE_CURL),1)
803    ifneq ($(USE_CURL_DLOPEN),1)
804      CLIENT_LIBS += $(CURL_LIBS)
805    endif
806  endif
807else # ifeq *BSD
808
809#############################################################################
810# SETUP AND BUILD -- IRIX
811#############################################################################
812
813ifeq ($(PLATFORM),irix64)
814  LIB=lib
815
816  ARCH=mips
817
818  CC = c99
819
820  BASE_CFLAGS=-Dstricmp=strcasecmp -Xcpluscomm -woff 1185 \
821    -I. -I$(ROOT)/usr/include
822  CLIENT_CFLAGS += $(SDL_CFLAGS)
823  OPTIMIZE = -O3
824
825  SHLIBEXT=so
826  SHLIBCFLAGS=
827  SHLIBLDFLAGS=-shared
828
829  LIBS=-ldl -lm -lgen
830  # FIXME: The X libraries probably aren't necessary?
831  CLIENT_LIBS=-L/usr/X11/$(LIB) $(SDL_LIBS) \
832    -lX11 -lXext -lm
833  RENDERER_LIBS = $(SDL_LIBS)
834
835else # ifeq IRIX
836
837#############################################################################
838# SETUP AND BUILD -- SunOS
839#############################################################################
840
841ifeq ($(PLATFORM),sunos)
842
843  CC=gcc
844  INSTALL=ginstall
845  MKDIR=gmkdir -p
846  COPYDIR="/usr/local/share/games/wolf"
847
848  ifneq ($(ARCH),x86)
849    ifneq ($(ARCH),sparc)
850      $(error arch $(ARCH) is currently not supported)
851    endif
852  endif
853
854  BASE_CFLAGS = -Wall -fno-strict-aliasing \
855    -pipe -DUSE_ICON
856  CLIENT_CFLAGS += $(SDL_CFLAGS)
857
858  OPTIMIZEVM = -O3
859
860  ifeq ($(ARCH),sparc)
861    OPTIMIZEVM += -O3 -mtune=ultrasparc3 -mv8plus -mno-faster-structs
862  endif
863  ifeq ($(ARCH),x86)
864    OPTIMIZEVM += -march=i586
865    CLIENT_CFLAGS += -I/usr/X11/include/NVIDIA
866    CLIENT_LDFLAGS += -L/usr/X11/lib/NVIDIA -R/usr/X11/lib/NVIDIA
867  endif
868
869  OPTIMIZE = $(OPTIMIZEVM) -ffast-math
870
871  SHLIBEXT=so
872  SHLIBCFLAGS=-fPIC
873  SHLIBLDFLAGS=-shared $(LDFLAGS)
874
875  THREAD_LIBS=-lpthread
876  LIBS=-lsocket -lnsl -ldl -lm
877
878  BOTCFLAGS=-O0
879
880  CLIENT_LIBS +=$(SDL_LIBS) -lX11 -lXext -liconv -lm
881  RENDERER_LIBS = $(SDL_LIBS)
882
883else # ifeq sunos
884
885#############################################################################
886# SETUP AND BUILD -- GENERIC
887#############################################################################
888  BASE_CFLAGS =
889  OPTIMIZE = -O3
890
891  SHLIBEXT=so
892  SHLIBCFLAGS=-fPIC
893  SHLIBLDFLAGS=-shared
894
895endif #Linux
896endif #darwin
897endif #MINGW
898endif #*BSD
899endif #IRIX
900endif #SunOS
901
902ifndef CC
903  CC=gcc
904endif
905
906ifndef CXX
907  CXX=g++
908endif
909
910ifndef RANLIB
911  RANLIB=ranlib
912endif
913
914ifeq ($(ARCH),x86)
915  BASE_CFLAGS += -m32
916endif
917ifeq ($(ARCH),x86_64)
918  BASE_CFLAGS += -m64
919endif
920ifeq ($(ARCH),ppc)
921  BASE_CFLAGS += -m32
922endif
923ifeq ($(ARCH),ppc64)
924  BASE_CFLAGS += -m64
925endif
926ifeq ($(ARCH),sparc)
927  BASE_CFLAGS += -m32
928endif
929ifeq ($(ARCH),sparc64)
930  BASE_CFLAGS += -m64
931endif
932
933ifndef HAVE_VM_COMPILED
934  HAVE_VM_COMPILED=false
935endif
936
937ifneq ($(findstring $(ARCH),x86 x86_64 ppc ppc64 sparc sparc64),)
938  HAVE_VM_COMPILED=true
939endif
940
941ifeq ($(ARM_VER_CHECK),armv7l)
942  HAVE_VM_COMPILED=true
943endif
944
945ifneq ($(HAVE_VM_COMPILED),true)
946  BASE_CFLAGS += -DNO_VM_COMPILED
947  BUILD_GAME_QVM=0
948endif
949
950TARGETS =
951
952ifndef FULLBINEXT
953  ifndef MINGW
954    FULLBINEXT=.$(ARCH)$(BINEXT)
955  else
956    FULLBINEXT=.$(FILE_ARCH)$(BINEXT)
957  endif
958endif
959
960ifndef SHLIBNAME
961  SHLIBNAME=$(FILE_ARCH).$(SHLIBEXT)
962endif
963
964ifneq ($(BUILD_SERVER),0)
965  TARGETS += $(B)/$(SERVERBIN)$(FULLBINEXT)
966endif
967
968ifneq ($(BUILD_CLIENT),0)
969  ifneq ($(USE_RENDERER_DLOPEN),0)
970    TARGETS += $(B)/$(CLIENTBIN)$(FULLBINEXT) $(B)/renderer_sp_opengl1_$(SHLIBNAME)
971    ifneq ($(BUILD_RENDERER_REND2), 0)
972      TARGETS += $(B)/renderer_sp_rend2_$(SHLIBNAME)
973    endif
974  else
975    TARGETS += $(B)/$(CLIENTBIN)$(FULLBINEXT)
976    ifneq ($(BUILD_RENDERER_REND2), 0)
977      TARGETS += $(B)/$(CLIENTBIN)_rend2$(FULLBINEXT)
978    endif
979  endif
980endif
981
982ifneq ($(BUILD_GAME_SO),0)
983  ifneq ($(BUILD_BASEGAME),0)
984   ifdef MINGW
985    TARGETS += \
986	$(B)/$(BASEGAME)/cgame_sp_$(SHLIBNAME) \
987	$(B)/$(BASEGAME)/qagame_sp_$(SHLIBNAME) \
988	$(B)/$(BASEGAME)/ui_sp_$(SHLIBNAME)
989   else
990   TARGETS += \
991        $(B)/$(BASEGAME)/cgame.sp.$(SHLIBNAME) \
992        $(B)/$(BASEGAME)/qagame.sp.$(SHLIBNAME) \
993        $(B)/$(BASEGAME)/ui.sp.$(SHLIBNAME)
994   endif
995  endif
996endif
997
998ifneq ($(BUILD_GAME_QVM),0)
999  ifneq ($(BUILD_BASEGAME),0)
1000    TARGETS += \
1001    $(B)/$(BASEGAME)/vm/cgame.sp.qvm \
1002    $(B)/$(BASEGAME)/vm/qagame.sp.qvm \
1003    $(B)/$(BASEGAME)/vm/ui.sp.qvm
1004  endif
1005endif
1006
1007ifeq ($(USE_OPENAL),1)
1008  CLIENT_CFLAGS += -DUSE_OPENAL
1009  ifeq ($(USE_OPENAL_DLOPEN),1)
1010    CLIENT_CFLAGS += -DUSE_OPENAL_DLOPEN
1011  endif
1012endif
1013
1014ifeq ($(USE_CURL),1)
1015  CLIENT_CFLAGS += -DUSE_CURL
1016  ifeq ($(USE_CURL_DLOPEN),1)
1017    CLIENT_CFLAGS += -DUSE_CURL_DLOPEN
1018  endif
1019endif
1020
1021ifeq ($(USE_VOIP),1)
1022  CLIENT_CFLAGS += -DUSE_VOIP
1023  SERVER_CFLAGS += -DUSE_VOIP
1024  NEED_OPUS=1
1025endif
1026
1027ifeq ($(USE_CODEC_OPUS),1)
1028  CLIENT_CFLAGS += -DUSE_CODEC_OPUS
1029  NEED_OPUS=1
1030endif
1031
1032ifeq ($(NEED_OPUS),1)
1033  ifeq ($(USE_INTERNAL_OPUS),1)
1034      OPUS_CFLAGS = -DOPUS_BUILD -DHAVE_LRINTF -DFLOAT_APPROX -DUSE_ALLOCA \
1035      -I$(OPUSDIR)/include -I$(OPUSDIR)/celt -I$(OPUSDIR)/silk \
1036      -I$(OPUSDIR)/silk/float -I$(OPUSFILEDIR)/include
1037  else
1038    OPUS_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags opusfile opus || true)
1039    OPUS_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs opusfile opus || echo -lopusfile -lopus)
1040  endif
1041  CLIENT_CFLAGS += $(OPUS_CFLAGS)
1042  CLIENT_LIBS += $(OPUS_LIBS)
1043  NEED_OGG=1
1044endif
1045
1046ifeq ($(USE_CODEC_VORBIS),1)
1047  CLIENT_CFLAGS += -DUSE_CODEC_VORBIS
1048  ifeq ($(USE_INTERNAL_VORBIS),1)
1049    CLIENT_CFLAGS += -I$(VORBISDIR)/include -I$(VORBISDIR)/lib
1050  else
1051    VORBIS_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags vorbisfile vorbis || true)
1052    VORBIS_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs vorbisfile vorbis || echo -lvorbisfile -lvorbis)
1053  endif
1054  CLIENT_CFLAGS += $(VORBIS_CFLAGS)
1055  CLIENT_LIBS += $(VORBIS_LIBS)
1056  NEED_OGG=1
1057endif
1058
1059ifeq ($(NEED_OGG),1)
1060  ifeq ($(USE_INTERNAL_OGG),1)
1061    OGG_CFLAGS = -I$(OGGDIR)/include
1062  else
1063    OGG_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags ogg || true)
1064    OGG_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs ogg || echo -logg)
1065  endif
1066  CLIENT_CFLAGS += $(OGG_CFLAGS)
1067  CLIENT_LIBS += $(OGG_LIBS)
1068endif
1069
1070ifeq ($(USE_RENDERER_DLOPEN),1)
1071  CLIENT_CFLAGS += -DUSE_RENDERER_DLOPEN
1072endif
1073
1074ifeq ($(USE_XDG),1)
1075  CLIENT_CFLAGS += -DUSE_XDG
1076  SERVER_CFLAGS += -DUSE_XDG
1077endif
1078
1079ifeq ($(USE_MUMBLE),1)
1080  CLIENT_CFLAGS += -DUSE_MUMBLE
1081endif
1082
1083ifeq ($(USE_INTERNAL_ZLIB),1)
1084  ZLIB_CFLAGS = -DNO_GZIP -I$(ZDIR)
1085else
1086  ZLIB_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags zlib || true)
1087  ZLIB_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs zlib || echo -lz)
1088endif
1089BASE_CFLAGS += $(ZLIB_CFLAGS)
1090LIBS += $(ZLIB_LIBS)
1091
1092ifeq ($(USE_INTERNAL_JPEG),1)
1093  BASE_CFLAGS += -DUSE_INTERNAL_JPEG
1094  BASE_CFLAGS += -I$(JPDIR)
1095else
1096  # IJG libjpeg doesn't have $(PKG_CONFIG), but libjpeg-turbo uses libjpeg.pc;
1097  # we fall back to hard-coded answers if libjpeg.pc is unavailable
1098  JPEG_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags libjpeg || true)
1099  JPEG_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs libjpeg || echo -ljpeg)
1100  BASE_CFLAGS += $(JPEG_CFLAGS)
1101  RENDERER_LIBS += $(JPEG_LIBS)
1102endif
1103
1104ifeq ($(USE_FREETYPE),1)
1105  ifeq ($(USE_INTERNAL_FREETYPE),1)
1106    FREETYPE_CFLAGS += -I$(FTDIR)/include -DFT2_BUILD_LIBRARY
1107  else
1108    FREETYPE_CFLAGS ?= $(shell $(PKG_CONFIG) --silence-errors --cflags freetype2 || true)
1109    FREETYPE_LIBS ?= $(shell $(PKG_CONFIG) --silence-errors --libs freetype2 || echo -lfreetype)
1110  endif
1111  BASE_CFLAGS += -DBUILD_FREETYPE $(FREETYPE_CFLAGS)
1112  RENDERER_LIBS += $(FREETYPE_LIBS)
1113endif
1114
1115ifeq ("$(CC)", $(findstring "$(CC)", "clang" "clang++"))
1116  BASE_CFLAGS += -Qunused-arguments
1117endif
1118
1119ifeq ("$(CXX)", $(findstring "$(CXX)", "clang" "clang++"))
1120  BASE_CFLAGS += -Qunused-arguments
1121endif
1122
1123ifdef DEFAULT_BASEDIR
1124  BASE_CFLAGS += -DDEFAULT_BASEDIR=\\\"$(DEFAULT_BASEDIR)\\\"
1125endif
1126
1127ifeq ($(USE_LOCAL_HEADERS),1)
1128  BASE_CFLAGS += -DUSE_LOCAL_HEADERS
1129endif
1130
1131ifeq ($(BUILD_STANDALONE),1)
1132  BASE_CFLAGS += -DSTANDALONE
1133endif
1134
1135ifeq ($(USE_AUTHORIZE_SERVER),1)
1136  BASE_CFLAGS += -DUSE_AUTHORIZE_SERVER
1137endif
1138
1139ifeq ($(GENERATE_DEPENDENCIES),1)
1140  DEPEND_CFLAGS = -MMD
1141else
1142  DEPEND_CFLAGS =
1143endif
1144
1145ifeq ($(NO_STRIP),1)
1146  STRIP_FLAG =
1147else
1148  STRIP_FLAG = -s
1149endif
1150
1151ifeq ($(USE_BLOOM),1)
1152  CLIENT_CFLAGS += -DUSE_BLOOM
1153endif
1154
1155# https://reproducible-builds.org/specs/source-date-epoch/
1156ifdef SOURCE_DATE_EPOCH
1157  BASE_CFLAGS += -DPRODUCT_DATE=\\\"$(shell date --date="@$$SOURCE_DATE_EPOCH" "+%b %_d %Y" | sed -e 's/ /\\\ /'g)\\\"
1158endif
1159
1160BASE_CFLAGS += -DPRODUCT_VERSION=\\\"$(VERSION)\\\"
1161BASE_CFLAGS += -Wformat=2 -Wformat-security -Wno-format-nonliteral
1162BASE_CFLAGS += -Wstrict-aliasing=2 -Wmissing-format-attribute
1163BASE_CFLAGS += -Wdisabled-optimization
1164
1165ifeq ($(V),1)
1166echo_cmd=@:
1167Q=
1168else
1169echo_cmd=@echo
1170Q=@
1171endif
1172
1173define DO_CC
1174$(echo_cmd) "CC $<"
1175$(Q)$(CC) $(NOTSHLIBCFLAGS) $(CFLAGS) $(CLIENT_CFLAGS) $(OPTIMIZE) -o $@ -c $<
1176endef
1177
1178define DO_CC_ALTIVEC
1179$(echo_cmd) "CC $<"
1180$(Q)$(CC) $(NOTSHLIBCFLAGS) $(CFLAGS) $(CLIENT_CFLAGS) $(OPTIMIZE) $(ALTIVEC_CFLAGS) -o $@ -c $<
1181endef
1182
1183define DO_REF_CC
1184$(echo_cmd) "REF_CC $<"
1185$(Q)$(CC) $(SHLIBCFLAGS) $(CFLAGS) $(CLIENT_CFLAGS) $(OPTIMIZE) -o $@ -c $<
1186endef
1187
1188define DO_REF_CC_ALTIVEC
1189$(echo_cmd) "REF_CC $<"
1190$(Q)$(CC) $(SHLIBCFLAGS) $(CFLAGS) $(CLIENT_CFLAGS) $(OPTIMIZE) $(ALTIVEC_CFLAGS) -o $@ -c $<
1191endef
1192
1193define DO_REF_STR
1194$(echo_cmd) "REF_STR $<"
1195$(Q)rm -f $@
1196$(Q)echo "const char *fallbackShader_$(notdir $(basename $<)) =" >> $@
1197$(Q)cat $< | sed -e 's/^/\"/;s/$$/\\n\"/' | tr -d '\r' >> $@
1198$(Q)echo ";" >> $@
1199endef
1200
1201define DO_BOT_CC
1202$(echo_cmd) "BOT_CC $<"
1203$(Q)$(CC) $(NOTSHLIBCFLAGS) $(CFLAGS) $(BOTCFLAGS) $(OPTIMIZE) -DBOTLIB -o $@ -c $<
1204endef
1205
1206ifeq ($(GENERATE_DEPENDENCIES),1)
1207  DO_QVM_DEP=cat $(@:%.o=%.d) | sed -e 's/\.o/\.asm/g' >> $(@:%.o=%.d)
1208endif
1209
1210define DO_SHLIB_CC
1211$(echo_cmd) "SHLIB_CC $<"
1212$(Q)$(CC) $(BASEGAME_CFLAGS) $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
1213$(Q)$(DO_QVM_DEP)
1214endef
1215
1216define DO_GAME_CC
1217$(echo_cmd) "GAME_CC $<"
1218$(Q)$(CC) $(BASEGAME_CFLAGS) -DGAMEDLL -DQAGAME $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
1219$(Q)$(DO_QVM_DEP)
1220endef
1221
1222define DO_CGAME_CC
1223$(echo_cmd) "CGAME_CC $<"
1224$(Q)$(CC) $(BASEGAME_CFLAGS) -DCGAMEDLL -DCGAME $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
1225$(Q)$(DO_QVM_DEP)
1226endef
1227
1228define DO_UI_CC
1229$(echo_cmd) "UI_CC $<"
1230$(Q)$(CC) $(BASEGAME_CFLAGS) -DUI $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
1231$(Q)$(DO_QVM_DEP)
1232endef
1233
1234define DO_AS
1235$(echo_cmd) "AS $<"
1236$(Q)$(CC) $(CFLAGS) $(OPTIMIZE) -x assembler-with-cpp -o $@ -c $<
1237endef
1238
1239define DO_DED_CC
1240$(echo_cmd) "DED_CC $<"
1241$(Q)$(CC) $(NOTSHLIBCFLAGS) -DDEDICATED $(CFLAGS) $(SERVER_CFLAGS) $(OPTIMIZE) -o $@ -c $<
1242endef
1243
1244define DO_WINDRES
1245$(echo_cmd) "WINDRES $<"
1246$(Q)$(WINDRES) -i $< -o $@
1247endef
1248
1249define DO_SPLINE_CXX
1250$(echo_cmd) "SPLINE_CXX $<"
1251$(Q)$(CXX) $(NOTSHLIBCFLAGS) $(CFLAGS) $(CLIENT_CFLAGS) $(OPTIMIZE) -o $@ -c $<
1252endef
1253
1254#############################################################################
1255# MAIN TARGETS
1256#############################################################################
1257
1258default: release
1259all: debug release
1260
1261debug:
1262	@$(MAKE) targets B=$(BD) CFLAGS="$(CFLAGS) $(BASE_CFLAGS) $(DEPEND_CFLAGS)" \
1263	  OPTIMIZE="$(DEBUG_CFLAGS)" OPTIMIZEVM="$(DEBUG_CFLAGS)" \
1264	  CLIENT_CFLAGS="$(CLIENT_CFLAGS)" SERVER_CFLAGS="$(SERVER_CFLAGS)" V=$(V)
1265
1266release:
1267	@$(MAKE) targets B=$(BR) CFLAGS="$(CFLAGS) $(BASE_CFLAGS) $(DEPEND_CFLAGS)" \
1268	  OPTIMIZE="-DNDEBUG $(OPTIMIZE)" OPTIMIZEVM="-DNDEBUG $(OPTIMIZEVM)" \
1269	  CLIENT_CFLAGS="$(CLIENT_CFLAGS)" SERVER_CFLAGS="$(SERVER_CFLAGS)" V=$(V)
1270
1271ifneq ($(call bin_path, tput),)
1272  TERM_COLUMNS=$(shell if c=`tput cols`; then echo $$(($$c-4)); else echo 76; fi)
1273else
1274  TERM_COLUMNS=76
1275endif
1276
1277define ADD_COPY_TARGET
1278TARGETS += $2
1279$2: $1
1280	$(echo_cmd) "CP $$<"
1281	@cp $1 $2
1282endef
1283
1284# These functions allow us to generate rules for copying a list of files
1285# into the base directory of the build; this is useful for bundling libs,
1286# README files or whatever else
1287define GENERATE_COPY_TARGETS
1288$(foreach FILE,$1, \
1289  $(eval $(call ADD_COPY_TARGET, \
1290    $(FILE), \
1291    $(addprefix $(B)/,$(notdir $(FILE))))))
1292endef
1293
1294$(call GENERATE_COPY_TARGETS,$(EXTRA_FILES))
1295
1296ifneq ($(BUILD_CLIENT),0)
1297  $(call GENERATE_COPY_TARGETS,$(CLIENT_EXTRA_FILES))
1298endif
1299
1300NAKED_TARGETS=$(shell echo $(TARGETS) | sed -e "s!$(B)/!!g")
1301
1302print_list=-@for i in $(1); \
1303     do \
1304             echo "    $$i"; \
1305     done
1306
1307ifneq ($(call bin_path, fmt),)
1308  print_wrapped=@echo $(1) | fmt -w $(TERM_COLUMNS) | sed -e "s/^\(.*\)$$/    \1/"
1309else
1310  print_wrapped=$(print_list)
1311endif
1312
1313# Create the build directories, check libraries and print out
1314# an informational message, then start building
1315targets: makedirs
1316	@echo ""
1317	@echo "Building in $(B):"
1318	@echo "  PLATFORM: $(PLATFORM)"
1319	@echo "  ARCH: $(ARCH)"
1320	@echo "  FILE_ARCH: $(FILE_ARCH)"
1321	@echo "  VERSION: $(VERSION)"
1322	@echo "  COMPILE_PLATFORM: $(COMPILE_PLATFORM)"
1323	@echo "  COMPILE_ARCH: $(COMPILE_ARCH)"
1324	@echo "  HAVE_VM_COMPILED: $(HAVE_VM_COMPILED)"
1325	@echo "  PKG_CONFIG: $(PKG_CONFIG)"
1326	@echo "  CC: $(CC)"
1327	@echo "  CXX: $(CXX)"
1328ifdef MINGW
1329	@echo "  WINDRES: $(WINDRES)"
1330endif
1331	@echo ""
1332	@echo "  CFLAGS:"
1333	$(call print_wrapped, $(CFLAGS) $(OPTIMIZE))
1334	@echo ""
1335	@echo "  CLIENT_CFLAGS:"
1336	$(call print_wrapped, $(CLIENT_CFLAGS))
1337	@echo ""
1338	@echo "  SERVER_CFLAGS:"
1339	$(call print_wrapped, $(SERVER_CFLAGS))
1340	@echo ""
1341	@echo "  LDFLAGS:"
1342ifneq ($(LDFLAGS),)
1343	$(call print_wrapped, $(LDFLAGS))
1344endif
1345	@echo ""
1346	@echo "  LIBS:"
1347	$(call print_wrapped, $(LIBS))
1348	@echo ""
1349	@echo "  CLIENT_LIBS:"
1350	$(call print_wrapped, $(CLIENT_LIBS))
1351	@echo ""
1352	@echo "  Output:"
1353	$(call print_list, $(NAKED_TARGETS))
1354	@echo ""
1355ifneq ($(BUILD_ARCHIVE),0)
1356  ifneq ($(TARGETS),)
1357    ifndef DEBUG_MAKEFILE
1358	@$(MAKE) $(TARGETS) $(B).zip V=$(V)
1359    endif
1360  endif
1361else
1362  ifneq ($(TARGETS),)
1363    ifndef DEBUG_MAKEFILE
1364	@$(MAKE) $(TARGETS) V=$(V)
1365    endif
1366  endif
1367endif
1368
1369$(B).zip: $(TARGETS)
1370	@rm -f $@
1371	@(cd $(B) && zip -r9 ../../$@ $(NAKED_TARGETS))
1372
1373makedirs:
1374	@$(MKDIR) $(B)/splines
1375	@$(MKDIR) $(B)/client/opus
1376	@$(MKDIR) $(B)/client/vorbis
1377	@$(MKDIR) $(B)/renderer
1378	@$(MKDIR) $(B)/rend2
1379	@$(MKDIR) $(B)/rend2/glsl
1380	@$(MKDIR) $(B)/ded
1381	@$(MKDIR) $(B)/$(BASEGAME)/cgame
1382	@$(MKDIR) $(B)/$(BASEGAME)/game
1383	@$(MKDIR) $(B)/$(BASEGAME)/ui
1384	@$(MKDIR) $(B)/$(BASEGAME)/qcommon
1385	@$(MKDIR) $(B)/$(BASEGAME)/vm
1386	@$(MKDIR) $(B)/tools/asm
1387	@$(MKDIR) $(B)/tools/etc
1388	@$(MKDIR) $(B)/tools/rcc
1389	@$(MKDIR) $(B)/tools/cpp
1390	@$(MKDIR) $(B)/tools/lburg
1391
1392#############################################################################
1393# QVM BUILD TOOLS
1394#############################################################################
1395
1396ifndef TOOLS_CC
1397  # A compiler which probably produces native binaries
1398  TOOLS_CC = gcc
1399endif
1400
1401ifndef YACC
1402  YACC = yacc
1403endif
1404
1405TOOLS_OPTIMIZE = -g -Wall -fno-strict-aliasing
1406TOOLS_CFLAGS += $(TOOLS_OPTIMIZE) \
1407                -DTEMPDIR=\"$(TEMPDIR)\" -DSYSTEM=\"\" \
1408                -I$(Q3LCCSRCDIR) \
1409                -I$(LBURGDIR)
1410TOOLS_LIBS =
1411TOOLS_LDFLAGS =
1412
1413ifeq ($(GENERATE_DEPENDENCIES),1)
1414  TOOLS_CFLAGS += -MMD
1415endif
1416
1417define DO_YACC
1418$(echo_cmd) "YACC $<"
1419$(Q)$(YACC) $<
1420$(Q)mv -f y.tab.c $@
1421endef
1422
1423define DO_TOOLS_CC
1424$(echo_cmd) "TOOLS_CC $<"
1425$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) -o $@ -c $<
1426endef
1427
1428define DO_TOOLS_CC_DAGCHECK
1429$(echo_cmd) "TOOLS_CC_DAGCHECK $<"
1430$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) -Wno-unused -o $@ -c $<
1431endef
1432
1433LBURG       = $(B)/tools/lburg/lburg$(TOOLS_BINEXT)
1434DAGCHECK_C  = $(B)/tools/rcc/dagcheck.c
1435Q3RCC       = $(B)/tools/q3rcc$(TOOLS_BINEXT)
1436Q3CPP       = $(B)/tools/q3cpp$(TOOLS_BINEXT)
1437Q3LCC       = $(B)/tools/q3lcc$(TOOLS_BINEXT)
1438Q3ASM       = $(B)/tools/q3asm$(TOOLS_BINEXT)
1439
1440LBURGOBJ= \
1441  $(B)/tools/lburg/lburg.o \
1442  $(B)/tools/lburg/gram.o
1443
1444# override GNU Make built-in rule for converting gram.y to gram.c
1445%.c: %.y
1446ifeq ($(USE_YACC),1)
1447	$(DO_YACC)
1448endif
1449
1450$(B)/tools/lburg/%.o: $(LBURGDIR)/%.c
1451	$(DO_TOOLS_CC)
1452
1453$(LBURG): $(LBURGOBJ)
1454	$(echo_cmd) "LD $@"
1455	$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $^ $(TOOLS_LIBS)
1456
1457Q3RCCOBJ = \
1458  $(B)/tools/rcc/alloc.o \
1459  $(B)/tools/rcc/bind.o \
1460  $(B)/tools/rcc/bytecode.o \
1461  $(B)/tools/rcc/dag.o \
1462  $(B)/tools/rcc/dagcheck.o \
1463  $(B)/tools/rcc/decl.o \
1464  $(B)/tools/rcc/enode.o \
1465  $(B)/tools/rcc/error.o \
1466  $(B)/tools/rcc/event.o \
1467  $(B)/tools/rcc/expr.o \
1468  $(B)/tools/rcc/gen.o \
1469  $(B)/tools/rcc/init.o \
1470  $(B)/tools/rcc/inits.o \
1471  $(B)/tools/rcc/input.o \
1472  $(B)/tools/rcc/lex.o \
1473  $(B)/tools/rcc/list.o \
1474  $(B)/tools/rcc/main.o \
1475  $(B)/tools/rcc/null.o \
1476  $(B)/tools/rcc/output.o \
1477  $(B)/tools/rcc/prof.o \
1478  $(B)/tools/rcc/profio.o \
1479  $(B)/tools/rcc/simp.o \
1480  $(B)/tools/rcc/stmt.o \
1481  $(B)/tools/rcc/string.o \
1482  $(B)/tools/rcc/sym.o \
1483  $(B)/tools/rcc/symbolic.o \
1484  $(B)/tools/rcc/trace.o \
1485  $(B)/tools/rcc/tree.o \
1486  $(B)/tools/rcc/types.o
1487
1488$(DAGCHECK_C): $(LBURG) $(Q3LCCSRCDIR)/dagcheck.md
1489	$(echo_cmd) "LBURG $(Q3LCCSRCDIR)/dagcheck.md"
1490	$(Q)$(LBURG) $(Q3LCCSRCDIR)/dagcheck.md $@
1491
1492$(B)/tools/rcc/dagcheck.o: $(DAGCHECK_C)
1493	$(DO_TOOLS_CC_DAGCHECK)
1494
1495$(B)/tools/rcc/%.o: $(Q3LCCSRCDIR)/%.c
1496	$(DO_TOOLS_CC)
1497
1498$(Q3RCC): $(Q3RCCOBJ)
1499	$(echo_cmd) "LD $@"
1500	$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $^ $(TOOLS_LIBS)
1501
1502Q3CPPOBJ = \
1503  $(B)/tools/cpp/cpp.o \
1504  $(B)/tools/cpp/lex.o \
1505  $(B)/tools/cpp/nlist.o \
1506  $(B)/tools/cpp/tokens.o \
1507  $(B)/tools/cpp/macro.o \
1508  $(B)/tools/cpp/eval.o \
1509  $(B)/tools/cpp/include.o \
1510  $(B)/tools/cpp/hideset.o \
1511  $(B)/tools/cpp/getopt.o \
1512  $(B)/tools/cpp/unix.o
1513
1514$(B)/tools/cpp/%.o: $(Q3CPPDIR)/%.c
1515	$(DO_TOOLS_CC)
1516
1517$(Q3CPP): $(Q3CPPOBJ)
1518	$(echo_cmd) "LD $@"
1519	$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $^ $(TOOLS_LIBS)
1520
1521Q3LCCOBJ = \
1522	$(B)/tools/etc/lcc.o \
1523	$(B)/tools/etc/bytecode.o
1524
1525$(B)/tools/etc/%.o: $(Q3LCCETCDIR)/%.c
1526	$(DO_TOOLS_CC)
1527
1528$(Q3LCC): $(Q3LCCOBJ) $(Q3RCC) $(Q3CPP)
1529	$(echo_cmd) "LD $@"
1530	$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $(Q3LCCOBJ) $(TOOLS_LIBS)
1531
1532define DO_Q3LCC
1533$(echo_cmd) "Q3LCC $<"
1534$(Q)$(Q3LCC) $(BASEGAME_CFLAGS) -o $@ $<
1535endef
1536
1537define DO_CGAME_Q3LCC
1538$(echo_cmd) "CGAME_Q3LCC $<"
1539$(Q)$(Q3LCC) $(BASEGAME_CFLAGS) -DCGAMEDLL -DCGAME -o $@ $<
1540endef
1541
1542define DO_GAME_Q3LCC
1543$(echo_cmd) "GAME_Q3LCC $<"
1544$(Q)$(Q3LCC) $(BASEGAME_CFLAGS) -DGAMEDLL -DQAGAME -o $@ $<
1545endef
1546
1547define DO_UI_Q3LCC
1548$(echo_cmd) "UI_Q3LCC $<"
1549$(Q)$(Q3LCC) $(BASEGAME_CFLAGS) -DUI -o $@ $<
1550endef
1551
1552Q3ASMOBJ = \
1553  $(B)/tools/asm/q3asm.o \
1554  $(B)/tools/asm/cmdlib.o
1555
1556$(B)/tools/asm/%.o: $(Q3ASMDIR)/%.c
1557	$(DO_TOOLS_CC)
1558
1559$(Q3ASM): $(Q3ASMOBJ)
1560	$(echo_cmd) "LD $@"
1561	$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $^ $(TOOLS_LIBS)
1562
1563
1564#############################################################################
1565# CLIENT/SERVER
1566#############################################################################
1567
1568Q3OBJ = \
1569  $(B)/client/cl_cgame.o \
1570  $(B)/client/cl_cin.o \
1571  $(B)/client/cl_console.o \
1572  $(B)/client/cl_input.o \
1573  $(B)/client/cl_keys.o \
1574  $(B)/client/cl_main.o \
1575  $(B)/client/cl_net_chan.o \
1576  $(B)/client/cl_parse.o \
1577  $(B)/client/cl_scrn.o \
1578  $(B)/client/cl_ui.o \
1579  $(B)/client/cl_avi.o \
1580  \
1581  $(B)/client/cm_load.o \
1582  $(B)/client/cm_patch.o \
1583  $(B)/client/cm_polylib.o \
1584  $(B)/client/cm_test.o \
1585  $(B)/client/cm_trace.o \
1586  \
1587  $(B)/client/cmd.o \
1588  $(B)/client/common.o \
1589  $(B)/client/cvar.o \
1590  $(B)/client/files.o \
1591  $(B)/client/md4.o \
1592  $(B)/client/md5.o \
1593  $(B)/client/msg.o \
1594  $(B)/client/net_chan.o \
1595  $(B)/client/net_ip.o \
1596  $(B)/client/huffman.o \
1597  \
1598  $(B)/client/snd_altivec.o \
1599  $(B)/client/snd_adpcm.o \
1600  $(B)/client/snd_dma.o \
1601  $(B)/client/snd_mem.o \
1602  $(B)/client/snd_mix.o \
1603  $(B)/client/snd_wavelet.o \
1604  \
1605  $(B)/client/snd_main.o \
1606  $(B)/client/snd_codec.o \
1607  $(B)/client/snd_codec_wav.o \
1608  $(B)/client/snd_codec_ogg.o \
1609  $(B)/client/snd_codec_opus.o \
1610  \
1611  $(B)/client/qal.o \
1612  $(B)/client/snd_openal.o \
1613  \
1614  $(B)/client/cl_curl.o \
1615  \
1616  $(B)/client/sv_bot.o \
1617  $(B)/client/sv_ccmds.o \
1618  $(B)/client/sv_client.o \
1619  $(B)/client/sv_game.o \
1620  $(B)/client/sv_init.o \
1621  $(B)/client/sv_main.o \
1622  $(B)/client/sv_net_chan.o \
1623  $(B)/client/sv_snapshot.o \
1624  $(B)/client/sv_world.o \
1625  \
1626  $(B)/client/q_math.o \
1627  $(B)/client/q_shared.o \
1628  \
1629  $(B)/client/unzip.o \
1630  $(B)/client/ioapi.o \
1631  $(B)/client/puff.o \
1632  $(B)/client/vm.o \
1633  $(B)/client/vm_interpreted.o \
1634  \
1635  $(B)/client/be_aas_bspq3.o \
1636  $(B)/client/be_aas_cluster.o \
1637  $(B)/client/be_aas_debug.o \
1638  $(B)/client/be_aas_entity.o \
1639  $(B)/client/be_aas_file.o \
1640  $(B)/client/be_aas_main.o \
1641  $(B)/client/be_aas_move.o \
1642  $(B)/client/be_aas_optimize.o \
1643  $(B)/client/be_aas_reach.o \
1644  $(B)/client/be_aas_route.o \
1645  $(B)/client/be_aas_routealt.o \
1646  $(B)/client/be_aas_routetable.o \
1647  $(B)/client/be_aas_sample.o \
1648  $(B)/client/be_ai_char.o \
1649  $(B)/client/be_ai_chat.o \
1650  $(B)/client/be_ai_gen.o \
1651  $(B)/client/be_ai_goal.o \
1652  $(B)/client/be_ai_move.o \
1653  $(B)/client/be_ai_weap.o \
1654  $(B)/client/be_ai_weight.o \
1655  $(B)/client/be_ea.o \
1656  $(B)/client/be_interface.o \
1657  $(B)/client/l_crc.o \
1658  $(B)/client/l_libvar.o \
1659  $(B)/client/l_log.o \
1660  $(B)/client/l_memory.o \
1661  $(B)/client/l_precomp.o \
1662  $(B)/client/l_script.o \
1663  $(B)/client/l_struct.o \
1664  \
1665  $(B)/splines/math_angles.o \
1666  $(B)/splines/math_matrix.o \
1667  $(B)/splines/math_quaternion.o \
1668  $(B)/splines/math_vector.o \
1669  $(B)/splines/q_parse.o \
1670  $(B)/splines/splines.o \
1671  $(B)/splines/util_str.o \
1672  \
1673  $(B)/client/sdl_input.o \
1674  $(B)/client/sdl_snd.o \
1675  \
1676  $(B)/client/con_log.o \
1677  $(B)/client/sys_main.o
1678
1679ifdef MINGW
1680  Q3OBJ += \
1681    $(B)/client/con_passive.o
1682else
1683  Q3OBJ += \
1684    $(B)/client/con_tty.o
1685endif
1686
1687Q3R2OBJ = \
1688  $(B)/rend2/tr_animation.o \
1689  $(B)/rend2/tr_backend.o \
1690  $(B)/rend2/tr_bsp.o \
1691  $(B)/rend2/tr_cmds.o \
1692  $(B)/rend2/tr_curve.o \
1693  $(B)/rend2/tr_dsa.o \
1694  $(B)/rend2/tr_extramath.o \
1695  $(B)/rend2/tr_extensions.o \
1696  $(B)/rend2/tr_fbo.o \
1697  $(B)/rend2/tr_flares.o \
1698  $(B)/rend2/tr_font.o \
1699  $(B)/rend2/tr_glsl.o \
1700  $(B)/rend2/tr_image.o \
1701  $(B)/rend2/tr_image_bmp.o \
1702  $(B)/rend2/tr_image_jpg.o \
1703  $(B)/rend2/tr_image_pcx.o \
1704  $(B)/rend2/tr_image_png.o \
1705  $(B)/rend2/tr_image_tga.o \
1706  $(B)/rend2/tr_image_dds.o \
1707  $(B)/rend2/tr_init.o \
1708  $(B)/rend2/tr_light.o \
1709  $(B)/rend2/tr_main.o \
1710  $(B)/rend2/tr_marks.o \
1711  $(B)/rend2/tr_mesh.o \
1712  $(B)/rend2/tr_model.o \
1713  $(B)/rend2/tr_model_iqm.o \
1714  $(B)/rend2/tr_noise.o \
1715  $(B)/rend2/tr_postprocess.o \
1716  $(B)/rend2/tr_scene.o \
1717  $(B)/rend2/tr_shade.o \
1718  $(B)/rend2/tr_shade_calc.o \
1719  $(B)/rend2/tr_shader.o \
1720  $(B)/rend2/tr_shadows.o \
1721  $(B)/rend2/tr_sky.o \
1722  $(B)/rend2/tr_surface.o \
1723  $(B)/rend2/tr_vbo.o \
1724  $(B)/rend2/tr_world.o \
1725  \
1726  $(B)/renderer/sdl_gamma.o \
1727  $(B)/renderer/sdl_glimp.o
1728
1729Q3R2STRINGOBJ = \
1730  $(B)/rend2/glsl/bokeh_fp.o \
1731  $(B)/rend2/glsl/bokeh_vp.o \
1732  $(B)/rend2/glsl/calclevels4x_fp.o \
1733  $(B)/rend2/glsl/calclevels4x_vp.o \
1734  $(B)/rend2/glsl/depthblur_fp.o \
1735  $(B)/rend2/glsl/depthblur_vp.o \
1736  $(B)/rend2/glsl/dlight_fp.o \
1737  $(B)/rend2/glsl/dlight_vp.o \
1738  $(B)/rend2/glsl/down4x_fp.o \
1739  $(B)/rend2/glsl/down4x_vp.o \
1740  $(B)/rend2/glsl/fogpass_fp.o \
1741  $(B)/rend2/glsl/fogpass_vp.o \
1742  $(B)/rend2/glsl/generic_fp.o \
1743  $(B)/rend2/glsl/generic_vp.o \
1744  $(B)/rend2/glsl/lightall_fp.o \
1745  $(B)/rend2/glsl/lightall_vp.o \
1746  $(B)/rend2/glsl/pshadow_fp.o \
1747  $(B)/rend2/glsl/pshadow_vp.o \
1748  $(B)/rend2/glsl/shadowfill_fp.o \
1749  $(B)/rend2/glsl/shadowfill_vp.o \
1750  $(B)/rend2/glsl/shadowmask_fp.o \
1751  $(B)/rend2/glsl/shadowmask_vp.o \
1752  $(B)/rend2/glsl/ssao_fp.o \
1753  $(B)/rend2/glsl/ssao_vp.o \
1754  $(B)/rend2/glsl/texturecolor_fp.o \
1755  $(B)/rend2/glsl/texturecolor_vp.o \
1756  $(B)/rend2/glsl/tonemap_fp.o \
1757  $(B)/rend2/glsl/tonemap_vp.o
1758
1759Q3ROBJ = \
1760  $(B)/renderer/tr_altivec.o \
1761  $(B)/renderer/tr_animation.o \
1762  $(B)/renderer/tr_backend.o \
1763  $(B)/renderer/tr_bsp.o \
1764  $(B)/renderer/tr_cmds.o \
1765  $(B)/renderer/tr_cmesh.o \
1766  $(B)/renderer/tr_curve.o \
1767  $(B)/renderer/tr_flares.o \
1768  $(B)/renderer/tr_font.o \
1769  $(B)/renderer/tr_image.o \
1770  $(B)/renderer/tr_image_bmp.o \
1771  $(B)/renderer/tr_image_jpg.o \
1772  $(B)/renderer/tr_image_pcx.o \
1773  $(B)/renderer/tr_image_png.o \
1774  $(B)/renderer/tr_image_tga.o \
1775  $(B)/renderer/tr_init.o \
1776  $(B)/renderer/tr_light.o \
1777  $(B)/renderer/tr_main.o \
1778  $(B)/renderer/tr_marks.o \
1779  $(B)/renderer/tr_mesh.o \
1780  $(B)/renderer/tr_model.o \
1781  $(B)/renderer/tr_model_iqm.o \
1782  $(B)/renderer/tr_noise.o \
1783  $(B)/renderer/tr_scene.o \
1784  $(B)/renderer/tr_shade.o \
1785  $(B)/renderer/tr_shade_calc.o \
1786  $(B)/renderer/tr_shader.o \
1787  $(B)/renderer/tr_shadows.o \
1788  $(B)/renderer/tr_sky.o \
1789  $(B)/renderer/tr_surface.o \
1790  $(B)/renderer/tr_world.o \
1791
1792ifeq ($(USE_BLOOM),1)
1793  Q3ROBJ += $(B)/renderer/tr_bloom.o
1794endif
1795
1796  Q3ROBJ += $(B)/renderer/sdl_gamma.o
1797  Q3ROBJ += $(B)/renderer/sdl_glimp.o
1798
1799ifneq ($(USE_RENDERER_DLOPEN), 0)
1800  Q3ROBJ += \
1801    $(B)/renderer/q_shared.o \
1802    $(B)/renderer/puff.o \
1803    $(B)/renderer/q_math.o \
1804    $(B)/renderer/tr_subs.o
1805
1806  Q3R2OBJ += \
1807    $(B)/renderer/q_shared.o \
1808    $(B)/renderer/puff.o \
1809    $(B)/renderer/q_math.o \
1810    $(B)/renderer/tr_subs.o
1811endif
1812
1813ifneq ($(USE_INTERNAL_JPEG),0)
1814  JPGOBJ = \
1815    $(B)/renderer/jaricom.o \
1816    $(B)/renderer/jcapimin.o \
1817    $(B)/renderer/jcapistd.o \
1818    $(B)/renderer/jcarith.o \
1819    $(B)/renderer/jccoefct.o  \
1820    $(B)/renderer/jccolor.o \
1821    $(B)/renderer/jcdctmgr.o \
1822    $(B)/renderer/jchuff.o   \
1823    $(B)/renderer/jcinit.o \
1824    $(B)/renderer/jcmainct.o \
1825    $(B)/renderer/jcmarker.o \
1826    $(B)/renderer/jcmaster.o \
1827    $(B)/renderer/jcomapi.o \
1828    $(B)/renderer/jcparam.o \
1829    $(B)/renderer/jcprepct.o \
1830    $(B)/renderer/jcsample.o \
1831    $(B)/renderer/jctrans.o \
1832    $(B)/renderer/jdapimin.o \
1833    $(B)/renderer/jdapistd.o \
1834    $(B)/renderer/jdarith.o \
1835    $(B)/renderer/jdatadst.o \
1836    $(B)/renderer/jdatasrc.o \
1837    $(B)/renderer/jdcoefct.o \
1838    $(B)/renderer/jdcolor.o \
1839    $(B)/renderer/jddctmgr.o \
1840    $(B)/renderer/jdhuff.o \
1841    $(B)/renderer/jdinput.o \
1842    $(B)/renderer/jdmainct.o \
1843    $(B)/renderer/jdmarker.o \
1844    $(B)/renderer/jdmaster.o \
1845    $(B)/renderer/jdmerge.o \
1846    $(B)/renderer/jdpostct.o \
1847    $(B)/renderer/jdsample.o \
1848    $(B)/renderer/jdtrans.o \
1849    $(B)/renderer/jerror.o \
1850    $(B)/renderer/jfdctflt.o \
1851    $(B)/renderer/jfdctfst.o \
1852    $(B)/renderer/jfdctint.o \
1853    $(B)/renderer/jidctflt.o \
1854    $(B)/renderer/jidctfst.o \
1855    $(B)/renderer/jidctint.o \
1856    $(B)/renderer/jmemmgr.o \
1857    $(B)/renderer/jmemnobs.o \
1858    $(B)/renderer/jquant1.o \
1859    $(B)/renderer/jquant2.o \
1860    $(B)/renderer/jutils.o
1861endif
1862
1863ifeq ($(USE_FREETYPE),1)
1864ifneq ($(USE_INTERNAL_FREETYPE),0)
1865  FTOBJ += \
1866    $(B)/renderer/ftsystem.o \
1867    $(B)/renderer/ftdebug.o \
1868    $(B)/renderer/ftinit.o \
1869    $(B)/renderer/ftbase.o \
1870    $(B)/renderer/ftbbox.o \
1871    $(B)/renderer/ftbdf.o \
1872    $(B)/renderer/ftbitmap.o \
1873    $(B)/renderer/ftcid.o \
1874    $(B)/renderer/ftfntfmt.o \
1875    $(B)/renderer/ftfstype.o \
1876    $(B)/renderer/ftgasp.o \
1877    $(B)/renderer/ftglyph.o \
1878    $(B)/renderer/ftgxval.o \
1879    $(B)/renderer/ftlcdfil.o \
1880    $(B)/renderer/ftmm.o \
1881    $(B)/renderer/ftotval.o \
1882    $(B)/renderer/ftpatent.o \
1883    $(B)/renderer/ftpfr.o \
1884    $(B)/renderer/ftstroke.o \
1885    $(B)/renderer/ftsynth.o \
1886    $(B)/renderer/fttype1.o \
1887    $(B)/renderer/ftwinfnt.o \
1888    $(B)/renderer/truetype.o \
1889    $(B)/renderer/type1.o \
1890    $(B)/renderer/cff.o \
1891    $(B)/renderer/type1cid.o \
1892    $(B)/renderer/pfr.o \
1893    $(B)/renderer/type42.o \
1894    $(B)/renderer/winfnt.o \
1895    $(B)/renderer/pcf.o \
1896    $(B)/renderer/bdf.o \
1897    $(B)/renderer/sfnt.o \
1898    $(B)/renderer/autofit.o \
1899    $(B)/renderer/pshinter.o \
1900    $(B)/renderer/raster.o \
1901    $(B)/renderer/smooth.o \
1902    $(B)/renderer/ftcache.o \
1903    $(B)/renderer/ftgzip.o \
1904    $(B)/renderer/ftlzw.o \
1905    $(B)/renderer/ftbzip2.o \
1906    $(B)/renderer/psaux.o \
1907    $(B)/renderer/psnames.o
1908endif
1909endif
1910
1911ifeq ($(ARCH),x86)
1912  Q3OBJ += \
1913    $(B)/client/snd_mixa.o \
1914    $(B)/client/matha.o \
1915    $(B)/client/snapvector.o \
1916    $(B)/client/ftola.o
1917endif
1918ifeq ($(ARCH),x86_64)
1919  Q3OBJ += \
1920    $(B)/client/snapvector.o \
1921    $(B)/client/ftola.o
1922endif
1923
1924ifeq ($(NEED_OPUS),1)
1925ifeq ($(USE_INTERNAL_OPUS),1)
1926Q3OBJ += \
1927  $(B)/client/opus/opus.o \
1928  $(B)/client/opus/opus_decoder.o \
1929  $(B)/client/opus/opus_encoder.o \
1930  $(B)/client/opus/opus_multistream.o \
1931  $(B)/client/opus/opus_multistream_encoder.o \
1932  $(B)/client/opus/opus_multistream_decoder.o \
1933  $(B)/client/opus/repacketizer.o \
1934  $(B)/client/opus/analysis.o \
1935  $(B)/client/opus/mlp.o \
1936  $(B)/client/opus/mlp_data.o \
1937  \
1938  $(B)/client/opus/bands.o \
1939  $(B)/client/opus/celt.o \
1940  $(B)/client/opus/celt_encoder.o \
1941  $(B)/client/opus/celt_decoder.o \
1942  $(B)/client/opus/cwrs.o \
1943  $(B)/client/opus/entcode.o \
1944  $(B)/client/opus/entdec.o \
1945  $(B)/client/opus/entenc.o \
1946  $(B)/client/opus/kiss_fft.o \
1947  $(B)/client/opus/laplace.o \
1948  $(B)/client/opus/mathops.o \
1949  $(B)/client/opus/mdct.o \
1950  $(B)/client/opus/modes.o \
1951  $(B)/client/opus/pitch.o \
1952  $(B)/client/opus/celt_lpc.o \
1953  $(B)/client/opus/quant_bands.o \
1954  $(B)/client/opus/rate.o \
1955  $(B)/client/opus/vq.o \
1956  \
1957  $(B)/client/opus/CNG.o \
1958  $(B)/client/opus/code_signs.o \
1959  $(B)/client/opus/init_decoder.o \
1960  $(B)/client/opus/decode_core.o \
1961  $(B)/client/opus/decode_frame.o \
1962  $(B)/client/opus/decode_parameters.o \
1963  $(B)/client/opus/decode_indices.o \
1964  $(B)/client/opus/decode_pulses.o \
1965  $(B)/client/opus/decoder_set_fs.o \
1966  $(B)/client/opus/dec_API.o \
1967  $(B)/client/opus/enc_API.o \
1968  $(B)/client/opus/encode_indices.o \
1969  $(B)/client/opus/encode_pulses.o \
1970  $(B)/client/opus/gain_quant.o \
1971  $(B)/client/opus/interpolate.o \
1972  $(B)/client/opus/LP_variable_cutoff.o \
1973  $(B)/client/opus/NLSF_decode.o \
1974  $(B)/client/opus/NSQ.o \
1975  $(B)/client/opus/NSQ_del_dec.o \
1976  $(B)/client/opus/PLC.o \
1977  $(B)/client/opus/shell_coder.o \
1978  $(B)/client/opus/tables_gain.o \
1979  $(B)/client/opus/tables_LTP.o \
1980  $(B)/client/opus/tables_NLSF_CB_NB_MB.o \
1981  $(B)/client/opus/tables_NLSF_CB_WB.o \
1982  $(B)/client/opus/tables_other.o \
1983  $(B)/client/opus/tables_pitch_lag.o \
1984  $(B)/client/opus/tables_pulses_per_block.o \
1985  $(B)/client/opus/VAD.o \
1986  $(B)/client/opus/control_audio_bandwidth.o \
1987  $(B)/client/opus/quant_LTP_gains.o \
1988  $(B)/client/opus/VQ_WMat_EC.o \
1989  $(B)/client/opus/HP_variable_cutoff.o \
1990  $(B)/client/opus/NLSF_encode.o \
1991  $(B)/client/opus/NLSF_VQ.o \
1992  $(B)/client/opus/NLSF_unpack.o \
1993  $(B)/client/opus/NLSF_del_dec_quant.o \
1994  $(B)/client/opus/process_NLSFs.o \
1995  $(B)/client/opus/stereo_LR_to_MS.o \
1996  $(B)/client/opus/stereo_MS_to_LR.o \
1997  $(B)/client/opus/check_control_input.o \
1998  $(B)/client/opus/control_SNR.o \
1999  $(B)/client/opus/init_encoder.o \
2000  $(B)/client/opus/control_codec.o \
2001  $(B)/client/opus/A2NLSF.o \
2002  $(B)/client/opus/ana_filt_bank_1.o \
2003  $(B)/client/opus/biquad_alt.o \
2004  $(B)/client/opus/bwexpander_32.o \
2005  $(B)/client/opus/bwexpander.o \
2006  $(B)/client/opus/debug.o \
2007  $(B)/client/opus/decode_pitch.o \
2008  $(B)/client/opus/inner_prod_aligned.o \
2009  $(B)/client/opus/lin2log.o \
2010  $(B)/client/opus/log2lin.o \
2011  $(B)/client/opus/LPC_analysis_filter.o \
2012  $(B)/client/opus/LPC_inv_pred_gain.o \
2013  $(B)/client/opus/table_LSF_cos.o \
2014  $(B)/client/opus/NLSF2A.o \
2015  $(B)/client/opus/NLSF_stabilize.o \
2016  $(B)/client/opus/NLSF_VQ_weights_laroia.o \
2017  $(B)/client/opus/pitch_est_tables.o \
2018  $(B)/client/opus/resampler.o \
2019  $(B)/client/opus/resampler_down2_3.o \
2020  $(B)/client/opus/resampler_down2.o \
2021  $(B)/client/opus/resampler_private_AR2.o \
2022  $(B)/client/opus/resampler_private_down_FIR.o \
2023  $(B)/client/opus/resampler_private_IIR_FIR.o \
2024  $(B)/client/opus/resampler_private_up2_HQ.o \
2025  $(B)/client/opus/resampler_rom.o \
2026  $(B)/client/opus/sigm_Q15.o \
2027  $(B)/client/opus/sort.o \
2028  $(B)/client/opus/sum_sqr_shift.o \
2029  $(B)/client/opus/stereo_decode_pred.o \
2030  $(B)/client/opus/stereo_encode_pred.o \
2031  $(B)/client/opus/stereo_find_predictor.o \
2032  $(B)/client/opus/stereo_quant_pred.o \
2033  $(B)/client/opus/LPC_fit.o \
2034  \
2035  $(B)/client/opus/apply_sine_window_FLP.o \
2036  $(B)/client/opus/corrMatrix_FLP.o \
2037  $(B)/client/opus/encode_frame_FLP.o \
2038  $(B)/client/opus/find_LPC_FLP.o \
2039  $(B)/client/opus/find_LTP_FLP.o \
2040  $(B)/client/opus/find_pitch_lags_FLP.o \
2041  $(B)/client/opus/find_pred_coefs_FLP.o \
2042  $(B)/client/opus/LPC_analysis_filter_FLP.o \
2043  $(B)/client/opus/LTP_analysis_filter_FLP.o \
2044  $(B)/client/opus/LTP_scale_ctrl_FLP.o \
2045  $(B)/client/opus/noise_shape_analysis_FLP.o \
2046  $(B)/client/opus/process_gains_FLP.o \
2047  $(B)/client/opus/regularize_correlations_FLP.o \
2048  $(B)/client/opus/residual_energy_FLP.o \
2049  $(B)/client/opus/warped_autocorrelation_FLP.o \
2050  $(B)/client/opus/wrappers_FLP.o \
2051  $(B)/client/opus/autocorrelation_FLP.o \
2052  $(B)/client/opus/burg_modified_FLP.o \
2053  $(B)/client/opus/bwexpander_FLP.o \
2054  $(B)/client/opus/energy_FLP.o \
2055  $(B)/client/opus/inner_product_FLP.o \
2056  $(B)/client/opus/k2a_FLP.o \
2057  $(B)/client/opus/LPC_inv_pred_gain_FLP.o \
2058  $(B)/client/opus/pitch_analysis_core_FLP.o \
2059  $(B)/client/opus/scale_copy_vector_FLP.o \
2060  $(B)/client/opus/scale_vector_FLP.o \
2061  $(B)/client/opus/schur_FLP.o \
2062  $(B)/client/opus/sort_FLP.o \
2063  \
2064  $(B)/client/info.o \
2065  $(B)/client/internal.o \
2066  $(B)/client/opusfile.o \
2067  $(B)/client/stream.o \
2068  $(B)/client/http.o
2069ifdef MINGW
2070Q3OBJ += \
2071  $(B)/client/wincerts.o
2072endif
2073endif
2074endif
2075
2076ifeq ($(NEED_OGG),1)
2077ifeq ($(USE_INTERNAL_OGG),1)
2078Q3OBJ += \
2079  $(B)/client/bitwise.o \
2080  $(B)/client/framing.o
2081endif
2082endif
2083
2084ifeq ($(USE_CODEC_VORBIS),1)
2085ifeq ($(USE_INTERNAL_VORBIS),1)
2086Q3OBJ += \
2087  $(B)/client/vorbis/analysis.o \
2088  $(B)/client/vorbis/bitrate.o \
2089  $(B)/client/vorbis/block.o \
2090  $(B)/client/vorbis/codebook.o \
2091  $(B)/client/vorbis/envelope.o \
2092  $(B)/client/vorbis/floor0.o \
2093  $(B)/client/vorbis/floor1.o \
2094  $(B)/client/vorbis/info.o \
2095  $(B)/client/vorbis/lookup.o \
2096  $(B)/client/vorbis/lpc.o \
2097  $(B)/client/vorbis/lsp.o \
2098  $(B)/client/vorbis/mapping0.o \
2099  $(B)/client/vorbis/mdct.o \
2100  $(B)/client/vorbis/psy.o \
2101  $(B)/client/vorbis/registry.o \
2102  $(B)/client/vorbis/res0.o \
2103  $(B)/client/vorbis/sharedbook.o \
2104  $(B)/client/vorbis/smallft.o \
2105  $(B)/client/vorbis/synthesis.o \
2106  $(B)/client/vorbis/vorbisenc.o \
2107  $(B)/client/vorbis/vorbisfile.o \
2108  $(B)/client/vorbis/window.o
2109endif
2110endif
2111
2112ifeq ($(USE_INTERNAL_ZLIB),1)
2113Q3OBJ += \
2114  $(B)/client/adler32.o \
2115  $(B)/client/crc32.o \
2116  $(B)/client/inffast.o \
2117  $(B)/client/inflate.o \
2118  $(B)/client/inftrees.o \
2119  $(B)/client/zutil.o
2120endif
2121
2122ifeq ($(HAVE_VM_COMPILED),true)
2123  ifneq ($(findstring $(ARCH),x86 x86_64),)
2124    Q3OBJ += $(B)/client/vm_x86.o
2125  endif
2126  ifneq ($(findstring $(ARCH),ppc ppc64),)
2127    Q3OBJ += $(B)/client/vm_powerpc.o $(B)/client/vm_powerpc_asm.o
2128  endif
2129  ifneq ($(findstring $(ARCH),sparc sparc64),)
2130    Q3OBJ += $(B)/client/vm_sparc.o
2131  endif
2132  ifeq ($(ARM_VER_CHECK),armv7l)
2133    Q3OBJ += $(B)/client/vm_armv7l.o
2134  endif
2135endif
2136
2137ifdef MINGW
2138  Q3OBJ += \
2139    $(B)/client/win_resource.o \
2140    $(B)/client/sys_win32.o
2141else
2142  Q3OBJ += \
2143    $(B)/client/sys_unix.o
2144endif
2145
2146ifeq ($(PLATFORM),darwin)
2147  Q3OBJ += \
2148    $(B)/client/sys_osx.o
2149endif
2150
2151ifeq ($(USE_MUMBLE),1)
2152  Q3OBJ += \
2153    $(B)/client/libmumblelink.o
2154endif
2155
2156ifneq ($(USE_RENDERER_DLOPEN),0)
2157$(B)/$(CLIENTBIN)$(FULLBINEXT): $(Q3OBJ) $(LIBSDLMAIN)
2158	$(echo_cmd) "LD $@"
2159	$(Q)$(CXX) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
2160		-o $@ $(Q3OBJ) \
2161		$(LIBSDLMAIN) $(CLIENT_LIBS) $(LIBS)
2162
2163$(B)/renderer_sp_opengl1_$(SHLIBNAME): $(Q3ROBJ) $(JPGOBJ) $(FTOBJ)
2164	$(echo_cmd) "LD $@"
2165	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3ROBJ) $(JPGOBJ) $(FTOBJ) \
2166		$(THREAD_LIBS) $(LIBSDLMAIN) $(RENDERER_LIBS) $(LIBS)
2167
2168$(B)/renderer_sp_rend2_$(SHLIBNAME): $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) $(FTOBJ)
2169	$(echo_cmd) "LD $@"
2170	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) $(FTOBJ) \
2171		$(THREAD_LIBS) $(LIBSDLMAIN) $(RENDERER_LIBS) $(LIBS)
2172else
2173$(B)/$(CLIENTBIN)$(FULLBINEXT): $(Q3OBJ) $(Q3ROBJ) $(JPGOBJ) $(FTOBJ) $(LIBSDLMAIN)
2174	$(echo_cmd) "LD $@"
2175	$(Q)$(CXX) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
2176		-o $@ $(Q3OBJ) $(Q3ROBJ) $(JPGOBJ) $(FTOBJ) \
2177		$(LIBSDLMAIN) $(CLIENT_LIBS) $(RENDERER_LIBS) $(LIBS)
2178
2179$(B)/$(CLIENTBIN)_rend2$(FULLBINEXT): $(Q3OBJ) $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) $(FTOBJ) $(LIBSDLMAIN)
2180	$(echo_cmd) "LD $@"
2181	$(Q)$(CXX) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
2182		-o $@ $(Q3OBJ) $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) $(FTOBJ) \
2183		$(LIBSDLMAIN) $(CLIENT_LIBS) $(RENDERER_LIBS) $(LIBS)
2184endif
2185
2186ifneq ($(strip $(LIBSDLMAIN)),)
2187ifneq ($(strip $(LIBSDLMAINSRC)),)
2188$(LIBSDLMAIN) : $(LIBSDLMAINSRC)
2189	cp $< $@
2190	$(RANLIB) $@
2191endif
2192endif
2193
2194
2195
2196#############################################################################
2197# DEDICATED SERVER
2198#############################################################################
2199
2200Q3DOBJ = \
2201  $(B)/ded/sv_bot.o \
2202  $(B)/ded/sv_client.o \
2203  $(B)/ded/sv_ccmds.o \
2204  $(B)/ded/sv_game.o \
2205  $(B)/ded/sv_init.o \
2206  $(B)/ded/sv_main.o \
2207  $(B)/ded/sv_net_chan.o \
2208  $(B)/ded/sv_snapshot.o \
2209  $(B)/ded/sv_world.o \
2210  \
2211  $(B)/ded/cm_load.o \
2212  $(B)/ded/cm_patch.o \
2213  $(B)/ded/cm_polylib.o \
2214  $(B)/ded/cm_test.o \
2215  $(B)/ded/cm_trace.o \
2216  $(B)/ded/cmd.o \
2217  $(B)/ded/common.o \
2218  $(B)/ded/cvar.o \
2219  $(B)/ded/files.o \
2220  $(B)/ded/md4.o \
2221  $(B)/ded/msg.o \
2222  $(B)/ded/net_chan.o \
2223  $(B)/ded/net_ip.o \
2224  $(B)/ded/huffman.o \
2225  \
2226  $(B)/ded/q_math.o \
2227  $(B)/ded/q_shared.o \
2228  \
2229  $(B)/ded/unzip.o \
2230  $(B)/ded/ioapi.o \
2231  $(B)/ded/vm.o \
2232  $(B)/ded/vm_interpreted.o \
2233  \
2234  $(B)/ded/be_aas_bspq3.o \
2235  $(B)/ded/be_aas_cluster.o \
2236  $(B)/ded/be_aas_debug.o \
2237  $(B)/ded/be_aas_entity.o \
2238  $(B)/ded/be_aas_file.o \
2239  $(B)/ded/be_aas_main.o \
2240  $(B)/ded/be_aas_move.o \
2241  $(B)/ded/be_aas_optimize.o \
2242  $(B)/ded/be_aas_reach.o \
2243  $(B)/ded/be_aas_route.o \
2244  $(B)/ded/be_aas_routealt.o \
2245  $(B)/ded/be_aas_routetable.o \
2246  $(B)/ded/be_aas_sample.o \
2247  $(B)/ded/be_ai_char.o \
2248  $(B)/ded/be_ai_chat.o \
2249  $(B)/ded/be_ai_gen.o \
2250  $(B)/ded/be_ai_goal.o \
2251  $(B)/ded/be_ai_move.o \
2252  $(B)/ded/be_ai_weap.o \
2253  $(B)/ded/be_ai_weight.o \
2254  $(B)/ded/be_ea.o \
2255  $(B)/ded/be_interface.o \
2256  $(B)/ded/l_crc.o \
2257  $(B)/ded/l_libvar.o \
2258  $(B)/ded/l_log.o \
2259  $(B)/ded/l_memory.o \
2260  $(B)/ded/l_precomp.o \
2261  $(B)/ded/l_script.o \
2262  $(B)/ded/l_struct.o \
2263  \
2264  $(B)/ded/null_client.o \
2265  $(B)/ded/null_input.o \
2266  $(B)/ded/null_snddma.o \
2267  \
2268  $(B)/ded/con_log.o \
2269  $(B)/ded/sys_main.o
2270
2271ifeq ($(ARCH),x86)
2272  Q3DOBJ += \
2273      $(B)/ded/matha.o \
2274      $(B)/ded/snapvector.o \
2275      $(B)/ded/ftola.o
2276endif
2277ifeq ($(ARCH),x86_64)
2278  Q3DOBJ += \
2279      $(B)/ded/snapvector.o \
2280      $(B)/ded/ftola.o
2281endif
2282
2283ifeq ($(USE_INTERNAL_ZLIB),1)
2284Q3DOBJ += \
2285  $(B)/ded/adler32.o \
2286  $(B)/ded/crc32.o \
2287  $(B)/ded/inffast.o \
2288  $(B)/ded/inflate.o \
2289  $(B)/ded/inftrees.o \
2290  $(B)/ded/zutil.o
2291endif
2292
2293ifeq ($(HAVE_VM_COMPILED),true)
2294  ifneq ($(findstring $(ARCH),x86 x86_64),)
2295    Q3DOBJ += $(B)/ded/vm_x86.o
2296  endif
2297  ifneq ($(findstring $(ARCH),ppc ppc64),)
2298    Q3DOBJ += $(B)/ded/vm_powerpc.o $(B)/ded/vm_powerpc_asm.o
2299  endif
2300  ifneq ($(findstring $(ARCH),sparc sparc64),)
2301    Q3DOBJ += $(B)/ded/vm_sparc.o
2302  endif
2303  ifeq ($(ARM_VER_CHECK),armv7l)
2304    Q3DOBJ += $(B)/ded/vm_armv7l.o
2305  endif
2306endif
2307
2308ifdef MINGW
2309  Q3DOBJ += \
2310    $(B)/ded/win_resource.o \
2311    $(B)/ded/sys_win32.o \
2312    $(B)/ded/con_win32.o
2313else
2314  Q3DOBJ += \
2315    $(B)/ded/sys_unix.o \
2316    $(B)/ded/con_tty.o
2317endif
2318
2319ifeq ($(PLATFORM),darwin)
2320  Q3DOBJ += \
2321    $(B)/ded/sys_osx.o
2322endif
2323
2324$(B)/$(SERVERBIN)$(FULLBINEXT): $(Q3DOBJ)
2325	$(echo_cmd) "LD $@"
2326	$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) -o $@ $(Q3DOBJ) $(LIBS)
2327
2328
2329
2330#############################################################################
2331## BASEQ3 CGAME
2332#############################################################################
2333
2334Q3CGOBJ_ = \
2335  $(B)/$(BASEGAME)/cgame/cg_main.o \
2336  $(B)/$(BASEGAME)/cgame/bg_animation.o \
2337  $(B)/$(BASEGAME)/cgame/bg_misc.o \
2338  $(B)/$(BASEGAME)/cgame/bg_pmove.o \
2339  $(B)/$(BASEGAME)/cgame/bg_slidemove.o \
2340  $(B)/$(BASEGAME)/cgame/bg_lib.o \
2341  $(B)/$(BASEGAME)/cgame/cg_consolecmds.o \
2342  $(B)/$(BASEGAME)/cgame/cg_draw.o \
2343  $(B)/$(BASEGAME)/cgame/cg_drawtools.o \
2344  $(B)/$(BASEGAME)/cgame/cg_effects.o \
2345  $(B)/$(BASEGAME)/cgame/cg_ents.o \
2346  $(B)/$(BASEGAME)/cgame/cg_event.o \
2347  $(B)/$(BASEGAME)/cgame/cg_flamethrower.o \
2348  $(B)/$(BASEGAME)/cgame/cg_info.o \
2349  $(B)/$(BASEGAME)/cgame/cg_localents.o \
2350  $(B)/$(BASEGAME)/cgame/cg_marks.o \
2351  $(B)/$(BASEGAME)/cgame/cg_newdraw.o \
2352  $(B)/$(BASEGAME)/cgame/cg_particles.o \
2353  $(B)/$(BASEGAME)/cgame/cg_players.o \
2354  $(B)/$(BASEGAME)/cgame/cg_playerstate.o \
2355  $(B)/$(BASEGAME)/cgame/cg_predict.o \
2356  $(B)/$(BASEGAME)/cgame/cg_scoreboard.o \
2357  $(B)/$(BASEGAME)/cgame/cg_servercmds.o \
2358  $(B)/$(BASEGAME)/cgame/cg_snapshot.o \
2359  $(B)/$(BASEGAME)/cgame/cg_sound.o \
2360  $(B)/$(BASEGAME)/cgame/cg_trails.o \
2361  $(B)/$(BASEGAME)/cgame/cg_view.o \
2362  $(B)/$(BASEGAME)/cgame/cg_weapons.o \
2363  $(B)/$(BASEGAME)/ui/ui_shared.o \
2364  \
2365  $(B)/$(BASEGAME)/qcommon/q_math.o \
2366  $(B)/$(BASEGAME)/qcommon/q_shared.o
2367
2368Q3CGOBJ = $(Q3CGOBJ_) $(B)/$(BASEGAME)/cgame/cg_syscalls.o
2369Q3CGVMOBJ = $(Q3CGOBJ_:%.o=%.asm)
2370
2371ifdef MINGW
2372$(B)/$(BASEGAME)/cgame_sp_$(SHLIBNAME): $(Q3CGOBJ)
2373	$(echo_cmd) "LD $@"
2374	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3CGOBJ)
2375else
2376$(B)/$(BASEGAME)/cgame.sp.$(SHLIBNAME): $(Q3CGOBJ)
2377	$(echo_cmd) "LD $@"
2378	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3CGOBJ)
2379endif
2380$(B)/$(BASEGAME)/vm/cgame.sp.qvm: $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM)
2381	$(echo_cmd) "Q3ASM $@"
2382	$(Q)$(Q3ASM) -o $@ $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm
2383
2384
2385#############################################################################
2386## BASEQ3 GAME
2387#############################################################################
2388
2389Q3GOBJ_ = \
2390  $(B)/$(BASEGAME)/game/g_main.o \
2391  $(B)/$(BASEGAME)/game/ai_cast.o \
2392  $(B)/$(BASEGAME)/game/ai_cast_characters.o \
2393  $(B)/$(BASEGAME)/game/ai_cast_debug.o \
2394  $(B)/$(BASEGAME)/game/ai_cast_events.o \
2395  $(B)/$(BASEGAME)/game/ai_cast_fight.o \
2396  $(B)/$(BASEGAME)/game/ai_cast_func_attack.o \
2397  $(B)/$(BASEGAME)/game/ai_cast_func_boss1.o \
2398  $(B)/$(BASEGAME)/game/ai_cast_funcs.o \
2399  $(B)/$(BASEGAME)/game/ai_cast_script_actions.o \
2400  $(B)/$(BASEGAME)/game/ai_cast_script.o \
2401  $(B)/$(BASEGAME)/game/ai_cast_script_ents.o \
2402  $(B)/$(BASEGAME)/game/ai_cast_sight.o \
2403  $(B)/$(BASEGAME)/game/ai_cast_think.o \
2404  $(B)/$(BASEGAME)/game/ai_chat.o \
2405  $(B)/$(BASEGAME)/game/ai_cmd.o \
2406  $(B)/$(BASEGAME)/game/ai_dmnet.o \
2407  $(B)/$(BASEGAME)/game/ai_dmq3.o \
2408  $(B)/$(BASEGAME)/game/ai_main.o \
2409  $(B)/$(BASEGAME)/game/ai_team.o \
2410  $(B)/$(BASEGAME)/game/bg_animation.o \
2411  $(B)/$(BASEGAME)/game/bg_misc.o \
2412  $(B)/$(BASEGAME)/game/bg_pmove.o \
2413  $(B)/$(BASEGAME)/game/bg_slidemove.o \
2414  $(B)/$(BASEGAME)/game/bg_lib.o \
2415  $(B)/$(BASEGAME)/game/g_active.o \
2416  $(B)/$(BASEGAME)/game/g_alarm.o \
2417  $(B)/$(BASEGAME)/game/g_bot.o \
2418  $(B)/$(BASEGAME)/game/g_client.o \
2419  $(B)/$(BASEGAME)/game/g_cmds.o \
2420  $(B)/$(BASEGAME)/game/g_combat.o \
2421  $(B)/$(BASEGAME)/game/g_items.o \
2422  $(B)/$(BASEGAME)/game/g_mem.o \
2423  $(B)/$(BASEGAME)/game/g_misc.o \
2424  $(B)/$(BASEGAME)/game/g_missile.o \
2425  $(B)/$(BASEGAME)/game/g_mover.o \
2426  $(B)/$(BASEGAME)/game/g_props.o \
2427  $(B)/$(BASEGAME)/game/g_save.o \
2428  $(B)/$(BASEGAME)/game/g_script_actions.o \
2429  $(B)/$(BASEGAME)/game/g_script.o \
2430  $(B)/$(BASEGAME)/game/g_session.o \
2431  $(B)/$(BASEGAME)/game/g_spawn.o \
2432  $(B)/$(BASEGAME)/game/g_svcmds.o \
2433  $(B)/$(BASEGAME)/game/g_target.o \
2434  $(B)/$(BASEGAME)/game/g_team.o \
2435  $(B)/$(BASEGAME)/game/g_tramcar.o \
2436  $(B)/$(BASEGAME)/game/g_trigger.o \
2437  $(B)/$(BASEGAME)/game/g_utils.o \
2438  $(B)/$(BASEGAME)/game/g_weapon.o \
2439  \
2440  $(B)/$(BASEGAME)/qcommon/q_math.o \
2441  $(B)/$(BASEGAME)/qcommon/q_shared.o
2442
2443Q3GOBJ = $(Q3GOBJ_) $(B)/$(BASEGAME)/game/g_syscalls.o
2444Q3GVMOBJ = $(Q3GOBJ_:%.o=%.asm)
2445
2446ifdef MINGW
2447$(B)/$(BASEGAME)/qagame_sp_$(SHLIBNAME): $(Q3GOBJ)
2448	$(echo_cmd) "LD $@"
2449	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3GOBJ)
2450else
2451$(B)/$(BASEGAME)/qagame.sp.$(SHLIBNAME): $(Q3GOBJ)
2452	$(echo_cmd) "LD $@"
2453	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3GOBJ)
2454endif
2455$(B)/$(BASEGAME)/vm/qagame.sp.qvm: $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM)
2456	$(echo_cmd) "Q3ASM $@"
2457	$(Q)$(Q3ASM) -o $@ $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm
2458
2459
2460#############################################################################
2461## BASEQ3 UI
2462#############################################################################
2463
2464Q3UIOBJ_ = \
2465  $(B)/$(BASEGAME)/ui/ui_main.o \
2466  $(B)/$(BASEGAME)/ui/ui_atoms.o \
2467  $(B)/$(BASEGAME)/ui/ui_gameinfo.o \
2468  $(B)/$(BASEGAME)/ui/ui_players.o \
2469  $(B)/$(BASEGAME)/ui/ui_shared.o \
2470  \
2471  $(B)/$(BASEGAME)/ui/bg_misc.o \
2472  $(B)/$(BASEGAME)/ui/bg_lib.o \
2473  \
2474  $(B)/$(BASEGAME)/qcommon/q_math.o \
2475  $(B)/$(BASEGAME)/qcommon/q_shared.o
2476
2477Q3UIOBJ = $(Q3UIOBJ_) $(B)/$(BASEGAME)/ui/ui_syscalls.o
2478Q3UIVMOBJ = $(Q3UIOBJ_:%.o=%.asm)
2479
2480ifdef MINGW
2481$(B)/$(BASEGAME)/ui_sp_$(SHLIBNAME): $(Q3UIOBJ)
2482	$(echo_cmd) "LD $@"
2483	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3UIOBJ)
2484else
2485$(B)/$(BASEGAME)/ui.sp.$(SHLIBNAME): $(Q3UIOBJ)
2486	$(echo_cmd) "LD $@"
2487	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3UIOBJ)
2488endif
2489$(B)/$(BASEGAME)/vm/ui.sp.qvm: $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm $(Q3ASM)
2490	$(echo_cmd) "Q3ASM $@"
2491	$(Q)$(Q3ASM) -o $@ $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm
2492
2493
2494#############################################################################
2495## CLIENT/SERVER RULES
2496#############################################################################
2497
2498$(B)/client/%.o: $(ASMDIR)/%.s
2499	$(DO_AS)
2500
2501# k8 so inline assembler knows about SSE
2502$(B)/client/%.o: $(ASMDIR)/%.c
2503	$(DO_CC) -march=k8
2504
2505$(B)/client/snd_altivec.o: $(CDIR)/snd_altivec.c
2506	$(DO_CC_ALTIVEC)
2507
2508$(B)/client/%.o: $(CDIR)/%.c
2509	$(DO_CC)
2510
2511$(B)/client/%.o: $(SDIR)/%.c
2512	$(DO_CC)
2513
2514$(B)/client/%.o: $(CMDIR)/%.c
2515	$(DO_CC)
2516
2517$(B)/client/%.o: $(BLIBDIR)/%.c
2518	$(DO_BOT_CC)
2519
2520$(B)/client/%.o: $(OGGDIR)/src/%.c
2521	$(DO_CC)
2522
2523$(B)/client/vorbis/%.o: $(VORBISDIR)/lib/%.c
2524	$(DO_CC)
2525
2526$(B)/client/opus/%.o: $(OPUSDIR)/src/%.c
2527	$(DO_CC)
2528
2529$(B)/client/opus/%.o: $(OPUSDIR)/celt/%.c
2530	$(DO_CC)
2531
2532$(B)/client/opus/%.o: $(OPUSDIR)/silk/%.c
2533	$(DO_CC)
2534
2535$(B)/client/opus/%.o: $(OPUSDIR)/silk/float/%.c
2536	$(DO_CC)
2537
2538$(B)/client/%.o: $(OPUSFILEDIR)/src/%.c
2539	$(DO_CC)
2540
2541$(B)/client/%.o: $(ZDIR)/%.c
2542	$(DO_CC)
2543
2544$(B)/client/%.o: $(SDLDIR)/%.c
2545	$(DO_CC)
2546
2547$(B)/client/%.o: $(SYSDIR)/%.c
2548	$(DO_CC)
2549
2550$(B)/client/%.o: $(SYSDIR)/%.m
2551	$(DO_CC)
2552
2553$(B)/client/win_resource.o: $(SYSDIR)/win_resource.rc $(SYSDIR)/win_manifest.xml
2554	$(DO_WINDRES)
2555
2556$(B)/splines/%.o: $(SPLDIR)/%.cpp
2557	$(DO_SPLINE_CXX)
2558
2559$(B)/renderer/%.o: $(CMDIR)/%.c
2560	$(DO_REF_CC)
2561
2562$(B)/renderer/%.o: $(SDLDIR)/%.c
2563	$(DO_REF_CC)
2564
2565$(B)/renderer/%.o: $(JPDIR)/%.c
2566	$(DO_REF_CC)
2567
2568$(B)/renderer/%.o: $(RDIR)/%.c
2569	$(DO_REF_CC)
2570
2571$(B)/renderer/tr_altivec.o: $(RDIR)/tr_altivec.c
2572	$(DO_REF_CC_ALTIVEC)
2573
2574$(B)/rend2/glsl/%.c: $(R2DIR)/glsl/%.glsl
2575	$(DO_REF_STR)
2576
2577$(B)/rend2/glsl/%.o: $(B)/rend2/glsl/%.c
2578	$(DO_REF_CC)
2579
2580$(B)/rend2/%.o: $(R2DIR)/%.c
2581	$(DO_REF_CC)
2582
2583$(B)/renderer/%.o: $(FTDIR)/src/autofit/%.c
2584	$(DO_REF_CC)
2585
2586$(B)/renderer/%.o: $(FTDIR)/src/base/%.c
2587	$(DO_REF_CC)
2588
2589$(B)/renderer/%.o: $(FTDIR)/src/bdf/%.c
2590	$(DO_REF_CC)
2591
2592$(B)/renderer/%.o: $(FTDIR)/src/bzip2/%.c
2593	$(DO_REF_CC)
2594
2595$(B)/renderer/%.o: $(FTDIR)/src/cache/%.c
2596	$(DO_REF_CC)
2597
2598$(B)/renderer/%.o: $(FTDIR)/src/cff/%.c
2599	$(DO_REF_CC)
2600
2601$(B)/renderer/%.o: $(FTDIR)/src/cid/%.c
2602	$(DO_REF_CC)
2603
2604$(B)/renderer/%.o: $(FTDIR)/src/gxvalid/%.c
2605	$(DO_REF_CC)
2606
2607$(B)/renderer/%.o: $(FTDIR)/src/gzip/%.c
2608	$(DO_REF_CC)
2609
2610$(B)/renderer/%.o: $(FTDIR)/src/lzw/%.c
2611	$(DO_REF_CC)
2612
2613$(B)/renderer/%.o: $(FTDIR)/src/otvalid/%.c
2614	$(DO_REF_CC)
2615
2616$(B)/renderer/%.o: $(FTDIR)/src/pcf/%.c
2617	$(DO_REF_CC)
2618
2619$(B)/renderer/%.o: $(FTDIR)/src/pfr/%.c
2620	$(DO_REF_CC)
2621
2622$(B)/renderer/%.o: $(FTDIR)/src/psaux/%.c
2623	$(DO_REF_CC)
2624
2625$(B)/renderer/%.o: $(FTDIR)/src/pshinter/%.c
2626	$(DO_REF_CC)
2627
2628$(B)/renderer/%.o: $(FTDIR)/src/psnames/%.c
2629	$(DO_REF_CC)
2630
2631$(B)/renderer/%.o: $(FTDIR)/src/raster/%.c
2632	$(DO_REF_CC)
2633
2634$(B)/renderer/%.o: $(FTDIR)/src/sfnt/%.c
2635	$(DO_REF_CC)
2636
2637$(B)/renderer/%.o: $(FTDIR)/src/smooth/%.c
2638	$(DO_REF_CC)
2639
2640$(B)/renderer/%.o: $(FTDIR)/src/tools/%.c
2641	$(DO_REF_CC)
2642
2643$(B)/renderer/%.o: $(FTDIR)/src/truetype/%.c
2644	$(DO_REF_CC)
2645
2646$(B)/renderer/%.o: $(FTDIR)/src/type1/%.c
2647	$(DO_REF_CC)
2648
2649$(B)/renderer/%.o: $(FTDIR)/src/type42/%.c
2650	$(DO_REF_CC)
2651
2652$(B)/renderer/%.o: $(FTDIR)/src/winfonts/%.c
2653	$(DO_REF_CC)
2654
2655$(B)/ded/%.o: $(ASMDIR)/%.s
2656	$(DO_AS)
2657
2658# k8 so inline assembler knows about SSE
2659$(B)/ded/%.o: $(ASMDIR)/%.c
2660	$(DO_CC) -march=k8
2661
2662$(B)/ded/%.o: $(SDIR)/%.c
2663	$(DO_DED_CC)
2664
2665$(B)/ded/%.o: $(CMDIR)/%.c
2666	$(DO_DED_CC)
2667
2668$(B)/ded/%.o: $(ZDIR)/%.c
2669	$(DO_DED_CC)
2670
2671$(B)/ded/%.o: $(BLIBDIR)/%.c
2672	$(DO_BOT_CC)
2673
2674$(B)/ded/%.o: $(SYSDIR)/%.c
2675	$(DO_DED_CC)
2676
2677$(B)/ded/%.o: $(SYSDIR)/%.m
2678	$(DO_DED_CC)
2679
2680$(B)/ded/win_resource.o: $(SYSDIR)/win_resource.rc $(SYSDIR)/win_manifest.xml
2681	$(DO_WINDRES)
2682
2683$(B)/ded/%.o: $(NDIR)/%.c
2684	$(DO_DED_CC)
2685
2686#############################################################################
2687## GAME MODULE RULES
2688#############################################################################
2689
2690$(B)/$(BASEGAME)/cgame/bg_%.o: $(GDIR)/bg_%.c
2691	$(DO_CGAME_CC)
2692
2693$(B)/$(BASEGAME)/cgame/%.o: $(CGDIR)/%.c
2694	$(DO_CGAME_CC)
2695
2696$(B)/$(BASEGAME)/cgame/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC)
2697	$(DO_CGAME_Q3LCC)
2698
2699$(B)/$(BASEGAME)/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC)
2700	$(DO_CGAME_Q3LCC)
2701
2702$(B)/$(BASEGAME)/game/%.o: $(GDIR)/%.c
2703	$(DO_GAME_CC)
2704
2705$(B)/$(BASEGAME)/game/%.asm: $(GDIR)/%.c $(Q3LCC)
2706	$(DO_GAME_Q3LCC)
2707
2708$(B)/$(BASEGAME)/ui/bg_%.o: $(GDIR)/bg_%.c
2709	$(DO_UI_CC)
2710
2711$(B)/$(BASEGAME)/ui/%.o: $(UIDIR)/%.c
2712	$(DO_UI_CC)
2713
2714$(B)/$(BASEGAME)/ui/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC)
2715	$(DO_UI_Q3LCC)
2716
2717$(B)/$(BASEGAME)/ui/%.asm: $(UIDIR)/%.c $(Q3LCC)
2718	$(DO_UI_Q3LCC)
2719
2720$(B)/$(BASEGAME)/qcommon/%.o: $(CMDIR)/%.c
2721	$(DO_SHLIB_CC)
2722
2723$(B)/$(BASEGAME)/qcommon/%.asm: $(CMDIR)/%.c $(Q3LCC)
2724	$(DO_Q3LCC)
2725
2726
2727#############################################################################
2728# MISC
2729#############################################################################
2730
2731OBJ = $(Q3OBJ) $(Q3ROBJ) $(Q3R2OBJ) $(Q3DOBJ) $(JPGOBJ) $(FTOBJ) \
2732  $(Q3GOBJ) $(Q3CGOBJ) $(Q3UIOBJ) \
2733  $(Q3GVMOBJ) $(Q3CGVMOBJ) $(Q3UIVMOBJ)
2734TOOLSOBJ = $(LBURGOBJ) $(Q3CPPOBJ) $(Q3RCCOBJ) $(Q3LCCOBJ) $(Q3ASMOBJ)
2735STRINGOBJ = $(Q3R2STRINGOBJ)
2736
2737copyfiles: release
2738	@if [ ! -d $(COPYDIR)/$(BASEGAME) ]; then echo "You need to set COPYDIR to where your RTCW data is!"; fi
2739ifneq ($(BUILD_GAME_SO),0)
2740  ifneq ($(BUILD_BASEGAME),0)
2741	-$(MKDIR) -m 0755 $(COPYDIR)/$(BASEGAME)
2742  endif
2743endif
2744
2745ifneq ($(BUILD_CLIENT),0)
2746	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN)$(FULLBINEXT) $(COPYBINDIR)/$(CLIENTBIN)$(FULLBINEXT)
2747  ifneq ($(USE_RENDERER_DLOPEN),0)
2748	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/renderer_sp_opengl1_$(SHLIBNAME) $(COPYBINDIR)/renderer_sp_opengl1_$(SHLIBNAME)
2749    ifneq ($(BUILD_RENDERER_REND2),0)
2750	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/renderer_sp_rend2_$(SHLIBNAME) $(COPYBINDIR)/renderer_sp_rend2_$(SHLIBNAME)
2751    endif
2752  else
2753    ifneq ($(BUILD_RENDERER_REND2),0)
2754	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN)_rend2$(FULLBINEXT) $(COPYBINDIR)/$(CLIENTBIN)_rend2$(FULLBINEXT)
2755    endif
2756  endif
2757endif
2758
2759ifneq ($(BUILD_SERVER),0)
2760	@if [ -f $(BR)/$(SERVERBIN)$(FULLBINEXT) ]; then \
2761		$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(SERVERBIN)$(FULLBINEXT) $(COPYBINDIR)/$(SERVERBIN)$(FULLBINEXT); \
2762	fi
2763endif
2764
2765ifneq ($(BUILD_GAME_SO),0)
2766  ifneq ($(BUILD_BASEGAME),0)
2767	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(BASEGAME)/cgame.sp.$(SHLIBNAME) \
2768                                        $(COPYDIR)/$(BASEGAME)/.
2769	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(BASEGAME)/qagame.sp.$(SHLIBNAME) \
2770                                        $(COPYDIR)/$(BASEGAME)/.
2771	$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(BASEGAME)/ui.sp.$(SHLIBNAME) \
2772                                        $(COPYDIR)/$(BASEGAME)/.
2773  endif
2774endif
2775
2776clean: clean-debug clean-release
2777
2778clean-debug:
2779	@$(MAKE) clean2 B=$(BD)
2780
2781clean-release:
2782	@$(MAKE) clean2 B=$(BR)
2783
2784clean2:
2785	@echo "CLEAN $(B)"
2786	@rm -f $(OBJ)
2787	@rm -f $(OBJ_D_FILES)
2788	@rm -f $(STRINGOBJ)
2789	@rm -f $(TARGETS)
2790
2791toolsclean: toolsclean-debug toolsclean-release
2792
2793toolsclean-debug:
2794	@$(MAKE) toolsclean2 B=$(BD)
2795
2796toolsclean-release:
2797	@$(MAKE) toolsclean2 B=$(BR)
2798
2799toolsclean2:
2800	@echo "TOOLS_CLEAN $(B)"
2801	@rm -f $(TOOLSOBJ)
2802	@rm -f $(TOOLSOBJ_D_FILES)
2803	@rm -f $(LBURG) $(DAGCHECK_C) $(Q3RCC) $(Q3CPP) $(Q3LCC) $(Q3ASM)
2804
2805distclean: clean toolsclean
2806	@rm -rf $(BUILD_DIR)
2807
2808dist:
2809	git archive --format zip --output $(CLIENTBIN)-$(VERSION).zip HEAD
2810
2811#############################################################################
2812# DEPENDENCIES
2813#############################################################################
2814
2815ifneq ($(B),)
2816  OBJ_D_FILES=$(filter %.d,$(OBJ:%.o=%.d))
2817  TOOLSOBJ_D_FILES=$(filter %.d,$(TOOLSOBJ:%.o=%.d))
2818  -include $(OBJ_D_FILES) $(TOOLSOBJ_D_FILES)
2819endif
2820
2821.PHONY: all clean clean2 clean-debug clean-release copyfiles \
2822	debug default dist distclean makedirs \
2823	release targets \
2824	toolsclean toolsclean2 toolsclean-debug toolsclean-release \
2825	$(OBJ_D_FILES) $(TOOLSOBJ_D_FILES)
2826
2827# If the target name contains "clean", don't do a parallel build
2828ifneq ($(findstring clean, $(MAKECMDGOALS)),)
2829.NOTPARALLEL:
2830endif
2831