# vim: ft=make # # Makefile.cfg for SRB2 # # # GNU compiler & tools' flags # and other things # # See the following variable don't start with 'GCC'. This is # to avoid a false positive with the version detection... SUPPORTED_GCC_VERSIONS:=\ 101 102\ 91 92 93\ 81 82 83 84\ 71 72 73 74 75\ 61 62 63 64\ 51 52 53 54 55\ 40 41 42 43 44 45 46 47 48 49 LATEST_GCC_VERSION=10.2 # gcc or g++ ifdef PREFIX CC=$(PREFIX)-gcc CXX=$(PREFIX)-g++ OBJCOPY=$(PREFIX)-objcopy OBJDUMP=$(PREFIX)-objdump STRIP=$(PREFIX)-strip WINDRES=$(PREFIX)-windres else OBJCOPY=objcopy OBJDUMP=objdump STRIP=strip WINDRES=windres endif # because Apple screws with us on this # need to get bintools from homebrew ifdef MACOSX CC=clang CXX=clang OBJCOPY=gobjcopy OBJDUMP=gobjdump endif # Automatically set version flag, but not if one was manually set # And don't bother if this is a clean only run ifeq (,$(filter GCC% CLEANONLY,$(.VARIABLES))) version:=$(shell $(CC) --version) # check if this is in fact GCC ifneq (,$(or $(findstring gcc,$(version)),$(findstring GCC,$(version)))) version:=$(shell $(CC) -dumpversion) # Turn version into words of major, minor v:=$(subst ., ,$(version)) # concat. major minor v:=$(word 1,$(v))$(word 2,$(v)) # If this version is not in the list, default to the latest supported ifeq (,$(filter $(v),$(SUPPORTED_GCC_VERSIONS))) define line = Your compiler version, GCC $(version), is not supported by the Makefile. The Makefile will assume GCC $(LATEST_GCC_VERSION).)) endef $(call print,$(line)) GCC$(subst .,,$(LATEST_GCC_VERSION))=1 else $(call print,Detected GCC $(version) (GCC$(v))) GCC$(v)=1 endif endif endif ifdef GCC102 GCC101=1 endif ifdef GCC101 GCC93=1 endif ifdef GCC93 GCC92=1 endif ifdef GCC92 GCC91=1 endif ifdef GCC91 GCC84=1 endif ifdef GCC84 GCC83=1 endif ifdef GCC83 GCC82=1 endif ifdef GCC82 GCC81=1 endif ifdef GCC81 GCC75=1 endif ifdef GCC75 GCC74=1 endif ifdef GCC74 GCC73=1 endif ifdef GCC73 GCC72=1 endif ifdef GCC72 GCC71=1 endif ifdef GCC71 GCC64=1 endif ifdef GCC64 GCC63=1 endif ifdef GCC63 GCC62=1 endif ifdef GCC62 GCC61=1 endif ifdef GCC61 GCC55=1 endif ifdef GCC55 GCC54=1 endif ifdef GCC54 GCC53=1 endif ifdef GCC53 GCC52=1 endif ifdef GCC52 GCC51=1 endif ifdef GCC51 GCC49=1 endif ifdef GCC49 GCC48=1 endif ifdef GCC48 GCC47=1 endif ifdef GCC47 GCC46=1 endif ifdef GCC46 GCC45=1 endif ifdef GCC45 GCC44=1 endif ifdef GCC44 GCC43=1 endif ifdef GCC43 GCC42=1 endif ifdef GCC42 GCC41=1 endif ifdef GCC41 GCC40=1 VCHELP=1 endif ifdef GCC295 GCC29=1 endif OLDWFLAGS:=$(WFLAGS) # -W -Wno-unused WFLAGS=-Wall ifndef GCC295 #WFLAGS+=-Wno-packed endif ifndef RELAXWARNINGS WFLAGS+=-W #WFLAGS+=-Wno-sign-compare ifndef GCC295 WFLAGS+=-Wno-div-by-zero endif #WFLAGS+=-Wsystem-headers WFLAGS+=-Wfloat-equal #WFLAGS+=-Wtraditional ifdef VCHELP WFLAGS+=-Wdeclaration-after-statement WFLAGS+=-Wno-error=declaration-after-statement endif WFLAGS+=-Wundef ifndef GCC295 WFLAGS+=-Wendif-labels endif ifdef GCC41 WFLAGS+=-Wshadow endif #WFLAGS+=-Wlarger-than-%len% WFLAGS+=-Wpointer-arith -Wbad-function-cast ifdef GCC45 #WFLAGS+=-Wc++-compat endif WFLAGS+=-Wcast-qual ifndef NOCASTALIGNWARN WFLAGS+=-Wcast-align endif WFLAGS+=-Wwrite-strings ifndef ERRORMODE #WFLAGS+=-Wconversion ifdef GCC43 #WFLAGS+=-Wno-sign-conversion endif endif WFLAGS+=-Wsign-compare ifdef GCC91 WFLAGS+=-Wno-error=address-of-packed-member endif ifdef GCC45 WFLAGS+=-Wlogical-op endif WFLAGS+=-Waggregate-return ifdef HAIKU ifdef GCC41 #WFLAGS+=-Wno-attributes endif endif #WFLAGS+=-Wstrict-prototypes ifdef GCC40 WFLAGS+=-Wold-style-definition endif WFLAGS+=-Wmissing-prototypes -Wmissing-declarations ifdef GCC40 WFLAGS+=-Wmissing-field-initializers endif WFLAGS+=-Wmissing-noreturn #WFLAGS+=-Wmissing-format-attribute #WFLAGS+=-Wno-multichar #WFLAGS+=-Wno-deprecated-declarations #WFLAGS+=-Wpacked #WFLAGS+=-Wpadded #WFLAGS+=-Wredundant-decls WFLAGS+=-Wnested-externs #WFLAGS+=-Wunreachable-code WFLAGS+=-Winline ifdef GCC43 WFLAGS+=-funit-at-a-time WFLAGS+=-Wlogical-op endif ifndef GCC295 WFLAGS+=-Wdisabled-optimization endif endif WFLAGS+=-Wformat-y2k ifdef GCC71 WFLAGS+=-Wno-error=format-overflow=2 endif WFLAGS+=-Wformat-security ifndef GCC29 #WFLAGS+=-Winit-self endif ifdef GCC46 WFLAGS+=-Wno-suggest-attribute=noreturn endif ifdef NOLDWARNING LDFLAGS+=-Wl,--as-needed endif ifdef ERRORMODE WFLAGS+=-Werror endif WFLAGS+=$(OLDWFLAGS) ifdef GCC43 #WFLAGS+=-Wno-error=clobbered endif ifdef GCC44 WFLAGS+=-Wno-error=array-bounds endif ifdef GCC46 WFLAGS+=-Wno-error=suggest-attribute=noreturn endif ifdef GCC54 WFLAGS+=-Wno-logical-op -Wno-error=logical-op endif ifdef GCC61 WFLAGS+=-Wno-tautological-compare -Wno-error=tautological-compare endif ifdef GCC71 WFLAGS+=-Wimplicit-fallthrough=4 endif ifdef GCC81 WFLAGS+=-Wno-error=format-overflow WFLAGS+=-Wno-error=stringop-truncation WFLAGS+=-Wno-error=stringop-overflow WFLAGS+=-Wno-format-overflow WFLAGS+=-Wno-stringop-truncation WFLAGS+=-Wno-stringop-overflow WFLAGS+=-Wno-error=multistatement-macros endif #indicate platform and what interface use with ifndef LINUX ifndef FREEBSD ifndef CYGWIN32 ifndef MINGW ifndef MINGW64 ifndef SDL ifndef DUMMY $(error No interface or platform flag defined) endif endif endif endif endif endif endif #determine the interface directory (where you put all i_*.c) i_net_o=$(OBJDIR)/i_net.o i_system_o=$(OBJDIR)/i_system.o i_sound_o=$(OBJDIR)/i_sound.o i_main_o=$(OBJDIR)/i_main.o #set OBJDIR and BIN's starting place OBJDIR=../objs BIN=../bin DEPDIR=../dep #Nasm ASM and rm ifdef YASM NASM?=yasm else NASM?=nasm endif REMOVE?=rm -f MKDIR?=mkdir -p GZIP?=gzip GZIP_OPTS?=-9 -f -n GZIP_OPT2=$(GZIP_OPTS) --rsyncable UPX?=upx UPX_OPTS?=--best --preserve-build-id ifndef ECHO UPX_OPTS+=-q endif #Interface Setup ifdef DUMMY INTERFACE=dummy OBJDIR:=$(OBJDIR)/dummy BIN:=$(BIN)/dummy DEPDIR:=$(DEPDIR)/dummy else ifdef LINUX NASMFORMAT=elf -DLINUX SDL=1 ifdef LINUX64 OBJDIR:=$(OBJDIR)/Linux64 BIN:=$(BIN)/Linux64 DEPDIR:=$(DEPDIR)/Linux64 else OBJDIR:=$(OBJDIR)/Linux BIN:=$(BIN)/Linux DEPDIR:=$(DEPDIR)/Linux endif else ifdef FREEBSD INTERFACE=sdl NASMFORMAT=elf -DLINUX SDL=1 OBJDIR:=$(OBJDIR)/FreeBSD BIN:=$(BIN)/FreeBSD DEPDIR:=$(DEPDIR)/Linux else ifdef SOLARIS INTERFACE=sdl NASMFORMAT=elf -DLINUX SDL=1 OBJDIR:=$(OBJDIR)/Solaris BIN:=$(BIN)/Solaris DEPDIR:=$(DEPDIR)/Solaris else ifdef CYGWIN32 INTERFACE=sdl NASMFORMAT=win32 SDL=1 OBJDIR:=$(OBJDIR)/cygwin BIN:=$(BIN)/Cygwin DEPDIR:=$(DEPDIR)/Cygwin else ifdef MINGW64 #NASMFORMAT=win64 SDL=1 OBJDIR:=$(OBJDIR)/Mingw64 BIN:=$(BIN)/Mingw64 DEPDIR:=$(DEPDIR)/Mingw64 else ifdef MINGW NASMFORMAT=win32 SDL=1 OBJDIR:=$(OBJDIR)/Mingw BIN:=$(BIN)/Mingw DEPDIR:=$(DEPDIR)/Mingw endif endif endif endif endif endif endif ifdef ARCHNAME OBJDIR:=$(OBJDIR)/$(ARCHNAME) BIN:=$(BIN)/$(ARCHNAME) DEPDIR:=$(DEPDIR)/$(ARCHNAME) endif OBJDUMP_OPTS?=--wide --source --line-numbers LD=$(CC) ifdef SDL INTERFACE=sdl OBJDIR:=$(OBJDIR)/SDL DEPDIR:=$(DEPDIR)/SDL endif ifndef DUMMY ifdef DEBUGMODE OBJDIR:=$(OBJDIR)/Debug BIN:=$(BIN)/Debug DEPDIR:=$(DEPDIR)/Debug else OBJDIR:=$(OBJDIR)/Release BIN:=$(BIN)/Release DEPDIR:=$(DEPDIR)/Release endif endif