1# Invalid call detection
2CHECKLEVEL1 = @
if [
"$(LEVEL)" != 1 ]; then
$(MAKE) help;
false; fi
3CHECKLEVEL2 = @
if [
"$(LEVEL)" != 2 ]; then
$(MAKE) help;
false; fi
11OBJ_SND_COMMON=snd_main.o snd_mem.o snd_mix.o snd_ogg.o snd_wav.o
$(OBJ_SND_XMP)
14OBJ_SND_NULL=snd_null.o
17###### Common objects and flags #####
76 mod_skeletal_animatevertices_sse.o \
77 mod_skeletal_animatevertices_generic.o \
126# note that builddate.c is very intentionally not compiled to a .o before
127# being linked, because it should be recompiled every time an executable is
128# built to give the executable a proper date string
129OBJ_SV= builddate.c sys_null.o vid_null.o thread_null.o
$(OBJ_SND_NULL)
$(OBJ_COMMON)
130OBJ_SDL= builddate.c sys_sdl.o vid_sdl.o thread_sdl.o
$(OBJ_MENU)
$(OBJ_SND_COMMON)
$(OBJ_SND_XMP) snd_sdl.o
$(OBJ_VIDEO_CAPTURE)
$(OBJ_COMMON)
131OBJ_WASM= builddate.c sys_wasm.o vid_sdl.o thread_sdl.o
$(OBJ_MENU)
$(OBJ_SND_COMMON)
$(OBJ_SND_XMP) snd_sdl.o
$(OBJ_VIDEO_CAPTURE)
$(OBJ_COMMON)
134# -D_POSIX_C_SOURCE=200809L doesn't enable all of POSIX 2008, wtf?
135# -D_DEFAULT_SOURCE does enables all of POSIX 2008 (without GNU extensions).
137 CFLAGS_STANDARD=-std=c17 -pedantic -D_DEFAULT_SOURCE -DCONFIG_PEDANTIC
142CFLAGS_WARNINGS=-Wall -Werror=vla -Wc++-compat -Wwrite-strings -Wshadow -Wold-
style-definition -Wstrict-prototypes -Wsign-compare -Wdeclaration-after-statement -Wmissing-prototypes
146 CFLAGS_TCC=-DSDL_DISABLE_IMMINTRIN_H
151CFLAGS_COMMON=
$(CFLAGS_STANDARD)
$(CFLAGS_TCC)
$(CFLAGS_MAKEDEP)
$(CFLAGS_PRELOAD)
$(CFLAGS_FS)
$(CFLAGS_WARNINGS)
$(CFLAGS_LIBZ)
$(CFLAGS_LIBJPEG)
$(CFLAGS_SND_XMP)
$(CFLAGS_NET)
$(CFLAGS_SDL) -D_FILE_OFFSET_BITS=64 -D__KERNEL_STRICT_NAMES -I../../../
152CFLAGS_CLIENT=-DCONFIG_MENU
$(CFLAGS_VIDEO_CAPTURE)
155CFLAGS_PROFILE=-
g -pg -ggdb -fprofile-arcs
157CFLAGS_RELEASE_PROFILE=-fbranch-probabilities
166endif
# ifeq ($(DP_SSE),1)
172 CPUOPTIMIZATIONS+=-mno-avx
174# bones_was_here: added -mno-avx because when compiling for (at least) haswell or skylake with gcc or clang, with both -O2 and -O3, AVX auto-vectorisation causes subtle bugs in Xonotic QC physics, and changes the hash generated by the CI pipeline. AVX2 seems to be OK.
176# We can get good stack traces at -O1 with -fno-omit-frame-pointer (as recommended by ASan docs) for a hefty boost compared to unoptimised.
178#OPTIM_RELEASE=-O2 -fno-strict-aliasing -ffast-math -funroll-loops $(CPUOPTIMIZATIONS)
179#OPTIM_RELEASE=-O2 -fno-strict-aliasing -fno-math-errno -fno-trapping-math -fno-signaling-nans -fcx-limited-range -funroll-loops $(CPUOPTIMIZATIONS)
180#OPTIM_RELEASE=-O2 -fno-strict-aliasing -funroll-loops $(CPUOPTIMIZATIONS)
181#OPTIM_RELEASE=-O2 -fno-strict-aliasing $(CPUOPTIMIZATIONS)
182#OPTIM_RELEASE=-O3 -fno-strict-aliasing $(CPUOPTIMIZATIONS)
183#OPTIM_RELEASE=-O3 -fno-strict-aliasing -fno-math-errno -fno-trapping-math $(CPUOPTIMIZATIONS)
184# -Winline is here instead of in CFLAGS_WARNINGS because we need inlining disabled for good stack traces in debug builds,
185# also because UBSan and ASan cause this warning to be spammed.
186OPTIM_RELEASE=-O3 -fno-math-errno -fno-trapping-math
$(CPUOPTIMIZATIONS) -Winline
187# NOTE: *never* *ever* use the -ffast-math or -funsafe-math-optimizations flag
188# Also, since gcc 5, -ffinite-math-only makes NaN and zero compare equal inside engine code but not inside QC, which causes error spam for seemingly valid QC code like if (x != 0) return 1 / x;
190DO_CC=
$(CC)
$(CFLAGS) -c
$< -o
$@
195# not checking for .git directory before running `git describe` because that would stop it working in a subdirectory
196VCREVISION=
$(shell { test -d .svn && svnversion; } || git describe --always --dirty=
'~' 2>/dev/null || echo -)
198LDFLAGS_DEBUG=-
g -ggdb
$(OPTIM_DEBUG) -DVCREVISION=
$(VCREVISION) -DBUILDTYPE=debug
199LDFLAGS_PROFILE=-
g -pg -fprofile-arcs
$(OPTIM_RELEASE) -DVCREVISION=
$(VCREVISION) -DBUILDTYPE=profile
200LDFLAGS_RELEASE=
$(OPTIM_RELEASE) -DVCREVISION=
$(VCREVISION) -DBUILDTYPE=release
203##### UNIX specific variables #####
205LDFLAGS_UNIXCOMMON=-lm
$(LIB_ODE)
$(LIB_Z)
$(LIB_JPEG)
$(LIB_CRYPTO)
$(LIB_CRYPTO_RIJNDAEL)
$(LIB_SND_XMP)
206LDFLAGS_UNIXSV_PRELOAD=-lz -ljpeg -lpng -lcurl
207LDFLAGS_UNIXSDL_PRELOAD=-lz -ljpeg -lpng -logg -ltheora -lvorbis -lvorbisenc -lvorbisfile -lcurl -lxmp
208CFLAGS_UNIX_PRELOAD=-DPREFER_PRELOAD
210LDFLAGS_UNIXSDL=
$(SDL_LIBS)
#-lGLESv2
211EXE_UNIXSV=darkplaces-dedicated
212EXE_UNIXSDL=darkplaces-sdl
213EXE_UNIXSVNEXUIZ=nexuiz-dedicated
214EXE_UNIXSDLNEXUIZ=nexuiz-sdl
215EXE_WASMJS=darkplaces-wasm.js
216EXE_WASM=darkplaces-wasm.html
220CMD_UNIXMKDIR=mkdir -p
223##### Linux specific variables #####
226# -rdynamic allows glibc backtrace_symbols_fd() to convert addresses to function names
227# with a much smaller binary than with full debug symbols
228LDFLAGS_LINUXSV=
$(LDFLAGS_UNIXCOMMON) -lrt -ldl -rdynamic
229LDFLAGS_LINUXSDL=
$(LDFLAGS_UNIXCOMMON) -lrt -ldl -rdynamic
$(LDFLAGS_UNIXSDL)
232##### WASM specific variables #####
234LDFLAGS_WASMJS=
$(LDFLAGS_UNIXCOMMON) -s USE_SDL=2 \
238 -s INITIAL_MEMORY=128mb \
239 -s MAXIMUM_MEMORY=2gb \
242 -s MIN_WEBGL_VERSION=2 \
243 -s MAX_WEBGL_VERSION=2 \
244 -s ALLOW_MEMORY_GROWTH=1 \
249 --pre-js ../../../wasm/pre.js \
250 -s EXPORTED_RUNTIME_METHODS=callMain,addRunDependency,removeRunDependency
252LDFLAGS_WASM=
$(LDFLAGS_UNIXCOMMON) -s USE_SDL=2 \
256 -s INITIAL_MEMORY=128mb \
257 -s MAXIMUM_MEMORY=2gb \
260 -s MIN_WEBGL_VERSION=2 \
261 -s MAX_WEBGL_VERSION=2 \
262 -s ALLOW_MEMORY_GROWTH=1 \
267 --pre-js ../../../wasm/standaloneprejs.js \
268 -s EXPORTED_RUNTIME_METHODS=callMain,addRunDependency,removeRunDependency \
269 --shell-file ../../../wasm/standalone-shell.html \
270 --embed-file ../../../wasm/preload@/preload
273##### Mac OS X specific variables #####
276LDFLAGS_MACOSXSV=
$(LDFLAGS_UNIXCOMMON) -ldl
277LDFLAGS_MACOSXSDL=
$(LDFLAGS_UNIXCOMMON) -ldl -framework IOKit
$(SDLCONFIG_STATICLIBS)
#../../../SDLMain.m
280##### SunOS specific variables #####
282CFLAGS_SUNOS=-I/usr/lib/oss/include -DBSD_COMP -DSUNOS
285LDFLAGS_SUNOSSV=
$(LDFLAGS_UNIXCOMMON) -lrt -ldl -lsocket -lnsl
286LDFLAGS_SUNOSSDL=
$(LDFLAGS_UNIXCOMMON) -lrt -ldl -lsocket -lnsl
$(LDFLAGS_UNIXSDL)
289##### BSD specific variables #####
292LDFLAGS_BSDSV=
$(LDFLAGS_UNIXCOMMON)
293LDFLAGS_BSDSDL=
$(LDFLAGS_UNIXCOMMON)
$(LDFLAGS_UNIXSDL)
296##### Win32 specific variables #####
301# see LDFLAGS_WINCOMMON in makefile
302LDFLAGS_WINSV=
$(LDFLAGS_WINCOMMON)
$(LIB_CRYPTO)
$(LIB_CRYPTO_RIJNDAEL) -mconsole -lwinmm -lws2_32 -Wl,--stack=0x800000
$(LIB_Z)
$(LIB_JPEG)
303LDFLAGS_WINSDL=
$(LDFLAGS_WINCOMMON)
$(LIB_CRYPTO)
$(LIB_CRYPTO_RIJNDAEL)
$(LDFLAGS_UNIXSDL) -lwinmm -lws2_32 -Wl,--stack=0x800000
$(LIB_Z)
$(LIB_JPEG)
$(LIB_SND_XMP)
304EXE_WINSV=darkplaces-dedicated.exe
305EXE_WINSDL=darkplaces-sdl.exe
306EXE_WINSVNEXUIZ=nexuiz-dedicated.exe
307EXE_WINSDLNEXUIZ=nexuiz-sdl.exe
313.PHONY : clean clean-profile help \
314 debug profile release \
315 sv-debug
sv-profile
sv-release \
316 sdl-debug sdl-profile sdl-release emscripten-release
320 @echo
"===== Choose one ====="
321 @echo
"* $(MAKE) clean : delete all files produced by the build except"
322 @echo
" profiling information"
323 @echo
"* $(MAKE) clean-profile : delete all files produced by the build, including"
324 @echo
" profiling informaiton"
325 @echo
"* $(MAKE) help : this help"
326 @echo
"* $(MAKE) debug : make client and server binaries (debug versions)"
327 @echo
"* $(MAKE) profile : make client and server binaries (profile versions)"
328 @echo
"* $(MAKE) release : make client and server binaries (release versions)"
329 @echo
"* $(MAKE) release-profile : make client and server binaries (release versions)"
330 @echo
" (with profiling optimizations) The profiled"
331 @echo
" version of the program must have been"
332 @echo
" previously compiled"
333 @echo
"* $(MAKE) nexuiz : make client and server binaries with nexuiz icon"
334 @echo
" (release versions)"
335 @echo
"* $(MAKE) sv-debug : make dedicated server (debug version)"
336 @echo
"* $(MAKE) sv-profile : make dedicated server (profile version)"
337 @echo
"* $(MAKE) sv-release-profile : make dedicated server (release profile version)"
338 @echo
"* $(MAKE) sv-release : make dedicated server (release version)"
339 @echo
"* $(MAKE) sv-nexuiz : make dedicated server with nexuiz icon"
340 @echo
" (release version)"
341 @echo
"* $(MAKE) sdl-debug : make SDL client (debug version)"
342 @echo
"* $(MAKE) sdl-profile : make SDL client (profile version)"
343 @echo
"* $(MAKE) sdl-release-profile : make SDL client (release version)"
344 @echo
"* $(MAKE) sdl-release : make SDL client (release version)"
345 @echo
"* $(MAKE) sdl-nexuiz : make SDL client with nexuiz icon (release version)"
347 @echo
"* $(MAKE) emscripten-release : make WASM client (release version)"
348 @echo
"* $(MAKE) emscripten-standalone: make standalone WASM client (release version)"
352 $(MAKE)
$(TARGETS_DEBUG)
355 $(MAKE)
$(TARGETS_PROFILE)
358 $(MAKE)
$(TARGETS_RELEASE)
361 $(MAKE)
$(TARGETS_RELEASE_PROFILE)
364 $(MAKE)
$(TARGETS_NEXUIZ)
368 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
369 EXE=
'$(EXE_SV)' CFLAGS_FEATURES=
'$(CFLAGS_SERVER)' LDFLAGS_COMMON=
'$(LDFLAGS_SV)' LEVEL=1
372 $(MAKE) bin-profile \
373 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
374 EXE=
'$(EXE_SV)' CFLAGS_FEATURES=
'$(CFLAGS_SERVER)' LDFLAGS_COMMON=
'$(LDFLAGS_SV)' LEVEL=1
377 $(MAKE) bin-release \
378 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
379 EXE=
'$(EXE_SV)' CFLAGS_FEATURES=
'$(CFLAGS_SERVER)' LDFLAGS_COMMON=
'$(LDFLAGS_SV)' LEVEL=1
382 $(MAKE) bin-release-profile \
383 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
384 EXE=
'$(EXE_SV)' CFLAGS_FEATURES=
'$(CFLAGS_SERVER)' LDFLAGS_COMMON=
'$(LDFLAGS_SV)' LEVEL=1
387 $(MAKE) bin-release \
388 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
389 EXE=
'$(EXE_SVNEXUIZ)' CFLAGS_FEATURES=
'$(CFLAGS_SERVER)' LDFLAGS_COMMON=
'$(LDFLAGS_SV)' LEVEL=1
393 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
394 EXE=
'$(EXE_SDL)' CFLAGS_FEATURES=
'$(CFLAGS_CLIENT)' CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' LDFLAGS_COMMON=
'$(LDFLAGS_SDL)' LEVEL=1
397 $(MAKE) bin-profile \
398 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
399 EXE=
'$(EXE_SDL)' CFLAGS_FEATURES=
'$(CFLAGS_CLIENT)' CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' LDFLAGS_COMMON=
'$(LDFLAGS_SDL)' LEVEL=1
402 $(MAKE) bin-release \
403 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
404 EXE=
'$(EXE_SDL)' CFLAGS_FEATURES=
'$(CFLAGS_CLIENT)' CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' LDFLAGS_COMMON=
'$(LDFLAGS_SDL)' LEVEL=1
407 $(MAKE) wasm-release \
408 DP_MAKE_TARGET=
"wasm" \
409 EXE=
'$(EXE_WASMJS)' \
410 CFLAGS_FEATURES=
'$(CFLAGS_CLIENT)' \
411 CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' \
412 LDFLAGS_COMMON=
'$(LDFLAGS_WASMJS)' \
415emscripten-standalone :
416 $(MAKE) wasm-release \
417 DP_MAKE_TARGET=
"wasm" \
419 CFLAGS_FEATURES=
'$(CFLAGS_CLIENT) -DWASM_USER_ADJUSTABLE' \
420 CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' \
421 LDFLAGS_COMMON=
'$(LDFLAGS_WASM)' \
425 $(MAKE) bin-release-profile \
426 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
427 EXE=
'$(EXE_SDL)' CFLAGS_FEATURES=
'$(CFLAGS_CLIENT)' CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' LDFLAGS_COMMON=
'$(LDFLAGS_SDL)' LEVEL=1
430 $(MAKE) bin-release \
431 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
432 EXE=
'$(EXE_SDLNEXUIZ)' CFLAGS_FEATURES=
'$(CFLAGS_CLIENT)' CFLAGS_SDL=
'$(SDLCONFIG_CFLAGS)' LDFLAGS_COMMON=
'$(LDFLAGS_SDL)' LEVEL=1
437 @echo
'========== $(EXE) (debug) =========='
438 $(MAKE) prepare BUILD_DIR=build-
obj/debug/
$(EXE)
439 $(MAKE) -C build-
obj/debug/
$(EXE)
$(EXE) \
440 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
441 CFLAGS=
'$(CFLAGS_COMMON) $(CFLAGS_FEATURES) $(CFLAGS_EXTRA) $(CFLAGS_DEBUG) $(OPTIM_DEBUG)'\
442 LDFLAGS=
'$(LDFLAGS_DEBUG) $(LDFLAGS_COMMON)' LEVEL=2
447 @echo
'========== $(EXE) (profile) =========='
448 $(MAKE) prepare BUILD_DIR=build-
obj/profile/
$(EXE)
449 $(MAKE) -C build-
obj/profile/
$(EXE)
$(EXE) \
450 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
451 CFLAGS=
'$(CFLAGS_COMMON) $(CFLAGS_FEATURES) $(CFLAGS_EXTRA) $(CFLAGS_PROFILE) $(OPTIM_RELEASE)'\
452 LDFLAGS=
'$(LDFLAGS_PROFILE) $(LDFLAGS_COMMON)' LEVEL=2
457 @echo
'========== $(EXE) (release) =========='
458 $(MAKE) prepare BUILD_DIR=build-
obj/release/
$(EXE)
459 $(MAKE) -C build-
obj/release/
$(EXE)
$(EXE) \
460 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
461 CFLAGS=
'$(CFLAGS_COMMON) $(CFLAGS_FEATURES) $(CFLAGS_EXTRA) $(CFLAGS_RELEASE) $(OPTIM_RELEASE)'\
462 LDFLAGS=
'$(LDFLAGS_RELEASE) $(LDFLAGS_COMMON)' LEVEL=2
468 @echo
'========== $(EXE) (release) =========='
469 $(MAKE) prepare BUILD_DIR=build-
obj/release-profile/
$(EXE)
470 $(MAKE) -C build-
obj/release-profile/
$(EXE)
$(EXE) \
471 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
472 CFLAGS=
'$(CFLAGS_COMMON) $(CFLAGS_FEATURES) $(CFLAGS_EXTRA) $(CFLAGS_RELEASE_PROFILE) $(OPTIM_RELEASE)'\
473 LDFLAGS=
'$(LDFLAGS_RELEASE) $(LDFLAGS_COMMON)' LEVEL=2
479 @echo
'========== $(EXE) (release) =========='
480 $(MAKE) prepare BUILD_DIR=build-
obj/release/
$(EXE)
481 $(MAKE) -C build-
obj/release/
$(EXE)
$(EXE) \
482 DP_MAKE_TARGET=
$(DP_MAKE_TARGET) \
483 CFLAGS=
'$(CFLAGS_COMMON) $(CFLAGS_FEATURES) $(CFLAGS_EXTRA) $(CFLAGS_RELEASE) $(OPTIM_RELEASE)'\
484 LDFLAGS=
'$(LDFLAGS_RELEASE) $(LDFLAGS_COMMON)' LEVEL=2
487 $(CMD_MKDIR)
$(BUILD_DIR)
488 $(CMD_CP) makefile.inc
$(BUILD_DIR)/
489 $(CMD_CP)
$(MAKEFILE)
$(BUILD_DIR)/
492#this checks USEODE when compiling so it needs the ODE flags as well
493cl_parse.o: cl_parse.c
495 $(DO_CC)
$(CFLAGS_ODE)
497cs_progs.o: cs_progs.c
499 $(DO_CC)
$(CFLAGS_ODE)
503 $(DO_CC)
$(CFLAGS_ODE)
507 $(DO_CC)
$(CFLAGS_ODE)
509prvm_cmds.o: prvm_cmds.c
511 $(DO_CC)
$(CFLAGS_ODE)
515 $(DO_CC)
$(CFLAGS_ODE)
519 $(DO_CC)
$(CFLAGS_CRYPTO)
$(CFLAGS_CRYPTO_RIJNDAEL)
521mod_skeletal_animatevertices_sse.o: mod_skeletal_animatevertices_sse.c
523 $(DO_CC)
$(CFLAGS_SSE)
527 $(DO_CC)
$(CFLAGS_SND_XMP)
529#this checks USEXMP when compiling so it needs the XMP flags as well
530snd_main.o: snd_main.c
532 $(DO_CC)
$(CFLAGS_SND_XMP)
534#this checks USEXMP when compiling so it needs the XMP flags as well
537 $(DO_CC)
$(CFLAGS_SND_XMP)
539darkplaces.o: %.o : %.rc
550.c.o: .EXTRA_PREREQS = # According to POSIX,
a suffix rule cannot contain prerequisites.
552$(EXE_SV):
$(OBJ_SV)
$(OBJ_ICON)
556$(EXE_SDL):
$(OBJ_SDL)
$(OBJ_ICON)
560$(EXE_WASM):
$(OBJ_WASM)
$(OBJ_ICON)
564$(EXE_WASMJS):
$(OBJ_WASM)
$(OBJ_ICON)
569$(EXE_SVNEXUIZ):
$(OBJ_SV)
$(OBJ_ICON_NEXUIZ)
573$(EXE_SDLNEXUIZ):
$(OBJ_SDL)
$(OBJ_ICON_NEXUIZ)
577# If requested, these targets must always run
first:
578.EXTRA_PREREQS :=
$(
filter clean clean-profile,
$(MAKECMDGOALS))
582 -
$(CMD_RM)
$(EXE_SDL)
583 -
$(CMD_RM)
$(EXE_WASM)
584 -
$(CMD_RM)
$(EXE_WASMJS)
585 -
$(CMD_RM)
$(EXE_SVNEXUIZ)
586 -
$(CMD_RM)
$(EXE_SDLNEXUIZ)
590 -
$(CMD_RM) build-
obj/
591clean: .EXTRA_PREREQS = # prevents circular dependency with clean-profile
static suffixinfo_t suffix[3][6]
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter