raze/Common.mak
pogokeen 1df7127609 Support software renderer upscaling engine-side in sdlayer and sdlayer12 with various scaling factors (beyond just pixel doubling).
When glsurface is available, use GL to upscale the render buffer.
Additionally, fix build issues with sdlayer12 introduced by GLAD changes (r6656).

git-svn-id: https://svn.eduke32.com/eduke32@6939 1a8010ca-5511-0410-912e-c29ae57300e0
2018-07-14 21:36:44 +00:00

1057 lines
27 KiB
Makefile

# OS package maintainers: Please try invoking make with PACKAGE_REPOSITORY=1 to see if that meets your needs before patching out our optimizations entirely.
PACKAGE_REPOSITORY ?= 0
# Are we running from synthesis?
SYNTHESIS := 0
##### Makefile Swiss army knife
override empty :=
override space := $(empty) $(empty)
override comma := ,
##### Detect platform
ifndef HOSTPLATFORM
HOSTPLATFORM := UNKNOWN
ifeq ($(findstring Windows,$(OS)),Windows)
HOSTPLATFORM := WINDOWS
else
uname := $(strip $(shell uname -s))
ifeq ($(findstring Linux,$(uname)),Linux)
HOSTPLATFORM := LINUX
else ifeq ($(findstring BSD,$(uname)),BSD)
HOSTPLATFORM := BSD
else ifeq ($(findstring MINGW,$(uname)),MINGW)
HOSTPLATFORM := WINDOWS
else ifeq ($(findstring MSYS,$(uname)),MSYS)
HOSTPLATFORM := WINDOWS
else ifeq ($(findstring Darwin,$(uname)),Darwin)
HOSTPLATFORM := DARWIN
else ifeq ($(findstring BeOS,$(uname)),BeOS)
HOSTPLATFORM := BEOS
else ifeq ($(findstring skyos,$(uname)),skyos)
HOSTPLATFORM := SKYOS
else ifeq ($(findstring QNX,$(uname)),QNX)
HOSTPLATFORM := QNX
else ifeq ($(findstring SunOS,$(uname)),SunOS)
HOSTPLATFORM := SUNOS
else ifeq ($(findstring syllable,$(uname)),syllable)
HOSTPLATFORM := SYLLABLE
endif
endif
endif
ifndef PLATFORM
PLATFORM := $(HOSTPLATFORM)
endif
ifndef SUBPLATFORM
SUBPLATFORM :=
ifeq ($(PLATFORM),$(filter $(PLATFORM),LINUX DINGOO GCW CAANOO))
SUBPLATFORM := LINUX
endif
endif
ifeq ($(HOSTPLATFORM),DARWIN)
DARWINVERSION := $(word 1,$(subst ., ,$(strip $(shell uname -r))))
DARWIN9 := 0
DARWIN10 := 0
ifneq (,$(filter 0 1 2 3 4 5 6 7 8 9 10,$(DARWINVERSION)))
DARWIN10 := 1
ifneq (,$(filter 0 1 2 3 4 5 6 7 8 9,$(DARWINVERSION)))
DARWIN9 := 1
endif
endif
endif
HOSTEXESUFFIX :=
ifeq ($(HOSTPLATFORM),WINDOWS)
HOSTEXESUFFIX := .exe
endif
EXESUFFIX :=
DLLSUFFIX := .so
DOLSUFFIX := .dol
ifeq ($(PLATFORM),DARWIN)
DLLSUFFIX := .dylib
endif
ifeq ($(PLATFORM),WII)
EXESUFFIX := .elf
endif
ifeq ($(PLATFORM),SKYOS)
EXESUFFIX := .app
endif
ifeq ($(PLATFORM),WINDOWS)
EXESUFFIX := .exe
DLLSUFFIX := .dll
endif
##### Makefile meta-settings
PRETTY_OUTPUT := 1
NULLSTREAM := /dev/null
ifeq ($(HOSTPLATFORM),WINDOWS)
# MSYS2 lets you create files named NUL but has a /dev/null. Go figure.
ifeq (,$(wildcard /dev/null))
NULLSTREAM := NUL
endif
endif
DONT_PRINT := > $(NULLSTREAM) 2>&1
DONT_PRINT_STDERR := 2> $(NULLSTREAM)
DONT_FAIL := ; exit 0
HAVE_SH := 1
# when no sh.exe is found in PATH on Windows, no path is prepended to it
ifeq (sh.exe,$(SHELL))
HAVE_SH := 0
endif
define LL
ls -l $1
endef
define MKDIR
mkdir -p $1
endef
define RM
rm -f $(filter-out / *,$1)
endef
define RMDIR
rm -rf $(filter-out / *,$1)
endef
ifeq (0,$(HAVE_SH))
DONT_FAIL := & rem
define LL
dir $(subst /,\,$1)
endef
define MKDIR
if not exist $(subst /,\,$1) mkdir $(subst /,\,$1)
endef
define RM
del /f /q $(subst /,\,$(filter-out / *,$1)) $(DONT_PRINT_STDERR) $(DONT_FAIL)
endef
define RMDIR
rmdir /s /q $(subst /,\,$(filter-out / *,$1)) $(DONT_PRINT_STDERR) $(DONT_FAIL)
endef
# if, printf, exit, and ; are unavailable without sh
PRETTY_OUTPUT := 0
endif
##### Toolchain setup
CROSS :=
CROSS_SUFFIX :=
CCFULLPATH = $(CC)
ifeq ($(PLATFORM),WII)
ifeq ($(strip $(DEVKITPPC)),)
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC := <path to>devkitPPC")
endif
ifeq ($(HOSTPLATFORM),WINDOWS)
override DEVKITPRO := $(subst /c/,C:/,$(DEVKITPRO))
override DEVKITPPC := $(subst /c/,C:/,$(DEVKITPPC))
endif
export PATH := $(DEVKITPPC)/bin:$(PATH)
CROSS := powerpc-eabi-
CCFULLPATH = $(DEVKITPPC)/bin/$(CC)
endif
CC := $(CROSS)gcc$(CROSS_SUFFIX)
CXX := $(CROSS)g++$(CROSS_SUFFIX)
ifeq ($(PLATFORM),DARWIN)
CC := $(CROSS)clang$(CROSS_SUFFIX)
CXX := $(CROSS)clang++$(CROSS_SUFFIX)
endif
COBJC := $(CC) -x objective-c
COBJCXX := $(CXX) -x objective-c++
L_CC := $(CC)
L_CXX := $(CXX)
AR := $(CROSS)ar$(CROSS_SUFFIX)
RC := $(CROSS)windres$(CROSS_SUFFIX)
RANLIB := $(CROSS)ranlib$(CROSS_SUFFIX)
STRIP := $(CROSS)strip$(CROSS_SUFFIX)
AS := nasm
# LuaJIT standalone interpreter executable:
LUAJIT := luajit$(HOSTEXESUFFIX)
PKG_CONFIG := pkg-config
ELF2DOL := elf2dol
# Override defaults that absolutely will not work.
ifeq ($(CC),cc)
override CC := gcc
endif
ifeq ($(AS),as)
override AS := nasm
endif
ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW))
CROSS := mipsel-linux-
endif
CLANG := 0
ifeq ($(findstring clang,$(CC) $(MAKECMDGOALS)),clang)
override CLANG := 1
CLANGNAME := $(CC)
else
CLANGNAME := clang
endif
# detect clang symlinked as gcc, as in OS X
CLANG_POTENTIAL_VERSION := $(shell $(CCFULLPATH) --version)
ifeq ($(findstring clang,$(CLANG_POTENTIAL_VERSION)),clang)
override CLANG := 1
ifeq ($(findstring Apple,$(CLANG_POTENTIAL_VERSION)),Apple)
override APPLE_CLANG := 1
APPLE_CLANG_VER := $(word 4,$(CLANG_POTENTIAL_VERSION))
override APPLE_CLANG_VER_SPLIT := $(subst ., ,$(APPLE_CLANG_VER))
APPLE_CLANG_MAJOR := $(word 1,$(APPLE_CLANG_VER_SPLIT))
APPLE_CLANG_MINOR := $(word 2,$(APPLE_CLANG_VER_SPLIT))
else
CLANG_VER := $(word 3,$(CLANG_POTENTIAL_VERSION))
override CLANG_VER_SPLIT := $(subst ., ,$(CLANG_VER))
CLANG_MAJOR := $(word 1,$(CLANG_VER_SPLIT))
CLANG_MINOR := $(word 2,$(CLANG_VER_SPLIT))
endif
endif
ifneq (0,$(CLANG))
CLANGXXNAME := $(subst clang,clang++,$(CLANGNAME))
override CC := $(CLANGNAME) -x c
override CXX := $(CLANGXXNAME) -x c++
override COBJC := $(CLANGNAME) -x objective-c
override COBJCXX := $(CLANGXXNAME) -x objective-c++
override L_CC := $(CLANGNAME)
override L_CXX := $(CLANGXXNAME)
endif
GCC_VER :=
ifeq (0,$(CLANG))
GCC_VER := $(strip $(shell $(CCFULLPATH) -dumpversion 2>&1))
endif
ifeq (,$(GCC_VER))
GCC_VER := 4.9.0
endif
override GCC_VER_SPLIT := $(subst ., ,$(GCC_VER))
GCC_MAJOR := $(word 1,$(GCC_VER_SPLIT))
GCC_MINOR := $(word 2,$(GCC_VER_SPLIT))
GCC_PREREQ_4 := 1
ifneq (,$(filter 1 2 3,$(GCC_MAJOR)))
ifeq (0,$(CLANG))
GCC_PREREQ_4 := 0
$(error How do you still have an old GCC in $$(CURRENT_YEAR)?)
endif
endif
##### Detect machine architecture
BITS := 32
ifeq ($(PLATFORM),WINDOWS)
ifndef COMPILERTARGET
COMPILERTARGET := $(strip $(shell $(CC) -dumpmachine))
endif
IMPLICIT_ARCH := i386
ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
IMPLICIT_ARCH := x86_64
BITS := 64
endif
else ifeq ($(PLATFORM),WII)
IMPLICIT_ARCH := ppc
else
ifneq ($(ARCH),)
override ARCH := $(subst i486,i386,$(subst i586,i386,$(subst i686,i386,$(strip $(ARCH)))))
IMPLICIT_ARCH := $(ARCH)
else
IMPLICIT_ARCH := $(subst i486,i386,$(subst i586,i386,$(subst i686,i386,$(strip $(shell uname -m)))))
endif
ifeq ($(findstring x86_64,$(IMPLICIT_ARCH)),x86_64)
BITS := 64
endif
endif
##### Toggles
# CPLUSPLUS - 1 := enable C++ building
# RELEASE - 1 := no debugging
# FORCEDEBUG:
# 1 := Include debug symbols even when generating release code.
# 2 := Also enable sanitizers with Clang. On the C side, make 'sprite' etc. be real arrays.
# KRANDDEBUG - 1 := include logging of krand() calls for debugging the demo system
# MEMMAP - 1 := produce .memmap file when linking
# OPTLEVEL - 0..3 := GCC optimization strategy
# LTO - 1 := enable link-time optimization
# Optional overrides for text
APPNAME :=
APPBASENAME :=
# Build toggles
RELEASE := 1
NOASM := 0
# EXPERIMENTAL, unfinished x86_64 assembly routines. DO NOT ENABLE.
USE_ASM64 := 0
MEMMAP := 0
CPLUSPLUS := 1
# Feature toggles
STANDALONE := 0
NETCODE := 1
STARTUP_WINDOW := 1
SIMPLE_MENU := 0
POLYMER := 1
USE_OPENGL := 1
LUNATIC := 0
USE_LUAJIT_2_1 := 0
# Library toggles
HAVE_GTK2 := 1
USE_LIBVPX := 1
HAVE_VORBIS := 1
HAVE_FLAC := 1
HAVE_XMP := 1
RENDERTYPE := SDL
MIXERTYPE := SDL
SDL_TARGET := 2
# Debugging/Build options
FORCEDEBUG := 0
KRANDDEBUG := 0
PROFILER := 0
# Make allocache() a wrapper around malloc()? Useful for debugging
# allocache()-allocated memory accesses with e.g. Valgrind.
# For debugging with Valgrind + GDB, see
# http://valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver
ALLOCACHE_AS_MALLOC := 0
##### Settings overrides and implicit cascades
ifneq (0,$(KRANDDEBUG))
RELEASE := 0
endif
ifneq (100,$(RELEASE)$(PROFILER)$(ALLOCACHE_AS_MALLOC))
# so that we have debug symbols
FORCEDEBUG := 1
endif
ifeq ($(PLATFORM),WINDOWS)
MIXERTYPE := WIN
ifneq ($(RENDERTYPE),SDL)
ifeq ($(MIXERTYPE),SDL)
override MIXERTYPE := WIN
endif
endif
override HAVE_GTK2 := 0
else ifeq ($(PLATFORM),DARWIN)
HAVE_GTK2 := 0
else ifeq ($(PLATFORM),WII)
override USE_OPENGL := 0
override NETCODE := 0
override HAVE_GTK2 := 0
override HAVE_FLAC := 0
SDL_TARGET := 1
else ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW QNX SUNOS SYLLABLE))
override USE_OPENGL := 0
override NOASM := 1
else ifeq ($(PLATFORM),$(filter $(PLATFORM),BEOS SKYOS))
override NOASM := 1
endif
ifneq (i386,$(strip $(IMPLICIT_ARCH)))
override NOASM := 1
endif
ifeq (0,$(USE_OPENGL))
override POLYMER := 0
override USE_LIBVPX := 0
endif
ifeq ($(RELEASE),0)
override STRIP :=
endif
ifneq ($(FORCEDEBUG),0)
override STRIP :=
endif
ifeq ($(RELEASE),0)
OPTLEVEL := 0
# see if we can use -Og
ifeq (1,$(APPLE_CLANG))
# Apple clang >= 9.0
ifeq (,$(filter 0 1 2 3 4 5 6 7 8,$(APPLE_CLANG_MAJOR)))
OPTLEVEL := g
endif
else ifeq (1,$(CLANG))
# clang >= 4.0
ifeq (,$(filter 0 1 2 3,$(CLANG_MAJOR)))
OPTLEVEL := g
endif
else
# GCC >= 4.8
ifeq (,$(filter 0 1 2 3 4,$(GCC_MAJOR)))
OPTLEVEL := g
else ifeq (4,$(GCC_MAJOR))
ifeq (,$(filter 0 1 2 3 4 5 6 7,$(GCC_MINOR)))
OPTLEVEL := g
endif
endif
endif
LTO := 0
else
OPTLEVEL := 2
LTO := 1
endif
ifneq (0,$(CLANG))
ifeq ($(PLATFORM),WINDOWS)
LTO := 0
endif
endif
ifneq ($(LUNATIC),0)
# FIXME: Lunatic builds with LTO don't start up properly as the required
# symbol names are apparently not exported.
override LTO := 0
endif
ifeq (0,$(CLANG))
ifeq (0,$(GCC_PREREQ_4))
override LTO := 0
endif
ifeq (4,$(GCC_MAJOR))
ifeq ($(PLATFORM),WII)
ifneq (,$(filter 0 1 2 3 4 5 6 7,$(GCC_MINOR)))
override LTO := 0
endif
else
ifneq (,$(filter 0 1 2 3 4 5,$(GCC_MINOR)))
override LTO := 0
endif
endif
endif
endif
########## End Toggles, Begin Construction ##########
##### Instantiate variables
COMMONFLAGS :=
COMPILERFLAGS := -funsigned-char
CSTD := -std=gnu99
CXXSTD := -std=gnu++11
ifneq (0,$(CLANG))
CSTD := $(subst gnu,c,$(CSTD))
CXXSTD := $(subst gnu,c,$(CXXSTD))
endif
CONLYFLAGS := $(CSTD)
CXXONLYFLAGS := $(CXXSTD) -fno-exceptions -fno-rtti
ASFLAGS := -s #-g
LUAJIT_BCOPTS :=
LINKERFLAGS :=
L_CXXONLYFLAGS :=
LIBS :=
GUI_LIBS :=
LIBDIRS :=
##### Mandatory platform parameters
ASFORMAT := elf$(BITS)
# Options to "luajit -b" for synthesis. Since it runs on Linux, we need to tell
# the native LuaJIT to emit PE object files.
ifeq ($(PLATFORM),WINDOWS)
LINKERFLAGS += -static-libgcc -static
ifeq (0,$(CLANG))
L_CXXONLYFLAGS += -static-libstdc++
endif
ifeq (0,$(CLANG))
GUI_LIBS += -mwindows
endif
COMPILERFLAGS += -DUNDERSCORES
ASFORMAT := win$(BITS)
ASFLAGS += -DUNDERSCORES
ifneq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
LINKERFLAGS += -Wl,--large-address-aware
endif
LINKERFLAGS += -Wl,--enable-auto-import
LUAJIT_BCOPTS := -o windows
ifeq (32,$(BITS))
LUAJIT_BCOPTS += -a x86
endif
ifeq (64,$(BITS))
LUAJIT_BCOPTS += -a x64
endif
else ifeq ($(PLATFORM),DARWIN)
ifneq ($(ARCH),)
ifneq ($(findstring -arch,$(ARCH)),-arch)
override ARCH := -arch $(ARCH)
endif
endif
COMMONFLAGS += $(ARCH)
ifneq ($(findstring x86_64,$(IMPLICIT_ARCH)),x86_64)
LINKERFLAGS += -read_only_relocs suppress
endif
COMPILERFLAGS += -DUNDERSCORES
ASFORMAT := macho
ASFLAGS += -DUNDERSCORES
ifeq ($(findstring x86_64,$(IMPLICIT_ARCH)),x86_64)
ASFORMAT += 64
endif
else ifeq ($(PLATFORM),WII)
LIBOGC_INC := $(DEVKITPRO)/libogc/include
LIBOGC_LIB := $(DEVKITPRO)/libogc/lib/wii
COMMONFLAGS += -mrvl -mcpu=750 -meabi -mhard-float
LINKERFLAGS += -Wl,--gc-sections
# -msdata=eabiexport
COMPILERFLAGS += -DGEKKO -D__POWERPC__ -I$(LIBOGC_INC)
LIBDIRS += -L$(LIBOGC_LIB)
else ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW))
COMPILERFLAGS += -D__OPENDINGUX__
else ifeq ($(PLATFORM),SKYOS)
COMPILERFLAGS += -DUNDERSCORES
endif
ASFLAGS += -f $(ASFORMAT)
COMPILERFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
##### Optimizations
ifndef OPTOPT
ifeq ($(findstring x86_64, $(IMPLICIT_ARCH)),x86_64)
ifeq ($(findstring x86_64h, $(IMPLICIT_ARCH)),x86_64h)
OPTOPT := -march=haswell -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -mpopcnt -mpclmul -mavx -mrdrnd -mf16c -mfsgsbase -mavx2 -maes -mfma -mbmi -mbmi2
# -mcrc32 -mmovbe
else
ifeq ($(PLATFORM),DARWIN)
OPTOPT := -march=core2 -mmmx -msse -msse2 -msse3 -mssse3
endif
endif
endif
ifeq ($(findstring i386, $(IMPLICIT_ARCH)),i386)
ifeq ($(PLATFORM),DARWIN)
OPTOPT := -march=nocona -mmmx -msse -msse2 -msse3
else
OPTOPT := -march=pentium3
ifneq (0,$(GCC_PREREQ_4))
OPTOPT += -mtune=generic
# -mstackrealign
endif
OPTOPT += -mmmx
# -msse2 -mfpmath=sse,387 -malign-double
endif
endif
ifeq ($(PLATFORM),WII)
OPTOPT := -mtune=750
endif
endif
ifeq ($(PACKAGE_REPOSITORY),0)
COMMONFLAGS += -O$(OPTLEVEL) $(OPTOPT)
endif
ifneq (0,$(LTO))
COMPILERFLAGS += -DUSING_LTO
COMMONFLAGS += -flto
endif
##### Debugging
ifneq ($(RELEASE)$(FORCEDEBUG),10)
ifeq ($(PACKAGE_REPOSITORY),0)
COMMONFLAGS += -g
ifeq (0,$(CLANG))
ifneq ($(PLATFORM),WII)
COMMONFLAGS += -fno-omit-frame-pointer
endif
endif
endif
ifeq ($(SUBPLATFORM),LINUX)
# This option is needed to allow obtaining backtraces from within a program.
LIBS += -rdynamic
endif
endif
ifneq ($(ALLOCACHE_AS_MALLOC),0)
COMPILERFLAGS += -DDEBUG_ALLOCACHE_AS_MALLOC
endif
# See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
# and https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
# for a list of possible ASan and UBsan options.
ASAN_FLAGS := -fsanitize=address -fsanitize=bounds,enum,float-cast-overflow
ASAN_FLAGS := $(ASAN_FLAGS),signed-integer-overflow,unsigned-integer-overflow
ASAN_FLAGS := $(ASAN_FLAGS),undefined,return,null,pointer-overflow,float-divide-by-zero
#ASAN_FLAGS := $(ASAN_FLAGS) -fsanitize-undefined-trap-on-error
ifeq (0,$(FORCEDEBUG))
COMPILERFLAGS += -DNDEBUG
else
COMPILERFLAGS += -DDEBUGGINGAIDS=$(FORCEDEBUG)
ifeq (2,$(FORCEDEBUG))
ifneq (0,$(CLANG))
COMMONFLAGS += $(ASAN_FLAGS)
else ifneq (,$(filter 1 2 3 4 5 6,$(GCC_MAJOR)))
ifneq (,$(filter 0 1,$(GCC_MINOR)))
COMMONFLAGS += $(ASAN_FLAGS)
endif
endif
endif
endif
ifneq (0,$(KRANDDEBUG))
COMPILERFLAGS += -DKRANDDEBUG=1
endif
ifneq (0,$(PROFILER))
ifneq ($(PLATFORM),DARWIN)
LIBS += -lprofiler
endif
COMMONFLAGS += -pg
endif
##### -f stuff
ifneq (0,$(GCC_PREREQ_4))
F_NO_STACK_PROTECTOR := -fno-stack-protector
ifeq (0,$(CLANG))
F_JUMP_TABLES := -fjump-tables
endif
endif
ifeq ($(PLATFORM),DARWIN)
ifeq (1,$(DARWIN9))
F_JUMP_TABLES :=
endif
ifeq ($(findstring ppc,$(IMPLICIT_ARCH))$(findstring i386,$(IMPLICIT_ARCH)),)
F_NO_STACK_PROTECTOR :=
endif
endif
ifeq (0,$(RELEASE))
F_NO_STACK_PROTECTOR :=
else
ifeq (0,$(CLANG))
COMMONFLAGS += -funswitch-loops
endif
ifeq (0,$(FORCEDEBUG))
COMMONFLAGS += -fomit-frame-pointer
endif
endif
ifneq (0,$(KRANDDEBUG))
COMMONFLAGS += -fno-inline -fno-inline-functions -fno-inline-functions-called-once
endif
COMMONFLAGS += -fno-strict-aliasing -fno-threadsafe-statics $(F_JUMP_TABLES) $(F_NO_STACK_PROTECTOR)
##### Warnings
W_STRICT_OVERFLOW := -Wno-strict-overflow
ifeq ($(PLATFORM),DARWIN)
ifneq (0,$(DARWIN9))
W_STRICT_OVERFLOW :=
endif
endif
W_UNINITIALIZED := -Wuninitialized
W_GCC_4_1 := -Wno-attributes
W_GCC_4_2 := $(W_STRICT_OVERFLOW)
W_GCC_4_4 := -Wno-unused-result
W_GCC_4_5 := -Wlogical-op -Wcast-qual
W_CLANG := -Wno-unused-value -Wno-parentheses -Wno-unknown-warning-option
ifeq (0,$(CLANG))
W_CLANG :=
ifeq (0,$(GCC_PREREQ_4))
W_GCC_4_5 :=
W_GCC_4_4 :=
ifeq (0,$(OPTLEVEL))
W_UNINITIALIZED :=
endif
W_GCC_4_2 :=
W_GCC_4_1 :=
endif
ifeq (4,$(GCC_MAJOR))
ifneq (,$(filter 0 1 2 3 4,$(GCC_MINOR)))
W_GCC_4_5 :=
ifneq (,$(filter 0 1 2 3,$(GCC_MINOR)))
W_GCC_4_4 :=
ifeq (0,$(OPTLEVEL))
W_UNINITIALIZED :=
endif
ifneq (,$(filter 0 1,$(GCC_MINOR)))
W_GCC_4_2 :=
ifeq (0,$(GCC_MINOR))
W_GCC_4_1 :=
endif
endif
endif
endif
endif
endif
CONLYWARNS := -Wimplicit -Werror-implicit-function-declaration
CWARNS := -W -Wall \
-Wextra \
-Wpointer-arith \
-Wno-char-subscripts \
-Wno-missing-braces \
-Wwrite-strings \
$(W_UNINITIALIZED) \
$(W_GCC_4_1) \
$(W_GCC_4_2) \
$(W_GCC_4_4) \
$(W_GCC_4_5) \
$(W_CLANG) \
#-Wstrict-prototypes \
#-Waggregate-return \
#-Wcast-align \
#-Waddress
##### Features
ifneq (,$(APPNAME))
COMPILERFLAGS += -DAPPNAME=\"$(APPNAME)\"
endif
ifneq (,$(APPBASENAME))
COMPILERFLAGS += -DAPPBASENAME=\"$(APPBASENAME)\"
endif
ifneq (0,$(NOASM))
COMPILERFLAGS += -DNOASM
endif
ifneq (0,$(USE_ASM64))
COMPILERFLAGS += -DUSE_ASM64
endif
ifneq (0,$(MEMMAP))
ifeq ($(PLATFORM),DARWIN)
LINKERFLAGS += -Wl,-map -Wl,$@.memmap
else
LINKERFLAGS += -Wl,-Map=$@.memmap
endif
endif
COMPILERFLAGS += -DRENDERTYPE$(RENDERTYPE)=1 -DMIXERTYPE$(MIXERTYPE)=1
ifeq (0,$(NETCODE))
COMPILERFLAGS += -DNETCODE_DISABLE
endif
ifneq (0,$(STARTUP_WINDOW))
COMPILERFLAGS += -DSTARTUP_WINDOW
endif
ifneq (0,$(SIMPLE_MENU))
COMPILERFLAGS += -DEDUKE32_SIMPLE_MENU
endif
ifneq (0,$(STANDALONE))
COMPILERFLAGS += -DEDUKE32_STANDALONE
endif
ifneq (0,$(USE_OPENGL))
COMPILERFLAGS += -DUSE_OPENGL
endif
ifneq (0,$(POLYMER))
COMPILERFLAGS += -DPOLYMER
endif
##### External library paths
ifeq ($(PLATFORM),WINDOWS)
COMPILERFLAGS += -Iplatform/Windows/include
LIBDIRS += -Lplatform/Windows/lib/$(BITS)
else ifeq ($(PLATFORM),DARWIN)
ifneq ($(shell port --version &>/dev/null; echo $$?),127)
LIBDIRS += -L/opt/local/lib
COMPILERFLAGS += -I/opt/local/include
endif
ifneq ($(shell brew --version &>/dev/null; echo $$?),127)
LIBDIRS += -L/usr/local/lib
COMPILERFLAGS += -I/usr/local/include
endif
ifneq ($(shell fink --version &>/dev/null; echo $$?),127)
LIBDIRS += -L/sw/lib
COMPILERFLAGS += -I/sw/include
endif
else ifeq ($(PLATFORM),BSD)
COMPILERFLAGS += -I/usr/local/include
else ifeq ($(PLATFORM),WII)
COMPILERFLAGS += -I$(PORTLIBS)/include -Iplatform/Wii/include
LIBDIRS += -L$(PORTLIBS)/lib -Lplatform/Wii/lib
endif
##### External libraries
ifneq ($(LUNATIC),0)
ifneq ($(USE_LUAJIT_2_1),0)
COMPILERFLAGS += -DUSE_LUAJIT_2_1
endif
ifeq ($(PLATFORM),WINDOWS)
LIBS += -lluajit
else
LIBS += -lluajit-5.1
endif
endif
ifneq (0,$(USE_LIBVPX))
COMPILERFLAGS += -DUSE_LIBVPX
LIBS += -lvpx
endif
ifneq (0,$(HAVE_VORBIS))
COMPILERFLAGS += -DHAVE_VORBIS
endif
ifneq (0,$(HAVE_FLAC))
COMPILERFLAGS += -DHAVE_FLAC
endif
ifneq (0,$(HAVE_XMP))
COMPILERFLAGS += -DHAVE_XMP
endif
ifeq ($(RENDERTYPE),SDL)
ifeq ($(SDL_TARGET),2)
SDLCONFIG := sdl2-config
SDLNAME := SDL2
else ifeq ($(SDL_TARGET),1)
SDLCONFIG := sdl-config
SDLNAME := SDL
ifeq (0,$(RELEASE))
COMPILERFLAGS += -DNOSDLPARACHUTE
endif
endif
ifeq ($(PLATFORM),WII)
SDLCONFIG :=
else ifeq ($(PLATFORM),SKYOS)
COMPILERFLAGS += -I/boot/programs/sdk/include/sdl
SDLCONFIG :=
endif
ifneq ($(strip $(SDLCONFIG)),)
ifeq ($(strip $(shell $(SDLCONFIG) --version $(DONT_PRINT_STDERR))),)
override SDLCONFIG :=
endif
endif
COMPILERFLAGS += -DSDL_TARGET=$(SDL_TARGET)
SDL_FRAMEWORK := 0
ifneq ($(SDL_FRAMEWORK),0)
ifeq ($(PLATFORM),DARWIN)
APPLE_FRAMEWORKS := /Library/Frameworks
LIBDIRS += -F$(APPLE_FRAMEWORKS)
ifeq ($(MIXERTYPE),SDL)
COMPILERFLAGS += -I$(APPLE_FRAMEWORKS)/$(SDLNAME)_mixer.framework/Headers
LIBS += -Wl,-framework,$(SDLNAME)_mixer
endif
COMPILERFLAGS += -I$(APPLE_FRAMEWORKS)/$(SDLNAME).framework/Headers
LIBS += -Wl,-framework,$(SDLNAME) -Wl,-rpath -Wl,"@loader_path/../Frameworks"
endif
else
ifeq ($(MIXERTYPE),SDL)
LIBS += -l$(SDLNAME)_mixer
endif
ifneq ($(SDLCONFIG),)
SDLCONFIG_CFLAGS := $(strip $(subst -Dmain=SDL_main,,$(shell $(SDLCONFIG) --cflags)))
SDLCONFIG_LIBS := $(strip $(subst -mwindows,,$(shell $(SDLCONFIG) --libs)))
COMPILERFLAGS += $(SDLCONFIG_CFLAGS)
LIBS += $(SDLCONFIG_LIBS)
else
ifeq ($(SDL_TARGET),1)
COMPILERFLAGS += -D_GNU_SOURCE=1
endif
COMPILERFLAGS += -D_REENTRANT -DSDL_USEFOLDER
LIBS += -l$(SDLNAME)
endif
endif
endif
ifneq (0,$(HAVE_GTK2))
ifneq (No,$(shell $(PKG_CONFIG) --exists gtk+-2.0 || echo No))
COMPILERFLAGS += -DHAVE_GTK2 $(shell $(PKG_CONFIG) --cflags gtk+-2.0)
else
override HAVE_GTK2 := 0
endif
endif
##### System libraries
ifeq ($(PLATFORM),WINDOWS)
ifneq (0,$(GCC_PREREQ_4))
L_SSP := -lssp
endif
LIBS += -lmingwex -lgdi32 -lpthread
ifeq ($(RENDERTYPE),WIN)
LIBS += -ldxguid
else ifeq ($(SDL_TARGET),1)
LIBS += -ldxguid -lmingw32 -limm32 -lole32 -loleaut32 -lversion
else
LIBS += -ldxguid_sdl -lmingw32 -limm32 -lole32 -loleaut32 -lversion
endif
LIBS += -lcomctl32 -lwinmm $(L_SSP) -lwsock32 -lws2_32 -lshlwapi
# -lshfolder
else ifeq ($(PLATFORM),SKYOS)
LIBS += -lnet
else ifeq ($(PLATFORM),QNX)
LIBS += -lsocket
else ifeq ($(PLATFORM),SUNOS)
LIBS += -lsocket -lnsl
else ifeq ($(PLATFORM),WII)
LIBS += -laesnd_tueidj -lfat -lwiiuse -lbte -lwiikeyboard -logc
else ifeq ($(SUBPLATFORM),LINUX)
LIBS += -lrt
endif
ifeq (,$(filter $(PLATFORM),WINDOWS WII))
ifneq ($(PLATFORM),BSD)
LIBS += -ldl
endif
ifneq ($(PLATFORM),DARWIN)
LIBS += -pthread
endif
endif
LIBS += -lm
##### Detect version control revision, if applicable
VC_REV :=
-include EDUKE32_REVISION.mak
ifeq (,$(VC_REV))
VC_REV := $(word 2,$(subst :, ,$(filter Revision:%,$(subst : ,:,$(strip $(shell svn info 2>&1))))))
endif
ifeq (,$(VC_REV))
GIT_SVN_URL := $(strip $(shell git config --local svn-remote.svn.url))
GIT_SVN_FETCH := $(strip $(shell git config --local svn-remote.svn.fetch))
VC_REV := $(word 2,$(subst @, ,$(filter git-svn-id:$(GIT_SVN_URL)@%,$(subst : ,:,$(shell git log -1 $(GIT_SVN_FETCH::%=%))))))
endif
ifneq (,$(VC_REV)$(VC_REV_CUSTOM))
REVFLAG := -DREV="\"r$(VC_REV)$(VC_REV_CUSTOM)\""
endif
##### Allow standard environment variables to take precedence, to help package maintainers.
ifneq (,$(CFLAGS))
COMMONFLAGS += $(CFLAGS)
endif
ifneq (,$(CXXFLAGS))
CXXONLYFLAGS += $(CXXFLAGS)
endif
ifneq (,$(LDFLAGS))
LINKERFLAGS += $(LDFLAGS)
endif
##### Final assembly of commands
COMPILER_C=$(CC) $(CONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(CONLYWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
COMPILER_CXX=$(CXX) $(CXXONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
COMPILER_OBJC=$(COBJC) $(CONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(CONLYWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
COMPILER_OBJCXX=$(COBJCXX) $(CXXONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
LINKER=$(L_CXX) $(CXXONLYFLAGS) $(L_CXXONLYFLAGS) $(COMMONFLAGS) $(LINKERFLAGS) $(CUSTOMOPT)
ifneq ($(CPLUSPLUS),0)
COMPILER_C=$(COMPILER_CXX)
COMPILER_OBJC=$(COMPILER_OBJCXX)
endif
##### Pretty-printing
ifeq ($(PRETTY_OUTPUT),1)
RECIPE_IF = if
BUILD_STARTED = printf "\033[K\033[1;36mBuilding: \033[0;36m$(MAKE) $(MAKECMDGOALS) -$(MAKEFLAGS)\033[0m\n"
COMPILE_STATUS = printf "\033[K\033[0mBuilding object \033[1m$@\033[0m...\033[0m\r"
COMPILE_OK = printf "\033[K\033[0;32mBuilt object \033[1;32m$@\033[0;32m \033[0m\n"
COMPILE_FAILED = printf "\033[K\033[0;31mFailed building \033[1;31m$@\033[0;31m from\033[0m \033[1;31m$<\033[0;31m!\033[0m\n"; exit 1
RECIPE_RESULT_COMPILE = ; then $(COMPILE_OK); else $(COMPILE_FAILED); fi
ONESTEP_STATUS = printf "\033[K\033[0mBuilding \033[1m$@\033[0m...\033[0m\r"
ONESTEP_OK = printf "\033[K\033[0;32mBuilt \033[1;32m$@\033[0;32m \033[0m\n"
ONESTEP_FAILED = printf "\033[K\033[0;31mFailed building \033[1;31m$@\033[0;31m!\033[0m\n"; exit 1
RECIPE_RESULT_ONESTEP = ; then $(ONESTEP_OK); else $(ONESTEP_FAILED); fi
ARCHIVE_STATUS = printf "\033[K\033[0mCreating library archive \033[1m$@\033[0m...\033[0m\r"
ARCHIVE_OK = printf "\033[K\033[0;32mCreated library archive \033[1;32m$@\033[0;32m \033[0m\n"
ARCHIVE_FAILED = printf "\033[K\033[0;31mFailed creating library archive \033[1;31m$@\033[0;31m from\033[0m \033[1;31m$<\033[0;31m!\033[0m\n"; exit 1
RECIPE_RESULT_ARCHIVE = ; then $(ARCHIVE_OK); else $(ARCHIVE_FAILED); fi
LINK_STATUS = printf "\033[K\033[0;0mLinking \033[1m$@\033[0;0m...\033[0m\r"
LINK_OK = printf "\033[K\033[0;32mLinked \033[1;32m$@\033[0;32m \033[0m\n"
LINK_FAILED = printf "\033[K\033[0;31mFailed linking \033[1;31m$@\033[0;31m!\nIf the build options, environment, or system packages have changed, run \'\033[1;31mmake clean\033[0;31m\' and try again.\033[0m\n"; exit 1
RECIPE_RESULT_LINK = ; then $(LINK_OK); else $(LINK_FAILED); fi
else
RECIPE_IF =
BUILD_STARTED =
COMPILE_STATUS =
COMPILE_OK = true
COMPILE_FAILED = false; exit 1
RECIPE_RESULT_COMPILE =
ONESTEP_STATUS =
ONESTEP_OK = true
ONESTEP_FAILED = false; exit 1
RECIPE_RESULT_ONESTEP =
ARCHIVE_STATUS =
ARCHIVE_OK = true
ARCHIVE_FAILED = false; exit 1
RECIPE_RESULT_ARCHIVE =
LINK_STATUS =
LINK_OK = true
LINK_FAILED = false; exit 1
RECIPE_RESULT_LINK =
endif