# 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
ifeq   (,$(filter GCC%,$(.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)))
   $(info\
		Your compiler version, GCC $(version), is not supported by the Makefile.\
		The Makefile will assume GCC $(LATEST_GCC_VERSION).)
   GCC$(subst .,,$(LATEST_GCC_VERSION))=1
  else
   $(info 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
#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
else
ifdef LINUX
	NASMFORMAT=elf -DLINUX
	SDL=1
ifdef LINUX64
	OBJDIR:=$(OBJDIR)/Linux64
	BIN:=$(BIN)/Linux64
else
	OBJDIR:=$(OBJDIR)/Linux
	BIN:=$(BIN)/Linux
endif
else
ifdef FREEBSD
	INTERFACE=sdl
	NASMFORMAT=elf -DLINUX
	SDL=1

	OBJDIR:=$(OBJDIR)/FreeBSD
	BIN:=$(BIN)/FreeBSD
else
ifdef SOLARIS
	INTERFACE=sdl
	NASMFORMAT=elf -DLINUX
	SDL=1

	OBJDIR:=$(OBJDIR)/Solaris
	BIN:=$(BIN)/Solaris
else
ifdef CYGWIN32
	INTERFACE=sdl
	NASMFORMAT=win32
	SDL=1

	OBJDIR:=$(OBJDIR)/cygwin
	BIN:=$(BIN)/Cygwin
else
ifdef MINGW64
	INTERFACE=win32
	#NASMFORMAT=win64
	OBJDIR:=$(OBJDIR)/Mingw64
	BIN:=$(BIN)/Mingw64
else
ifdef MINGW
	INTERFACE=win32
	NASMFORMAT=win32
	OBJDIR:=$(OBJDIR)/Mingw
	BIN:=$(BIN)/Mingw
endif
endif
endif
endif
endif
endif
endif

ifdef ARCHNAME
	OBJDIR:=$(OBJDIR)/$(ARCHNAME)
	BIN:=$(BIN)/$(ARCHNAME)
endif

OBJDUMP_OPTS?=--wide --source --line-numbers
LD=$(CC)

ifdef SDL
	INTERFACE=sdl
	OBJDIR:=$(OBJDIR)/SDL
endif

ifndef DUMMY
ifdef DEBUGMODE
	OBJDIR:=$(OBJDIR)/Debug
	BIN:=$(BIN)/Debug
else
	OBJDIR:=$(OBJDIR)/Release
	BIN:=$(BIN)/Release
endif
endif
