# OPTIONS.
DEBUG := 1
#DEBUG_PARANOID := 1
export DEBUG

OS := LINUX
#OS := FREEBSD
#OS := WIN32
#OS := MACOS
export OS

# Data path.
#LDATA_DEF := \"../ldata\"

#CC = clang

# VERSION.
VMAJOR			:= 0
VMINOR			:= 3
VREV				:= 5
VERSION			= -DVMAJOR=$(VMAJOR) -DVMINOR=$(VMINOR) -DVREV=$(VREV)
VERSIONFILE	= VERSION

# OBJECTS.
APPNAME := Lephisto
OBJS		:= $(patsubst %.c, %.o, $(wildcard ../src/*.c))

# CFLAGS
CLUA 			:= -I../lib/lua
CCSPARSE 	:= -I../lib/csparse
CSDL 			:= $(shell sdl-config --cflags) -DGL_GLEXT_PROTOTYPES
CXML 			:= $(shell xml2-config --cflags)
CTTF 			:= $(shell freetype-config --cflags)
CPNG 			:= #$(shell libpng-config libpng --cflags)
CGL  			:=
CFLAGS := $(CLUA) $(CCSPARSE) $(CSDL) $(CXML) $(CTTF) $(CPNG) $(CGL) $(VERSION) -D$(OS)
ifdef LDATA_DEF
CFLAGS += -DLDATA_DEF=$(LDATA_DEF)
endif

# OS Stuff.

# Linux Stuff.
ifeq ($(OS),LINUX)
CFLAGS += -D_POSIX_SOURCE
endif

# FreeBSD stuff.
ifeq ($(OS),FREEBSD)
	CFLAGS += -D_POSIX_SOURCE -D__BSD_VISIBLE
endif

# Debug stuff.
ifdef DEBUG
CFLAGS += -W -Wall -Wextra -Wunused -Wshadow -Wpointer-arith -Wmissing-prototypes \
					-Winline -Wcast-align -Wmissing-declarations -fstack-protector \
					-fstack-protector-all -g -DDEBUG -DLUA_USE_APICHECK -std=c99

ifdef DEBUG_PARANOID
CFLAGS += -DDEBUG_PARANOID
endif

# Handle OS Debug stuff here.

# Linux Stuff.
ifeq ($(OS), LINUX)
LDFLAGS += -rdynamic
endif # Linux.

# FreeBSD stuff.
ifeq ($(OS), FREEBSD)
	LDFLAGS += -rdynamic
endif

else # DEBUG
CFLAGS += -O2 -funroll-loops -pipe -std=c99
endif

# LDFLAGS.
LDLUA 			:= ../lib/lua/liblua.a
LDCSPARSE		:= ../lib/csparse/libcsparse.a
LDSDL 			:= $(shell sdl-config --libs) -lSDL_image -lSDL_mixer -lpng
LDXML 			:= $(shell xml2-config --libs)
LDTTF 			:= $(shell freetype-config --libs)
CPNG 				:= #$(shell libpng-config libpng --libs)
LDGL				:= -lGL
LDFLAGS 		:= -lm $(LDLUA) $(LDCSPARSE) $(LDSDL) $(LDXML) $(LDTTF) $(CPNG) $(LDGL) $(LDPNG)

# This is just for gstat to run some analysis on performance.
ifdef DEBUG
LDFLAGS += -pg
endif

# DATA.
DATA_AI   := 	$(wildcard ../scripts/ai/*.lua \
										../scripts/ai/*/*.lua)
DATA_GFX  := 	$(wildcard ../gfx/*.png \
										../gfx/*/*.png \
										../gfx/*/*/*.png)
DATA_XML  := 	$(wildcard ../dat/*.xml ../dat/*.ttf ../dat/intro)
DATA_SND  := 	$(wildcard ../snd/music/*.ogg \
										../snd/sounds/*.wav) ../snd/music.lua
DATA_MISN := 	$(wildcard ../dat/missions/*.lua \
										../dat/missions/*/*.lua \
										../dat/mission/*/*/*.lua)

DATA      := 	ldata
DATAFILES := 	$(DATA_AI) $(DATA_GFX) $(DATA_XML) $(DATA_SND) $(DATA_MISN)

# TARGETS.
.PHONY: all help csparse lua utils docs clean distclean

%.o: %.c %.h
	@$(CC) -c $(CFLAGS) -o $@ $<
	@echo "		CC $@"

all: utils ldata lua csparse Lephisto

help:
	@echo "Possible targets are:":
	@echo "		lua 			- Builds Lua support."
	@echo "		csparse		- Builds CSparse support."
	@echo "		lephisto 	- Builds the Lephisto binary."
	@echo "		mkspr			- Builds the mkspr utility."
	@echo "		ldata			- Creates the ldata file."
	@echo "		utils			- Builds all the utilities."
	@echo "		docs			- Creates the doxygen documentation."
	@echo "		clean			- Removes Lephisto's main binary and ldata file."
	@echo " 	distclean	- Removes everything done."

$(APPNAME): $(OBJS)
	@$(CC) $(LDFLAGS) -o $(APPNAME) $(OBJS) ../lib/lua/liblua.a ../lib/csparse/libcsparse.a
	@echo "		LD $(APPNAME)"

lua: ../lib/lua/liblua.a

../lib/lua/liblua.a:
	+@$(MAKE) -C ../lib/lua a

csparse: ../lib/csparse/libcsparse.a

../lib/csparse/libcsparse.a:
	+@$(MAKE) -C ../lib/csparse

pack: ../src/md5.c ../src/pack.c ../utils/pack/main.c
	@$(MAKE)  -C ../utils/pack

mksprite: ../utils/mkspr/main.c
	@$(MAKE) -C ../utils/mkspr

$(VERSIONFILE):
	@echo -n "$(VMAJOR).$(VMINOR).$(VREV)" > $(VERSIONFILE)

ldata: pack $(DATAFILES)
	@echo -n "$(VMAJOR).$(VMINOR).$(VREV)" > $(VERSIONFILE)
	@echo "		Creating ldata..\n"
	@./pack $(DATA) $(DATAFILES) $(VERSIONFILE)

utils: pack mksprite

docs:
	+@$(MAKE) -C ../docs/

clean:
	@echo "		Removing ldata"
	@$(RM) $(DATA)
	@echo "		Removing object files"
	@$(RM) $(OBJS)
	@echo "		Removing main binary ($(APPNAME))"
	@$(RM) $(APPNAME)

distclean: clean
	@echo "		Cleaning utilites"
	@$(MAKE) -C ../utils/pack clean
	@$(MAKE) -C ../utils/mkspr clean
	@echo "		Cleaning Lua"
	@$(MAKE) -C ../lib/lua clean
	@echo "		Cleaning CSparse."
	@$(MAKE) -C ../lib/csparse clean
	@echo "		Removing build tool binaries."
	@$(RM) Lephisto mksprite ldata pack gmon.out VERSION