-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMakefile.sub
More file actions
444 lines (361 loc) · 11.1 KB
/
Makefile.sub
File metadata and controls
444 lines (361 loc) · 11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
#########################
# Unvanquished Makefile #
#########################
#############################################################################
# CONFIGURATION
#
# If you require a different configuration from the defaults below, create a
# new file named "Makefile.local" in the same directory as this file and define
# your parameters there. This allows you to change configuration without
# causing problems with keeping up to date with the repository.
#############################################################################
-include Makefile.local
ifeq ($(TARGET), server)
USE_CURSES ?= 1
else
USE_CURSES ?= 0
endif
# Only used on x86 and x86_64
USE_SSE ?= 2
# Only used on ppc32
USE_ALTIVEC ?= 1
# Whether to build a dll
BUILD_DLL = 0
ifeq ($(TARGET), game)
BUILD_DLL = 1
endif
#############################################################################
# VERSION
#############################################################################
VERSION_NUMBER = 0.0.0
# For svn
ifeq ($(wildcard .svn), .svn)
SVN_REV = $(shell LANG=C svnversion .)
ifneq ($(SVN_REV), )
VERSION = $(VERSION_NUMBER)_$(SVN_REV)
VERSION_DEP = .svn/entries
endif
# For git-svn
else ifeq ($(wildcard .git/svn/.metadata), .git/svn/.metadata)
GITSVN_REV = $(shell LANG=C git svn info | awk '$$1 == "Revision:" {print $$2; exit 0}')
ifneq ($(GITSVN_REV), )
VERSION = $(VERSION_NUMBER)_$(GITSVN_REV)
VERSION_DEP = .git/svn/.metadata
endif
# For git
else ifeq ($(wildcard .git), .git)
GIT_REV = $(shell LANG=C git show-ref -h -s --abbrev | head -n1)
ifneq ($(GIT_REV), )
VERSION = $(VERSION_NUMBER)_$(GIT_REV)
VERSION_DEP = .git/index
endif
# For hg
else ifeq ($(wildcard .hg), .hg)
HG_REV = $(shell LANG=C hg id -n)
ifneq ($(HG_REV), )
VERSION = $(VERSION_NUMBER)_$(HG_REV)
VERSION_DEP = .hg/dirstate
endif
# For other
else
VERSION = $(VERSION_NUMBER)
VERSION_DEP =
endif
#############################################################################
# LIBRARIES
#
# Override these if not using the system default
#############################################################################
pkgconfig_cflags = $(shell if ! pkg-config --cflags $(1) 2> /dev/null; then echo "$(2)"; fi)
pkgconfig_cflags2 = $(shell if ! pkg-config --cflags $(1) 2> /dev/null; then if which $(2) 2> /dev/null; then $(2) --cflags 2> /dev/null; else echo "$(3)" fi; fi)
pkgconfig_libs = $(shell if ! pkg-config --libs $(1) 2> /dev/null; then echo "$(2)"; fi)
pkgconfig_libs2 = $(shell if ! pkg-config --libs $(1) 2> /dev/null; then if which $(2) 2> /dev/null; then $(2) 2> /dev/null; else echo "$(3)"; fi; fi)
# SDL
SDL_CFLAGS ?= $(call pkgconfig_cflags2, sdl-config, sdl, )
SDL_LIBS ?= $(call pkgconfig_libs2, sdl-config, sdl, -lSDL)
# OpenGL
GL_CFLAGS ?= $(call pkgconfig_cflags, gl)
GL_LIBS ?= $(call pkgconfig_libs, gl, -lGL)
# wxWidgets
WX_CFLAGS ?= $(shell wx-config --cxxflags)
WX_LIBS ?= $(shell wx-config --libs --gl-libs)
# NCurses
CURSES_CFLAGS ?=
CURSES_LIBS ?= -lncurses
# Boost test
BOOST_TEST_CFLAGS ?=
BOOST_TEST_LIBS ?= -static -lboost_unit_test_framework
#############################################################################
# COMPILE FLAGS
#############################################################################
CFLAGS += -std=gnu++11 -Wall -Wextra -pipe -g3 -fno-common
DFLAGS += -D_GNU_SOURCE -DNDEBUG
LDFLAGS += -Wl,--warn-common -Wl,--as-needed
# So "#include <Main.h>" will pick up the precompiled header
DFLAGS += -I $(B)
# Include externals, treat them as system headers to quiet warnings
DFLAGS += -isystem externals
# Set default symbol visibility to hidden, not applicable to win32
ifneq ($(PLATFORM), mingw32)
CFLAGS += -fvisibility=hidden
endif
# Target-specific flags
ifeq ($(TARGET), engine)
DFLAGS += -DBUILD_ENGINE
else ifeq ($(TARGET), game)
DFLAGS += -DBUILD_GAME
else ifeq ($(TARGET), server)
DFLAGS += -DBUILD_SERVER
else ifeq ($(TARGET), editor)
DFLAGS += -DBUILD_EDITOR
else ifeq ($(TARGET), test)
DFLAGS += -DBUILD_TEST
endif
ifeq ($(BUILD_MODULE), 1)
DFLAGS += -DBUILD_MODULE
endif
# Architecture-specific flags
ifeq ($(ARCH), x86_64)
ifeq ($(USE_SSE), 3)
CFLAGS += -march=nocona -msse3 -mtune=generic -mfpmath=sse -m64 -mcx16
else
CFLAGS += -msse2 -mtune=generic -mfpmath=sse -m64 -mcx16
endif
else ifeq ($(ARCH), x86)
ifeq ($(USE_SSE), 3)
CFLAGS += -march=prescott -msse3 -mtune=generic -mfpmath=sse -m32
else ifeq ($(USE_SSE), 2)
CFLAGS += -march=pentium4 -msse2 -mtune=generic -mfpmath=sse -m32
else ifeq ($(USE_SSE), 1)
CFLAGS += -march=pentium3 -msse -mtune=generic -mfpmath=sse -m32
else
CFLAGS += -march=pentium -mtune=generic -mfpmath=387 -m32
endif
else ifeq ($(ARCH), ppc)
ifeq ($(USE_ALTIVEC), 1)
CFLAGS += -mcpu=G4 -maltivec -m32
else
CFLAGS += -mcpu=G3 -m32
endif
else ifeq ($(ARCH), ppc64)
CFLAGS += -mcpu=G5 -maltivec -m64
else ifeq ($(ARCH), sparc)
CFLAGS += -mcpu=ultrasparc -mtune=ultrasparc3 -mv8plus
endif
# Special options for shlibs on ELF systems
ifeq ($(BUILD_MODULE), 1)
ifneq ($(PLATFORM), mingw32)
ifneq ($(PLATFORM), darwin)
ifneq ($(ARCH), x86)
CFLAGS += -fpic
endif
LDFLAGS += -Wl,-Bsymbolic
endif
endif
endif
# Optimization control
ifeq ($(DEBUG), 1)
CFLAGS += -O0 -ffast-math -fstrict-aliasing
DFLAGS += -DDEBUG
else
CFLAGS += -O3 -fomit-frame-pointer -ffast-math
endif
#############################################################################
# LIBRARY FLAGS
#############################################################################
# Curses console
ifneq ($(BUILD_MODULE), 1)
ifeq ($(USE_CURSES), 1)
DFLAGS += -DUSE_CURSES
CFLAGS += $(CURSES_CFLAGS)
LDFLAGS += $(CURSES_LIBS)
endif
endif
# Engine libs
ifeq ($(TARGET), game)
CFLAGS += $(SDL_CFLAGS) $(GL_CFLAGS)
LDFLAGS += $(SDL_LIBS) $(GL_LIBS)
endif
# Editor libs
ifeq ($(TARGET), editor)
CFLAGS += $(WX_CFLAGS) $(GL_CFLAGS)
LDFLAGS += $(WX_LIBS) $(GL_LIBS)
endif
# Test libs
ifeq ($(TARGET), test)
CFLAGS += $(BOOST_TEST_CFLAGS)
LDFLAGS += $(BOOST_TEST_LIBS)
endif
#############################################################################
# MISC
#############################################################################
LD = $(CXX)
MKDIR = mkdir -p
# Only used on win32 for the app icon
WINDRES ?= windres
# Build dir
B = $(BUILD_DIR)/$(TARGET)
# Verbosity
V ?= 0
ifeq ($(V), 1)
export echo_cmd = @:
export Q =
else
export echo_cmd = @echo
export Q = @
endif
#############################################################################
# PLATFORM-SPECIFIC SETUP
#############################################################################
# Linux
ifeq ($(PLATFORM), linux)
BINEXT =
DLLEXT = .so
ifeq ($(BUILD_MODULE), 1)
LDFLAGS += -shared
endif
CFLAGS += -pthread
LDFLAGS += -ldl -lm -lrt -pthread
# Mac OS X
else ifeq ($(PLATFORM), darwin)
BINEXT =
DLLEXT = .dylib
ifeq ($(BUILD_MODULE), 1)
LDFLAGS += -dynamiclib
else
CFLAGS += -mdynamic-no-pic
endif
# Windows (MinGW)
else ifeq ($(PLATFORM), mingw32)
BINEXT = .exe
DLLEXT = .dll
CFLAGS += -mms-bitfields
LDFLAGS += -lws2_32 -lwinmm
ifeq ($(BUILD_MODULE), 1)
LDFLAGS += -shared
endif
# libmingw32 must be linked in before libSDLmain
ifeq ($(TARGET), game)
LDFLAGS := -mwindows -lmingw32 $(LDFLAGS)
else ifeq ($(TARGET), editor)
LDFLAGS += -mwindows
endif
# *BSD
else ifneq ($(findstring $(PLATFORM), bsd), )
BINEXT =
DLLEXT = .so
ifeq ($(BUILD_MODULE), 1)
LDFLAGS += -shared
endif
CFLAGS += -pthread
LDFLAGS += -lm -pthread
endif
#############################################################################
# SOURCE FILES
#############################################################################
CORE_SRC = \
src/Core/Thread/ThreadPool.cpp \
src/Core/Command.cpp \
src/Core/Console.cpp \
src/Core/Cvar.cpp \
src/Core/Filesystem/Filesystem.cpp \
src/Core/Init.cpp \
src/Core/Log.cpp \
src/Core/Memory/Memory.cpp \
src/Core/Memory/Pool.cpp \
src/Core/Memory/Virtual.cpp \
src/Core/Print.cpp \
src/Core/Random.cpp \
src/Core/Terminal.cpp \
src/Core/Unix.cpp \
src/Core/Win32.cpp
SERVER_SRC = \
src/Server/Server.cpp
EDITOR_SRC = \
src/Editor/Editor.cpp \
src/Editor/MainWindow.cpp \
src/Editor/RenderCanvas.cpp
TEST_SRC = \
src/Test/Geometry.cpp \
src/Test/Math.cpp \
src/Test/Test.cpp \
src/Test/Vector.cpp
#############################################################################
# MAIN TARGET
#############################################################################
ifeq ($(TARGET), server)
OBJS = $(CORE_SRC) $(SERVER_SRC)
else ifeq ($(TARGET), editor)
OBJS = $(CORE_SRC) $(EDITOR_SRC)
else ifeq ($(TARGET), test)
OBJS = $(TEST_SRC)
endif
# Get the output filenames
OBJS := $(addsuffix .o, $(addprefix $(B)/, $(basename $(OBJS))))
# Run tests after compiling
ifeq ($(TARGET), test)
.PHONY: test
test: $(B)/test$(BINEXT)
@-$(B)/test$(BINEXT) -l message
endif
$(B)/$(TARGET)$(BINEXT): $(OBJS)
$(echo_cmd) "LD $@"
@$(MKDIR) $(dir $@)
$(Q)$(LD) -o $@ $(OBJS) $(CFLAGS) $(LDFLAGS)
#############################################################################
# CONFIG.H
#############################################################################
$(B)/Config.h: config.sh
$(echo_cmd) "CONFIG Config.h"
@$(MKDIR) $(dir $@)
$(Q)sh config.sh $(CXX) $(CFLAGS) $(DFLAGS) $(LDFLAGS) > $@
#############################################################################
# PRECOMPILED HEADER
#############################################################################
$(OBJS): $(B)/Main.h.gch
$(B)/Main.h.gch: src/Main.h $(B)/Config.h
$(echo_cmd) "PCH Main.h"
@$(MKDIR) $(dir $@)
$(Q)$(CXX) -x c++-header -MMD -MP -MT $@ -MF $(B)/Main.h.d $(CFLAGS) $(DFLAGS) -o $@ -c $<
# Check that the precompiled header is still valid
ifneq ($(shell B=$(B) sh pchtest.sh $(CFLAGS) $(DFLAGS)), 0)
.PHONY: $(B)/Main.h.gch
endif
#############################################################################
# COMPILE COMMANDS
#############################################################################
define DO_CXX
$(echo_cmd) "CXX $<"
@$(MKDIR) $(dir $@)
$(Q)$(CXX) -MMD -MP -DVERSION=\"$(VERSION)\" -include $(B)/Main.h $(DFLAGS) $(CFLAGS) -o $@ -c $<
endef
define DO_WINDRES
$(echo_cmd) "WINDRES $<"
@$(MKDIR) $(dir $@)
$(Q)$(WINDRES) -DVERSION=\"$(VERSION)\" $(DFLAGS) -i $< -o $@
endef
#############################################################################
# BUILD RULES
#############################################################################
$(B)/src/Core/%.o: src/Core/%.cpp
$(DO_CXX)
$(B)/src/Core/Math/%.o: src/Core/Math/%.cpp
$(DO_CXX)
$(B)/src/Core/Mem/%.o: src/Core/Mem/%.cpp
$(DO_CXX)
$(B)/src/Core/Thread/%.o: src/Core/Thread/%.cpp
$(DO_CXX)
$(B)/src/Server/%.o: src/Server/%.cpp
$(DO_CXX)
$(B)/src/Editor/%.o: src/Editor/%.cpp
$(DO_CXX)
$(B)/src/Test/%.o: src/Test/%.cpp
$(DO_CXX)
#############################################################################
# DEPENDENCIES
#############################################################################
OBJS_D = $(filter %.d, $(OBJS:%.o=%.d)) $(B)/Main.h.d
-include $(OBJS_D)
# Make stuff depend on version
$(B)/src/Core/Init.o: $(VERSION_DEP)
.PHONY: $(OBJS_D)