#-----------------------------------------------------------------------------#
# Duke3D makefile.
#-----------------------------------------------------------------------------#

linux_ppc := false
beos := false
macosx := false
freebsd := false
solaris := false
shareware := false
controls_menu := true
#use_asm := true

#-----------------------------------------------------------------------------#
# If this makefile fails to detect Cygwin correctly, or you want to force
#  the build process's behaviour, set it to "true" or "false" (w/o quotes).
#-----------------------------------------------------------------------------#
#cygwin := true
#cygwin := false
cygwin := autodetect

# you only need to set these for Cygwin at the moment.
SDL_INC_DIR = /cygdrive/c/SDL/include
SDL_LIB_DIR = /cygdrive/c/SDL/lib

CC = gcc

# need this for now.
ifeq ($(strip $(beos)),true)
  use_asm := false
endif

# Don't touch anything below this line unless you know what you're doing.

ifeq ($(strip $(cygwin)),autodetect)
  ifneq ($(strip $(shell gcc -v 2>&1 |grep "cygwin")),)
    cygwin := true
  else
    cygwin := false
  endif
endif


ifeq ($(strip $(cygwin)),true)
  ifeq ($(strip $(SDL_INC_DIR)),please_set_me_cygwin_users)
    $(error Cygwin users need to set the SDL_INC_DIR envr var.)
  else
    SDL_CFLAGS := -I$(SDL_INC_DIR)
  endif

  ifeq ($(strip $(SDL_LIB_DIR)),please_set_me_cygwin_users)
    $(error Cygwin users need to set the SDL_LIB_DIR envr var.)
  else
    SDL_LDFLAGS := -L$(SDL_LIB_DIR) -lSDL
  endif

else
  ifneq ($(strip $(freebsd)),true)
    SDL_CFLAGS := $(shell sdl-config --cflags)
    SDL_LDFLAGS := $(shell sdl-config --libs) -L.
  endif
endif

ifeq ($(strip $(macosx)),true)
  EXTRACFLAGS += -DPLATFORM_MACOSX=1
  EXTRALDFLAGS += -lSDLmain
endif

ifeq ($(strip $(freebsd)),true)
  EXTRACFLAGS += -DPLATFORM_FREEBSD=1
  SDL_CFLAGS := $(shell sdl11-config --cflags)
  SDL_LDFLAGS := $(shell sdl11-config --libs) -L.
endif

ifeq ($(strip $(linux_ppc)),true)
  EXTRACFLAGS += -DPLATFORM_LINUXPPC=1
endif

ifneq ($(strip $(cygwin)),true)
  ifneq ($(strip $(macosx)),true)
    ifneq ($(strip $(beos)),true)
      EXTRACFLAGS += -DUSE_EXECINFO=1
    endif
  endif
endif

ifeq ($(strip $(solaris)),true)
  CC = cc
  EXTRALDFLAGS += -lsocket -lnsl
  CFLAGS += -DPLATFORM_SOLARIS
endif

ifeq ($(strip $(shareware)),true)
  EXTRACFLAGS += -DVOLUMEONE
else
  EXTRACFLAGS += -DVOLUMEALL
endif

ifeq ($(strip $(controls_menu)),true)
  EXTRACFLAGS += -DCONTROLS_CONFIG_MENU=1
endif

BUILDOBJS := \
	buildengine/cache1d.o \
	buildengine/engine.o \
	buildengine/sdl_driver.o \
	buildengine/mmulti.o \
	buildengine/pragmas.o \
	buildengine/unix_compat.o

ifeq ($(strip $(use_asm)),true)
	BUILDOBJS += buildengine/a_gnu.o buildengine/a_nasm.o
else
	BUILDOBJS += buildengine/a.o
endif

CFLAGS=-m32 -c -g $(SDL_CFLAGS) -DUSE_SDL=1 -DPLATFORM_UNIX=1 $(EXTRACFLAGS)

ifeq ($(strip $(solaris)),true)
	CFLAGS += -xO5 -xchar=u
else
	# Always turn OFF strict aliasing, even when optimizing. Otherwise, this
	#  is just an accident waiting to happen...  --ryan.
	CFLAGS += -fno-strict-aliasing
	CFLAGS += -W -Wall -Wno-unused -funsigned-char
	ifeq ($(strip $(macosx)),true)
		OPTIMIZE = -O3 -mdynamic-no-pic -falign-loops=16
	else
		OPTIMIZE = -O2
	endif
endif

# Uncomment this to compile with the Intel compiler (v6.0)
#CC = icc
#CFLAGS = -g $(SDL_CFLAGS) -DUSE_SDL=1 -DPLATFORM_UNIX=1 -DUSE_I386_ASM=1 $(EXTRACFLAGS) -O2

LDLIBS = -lSDL -lSDL_mixer $(EXTRALDFLAGS)

ifeq ($(strip $(freebsd)),true)
LDLIBS = -lSDL_mixer $(EXTRALDFLAGS)
endif

# !!! FIXME: Do we even need this? It doesn't fly on MacOS X.  --ryan.
#LDLIBS += -Wl,-E

.PHONY: duke3d build buildengine clean distclean
all: buildengine duke3d build


%.o : %.c
	$(CC) $(CFLAGS) $(OPTIMIZE) -o $@ $<

# Animation playback crashes due to optimization error on MacOS X. --ryan.
ifeq ($(strip $(macosx)),true)
animlib.o : animlib.c
	$(CC) $(CFLAGS) -o $@ $<
endif

# Animation playback crashes due to optimization error on Linux PPC. --Felipe Barriga.
ifeq ($(strip $(linux_ppc)),true)
animlib.o : animlib.c
	$(CC) $(CFLAGS) -o $@ $<
endif

audiolib/audiolib.a:
	$(MAKE) -C audiolib CC="$(CC)" CFLAGS="$(CFLAGS)" LDLIBS="$(LDLIBS)"

buildengine:
	make -C buildengine

duke3d: \
	actors.o \
	animlib.o \
	control.o \
	config.o \
	game.o \
	gamedef.o \
	global.o \
	keyboard.o \
	menues.o \
	player.o \
	premap.o \
	rts.o \
	scriplib.o \
	sector.o \
	sounds.o \
	dukemusc.o \
	audiolib/audiolib.a
	$(CC) -m32 $^ $(BUILDOBJS) $(LDLIBS) -o $@

build: astub.o
	$(CC) -m32 $^ $(BUILDOBJS) buildengine/build.o $(LDLIBS) -o $@

clean:
	$(MAKE) -C audiolib clean
	$(MAKE) -C buildengine clean
	rm -rf duke3d build *.o

distclean: clean
	$(MAKE) -C audiolib distclean
	$(MAKE) -C buildengine distclean
	rm -rf *~
