#------------------------------------------------------------------------------
# Alpha Shooter
# A 3D OpenGL First-Person Shooter game
# Copyright (C) 2005, 2006, 2007 Nicola Cocchiaro <ncocchiaro@users.sf.net>
# Alpha Shooter can be found at http://www.sf.net/projects/alphashooter.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 (or, at your 
# option, any later version) as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#------------------------------------------------------------------------------

# Alpha Shooter main makefile


SHELL=/bin/sh
prefix?=$(DESTDIR)/usr/local
exec_prefix=$(prefix)
bindir=$(exec_prefix)/games
DATADIR=$(prefix)/share/games
INSTALL=install
INSTALL_PROGRAM=$(INSTALL)
INSTALL_DATA=$(INSTALL) -m 644

CC=gcc
LD=gcc
NAME=alphashooter

SRCPATH=src
DATAPATH=data
DOCPATH=doc
LIBPATH=lib
WINPATH=windows
DEBPATH=debian
STATLIST=$(SRCPATH)/*.c $(SRCPATH)/*.h
ifeq ($(shell uname),Darwin)
	MINGW_PATH = /opt/mingw
	MINGWCC = $(MINGW_PATH)/bin/i586-mingw32msvc-gcc
	MINGWLD = $(MINGW_PATH)/bin/i586-mingw32msvc-gcc
	MINGWCFLAGS = -I$(MINGW_PATH)/include
	MINGWLDFLAGS = -L$(MINGW_PATH)/lib
else
	MINGW_PATH = /usr/i586-mingw32msvc
	MINGWCC = i586-mingw32msvc-gcc
	MINGWLD = i586-mingw32msvc-gcc
	MINGWCFLAGS = -I$(MINGW_PATH)/include
	MINGWLDFLAGS = -L$(MINGW_PATH)/lib -L$(LIBPATH)
endif
RELDIR=release
RELDEBDIR=release-deb
DEBDISTDIR=dists/unstable/main

VERSION=0.0.3
CFLAGS=-Wall -g -ggdb -O3 -D ALPSHOOT_VERSION="\"$(VERSION)\""
LDFLAGS=-lm -D ALPSHOOT_VERSION="\"$(VERSION)\""

export INSTALL=install
export INSTALL_PROGRAM=$(INSTALL)
export INSTALL_DATA=$(INSTALL) -m 644

.SUFFIXES:
.SUFFIXES: .c .o
SRC=$(shell ls $(SRCPATH)/*.c 2> /dev/null)
OBJ=$(SRC:.c=.o)

DATE=$(shell date +%d%m%y)

.PHONY: help all linux osx win cygwin cyg32 dist-dir dist-gz dist-bz2 dist-win dist-deb deb-repository dist-mac release stats install installdirs uninstall uninstall-exe uninstalldirs clean dist-clean

help:
	@echo ""
	@echo "Alpha Shooter $(VERSION) - a 3D OpenGL First Person Shooter"
	@echo "Copyright (C) 2005, 2006, 2007 - Nicola Cocchiaro"
	@echo "Released under the GNU General Public License 3"
	@echo ""
	@echo "Alpha Shooter $(VERSION) Makefile"
	@echo "Supported Makefile targets:"
	@echo ""
	@echo "- help:		print this message"
	@echo "- stats:	show some source code stats"
	@echo "- clean:	clean source tree"
	@echo "- install:	install game in default path"
	@echo "- uninstall:	uninstall the game"
	@echo ""
	@echo "System-specific targets:"
	@echo ""
	@echo "- linux:	build the game for Linux"
	@echo "- osx:		build the game for Mac OS X"
	@echo "- win:		build the game for Windows (native)"
	@echo "- cygwin:	build the game for CygWin"
	@echo "- cyg32:	build the game for Windows (native) from CygWin"
	@echo ""
	@echo "Distribution targets (not all may be buildable on all systems):"
	@echo ""
	@echo "- dist-gz:	build a source distribution .tar.gz file"
	@echo "- dist-bz2:	build a source distribution .tar.bz2 file"
	@echo "- dist-win:	build a Windows binary distribution and installer"
	@echo "- dist-deb:	build a Debian Linux binary distribution"
	@echo "- dist-mac:	build a DMG disk image for Mac OS X"
	@echo "- dist-clean:	clean source tree more accurately"
	@echo ""

all: $(OBJ)
	$(LD) -o $(NAME) $(OBJ) $(LDFLAGS)

linux: CFLAGS += -I/usr/X11R6/include
linux: LDFLAGS += -L/usr/lib -L/usr/X11R6/lib -lglut
linux: all

osx: CFLAGS += -I/Developer/SDKs/MacOSX10.3.0.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Developer/SDKs/MacOSX10.3.0.sdk/System/Library/Frameworks/GLUT.framework/Headers -DALPSHOOT_MACOSX -D__BIG_ENDIAN
osx: LDFLAGS += -framework opengl -framework glut -framework cocoa -DALPSHOOT_MACOSX -D__BIG_ENDIAN
osx: all

win: CC = $(MINGWCC)
win: LD = $(MINGWLD)
win: CFLAGS +=  $(MINGWCFLAGS) -DALPSHOOT_WIN32
win: LDFLAGS += $(MINGWLDFLAGS) -lopengl32 -lglu32 $(LIBPATH)/glut32.lib -mconsole -mwindows -DALPSHOOT_WIN32
win: all
	@mv $(NAME) $(NAME).exe

cygwin: LDFLAGS += -lglut32 -lglu32 -lopengl32
cygwin: all
 
cyg32: CFLAGS += -mno-cygwin
cyg32: LDFLAGS += -mno-cygwin
cyg32: cygwin

dist-dir: clean
	@[ -d $(NAME)-$(VERSION) ] || mkdir $(NAME)-$(VERSION)
	@cp -Rp Makefile AUTHORS COPYING README TODO ChangeLog $(SRCPATH) $(DATAPATH) $(DOCPATH) $(LIBPATH) $(WINPATH) debian $(NAME)-$(VERSION)

dist-gz:
	@$(MAKE) dist-dir
	@tar czvf $(NAME)-$(DATE).tar.gz --exclude=CVS $(NAME)-$(VERSION)
	@-rm -rf $(NAME)-$(VERSION)

dist-bz2:
	@$(MAKE) dist-dir
	@tar cjvf $(NAME)-$(DATE).tar.bz2 --exclude=CVS $(NAME)-$(VERSION)
	@-rm -rf $(NAME)-$(VERSION)

dist-win: clean win
	@[ -d $(NAME)-$(VERSION) ] || mkdir $(NAME)-$(VERSION)
	@cp -Rp $(NAME).exe AUTHORS COPYING README TODO ChangeLog $(DATAPATH) $(DOCPATH) $(LIBPATH)/glut32.dll $(LIBPATH)/README-win32.txt \
		$(WINPATH)/*.url $(NAME)-$(VERSION)
	@cd $(NAME)-$(VERSION);rm -rf $(DATAPATH)/CVS $(DOCPATH)/CVS
	@cd $(NAME)-$(VERSION);mv README README.txt;mv TODO TODO.txt;mv ChangeLog ChangeLog.txt;mv AUTHORS AUTHORS.txt;mv COPYING COPYING.txt;unix2dos *.txt
	@cd $(NAME)-$(VERSION);mv *.txt $(DOCPATH);mv $(DOCPATH)/README.txt ./
	@cd $(NAME)-$(VERSION)/$(DATAPATH);unix2dos *.txt
	@zip -9 -r $(NAME)-$(DATE) $(NAME)-$(VERSION)
	@sed 's/%ALPHASHOOTERVERSION/$(VERSION)/' $(WINPATH)/$(NAME).nsi.in > $(NAME)-$(VERSION)/$(NAME).nsi
	@cd $(NAME)-$(VERSION);makensis $(NAME).nsi 
	@mv $(NAME)-$(VERSION)/$(NAME)-$(VERSION).exe ./
	@-rm -rf $(NAME)-$(VERSION)
	@$(MAKE) clean

dist-deb:
	@[ -d $(NAME)-$(VERSION) ] || mkdir $(NAME)-$(VERSION)
	@cp -Rp Makefile AUTHORS COPYING README TODO ChangeLog $(SRCPATH) $(DATAPATH) $(DOCPATH) debian $(NAME)-$(VERSION)
	@cd $(NAME)-$(VERSION);rm -rf $(DATAPATH)/CVS $(DOCPATH)/CVS $(SRCPATH)/CVS debian/CVS
	@tar czvf $(NAME)-$(VERSION).tar.gz --exclude=CVS $(NAME)-$(VERSION)
	@mv $(NAME)-$(VERSION).tar.gz $(NAME)_$(VERSION).orig.tar.gz
	@cd $(NAME)-$(VERSION); dpkg-buildpackage -rfakeroot -uc -us
	@lintian -vi $(NAME)*.changes
	@linda -vi $(NAME)*.changes
	@rm -f $(NAME)*.changes
	@rm -rf $(NAME)-$(VERSION)

deb-repository: BINARYDEB=$(addprefix binary-, $(shell find . -maxdepth 1 -name '*.deb' | head -n 1 | cut -f3 -d_ | cut -f1 -d.))
deb-repository:
	@[ -d $(RELDEBDIR) ] || mkdir $(RELDEBDIR)
	@[ -d $(RELDEBDIR)/$(DEBDISTDIR)/$(BINARYDEB) ] || mkdir -p $(RELDEBDIR)/$(DEBDISTDIR)/$(BINARYDEB)
	@[ -d $(RELDEBDIR)/$(DEBDISTDIR)/source ] || mkdir $(RELDEBDIR)/$(DEBDISTDIR)/source
	@mv *.deb $(RELDEBDIR)/$(DEBDISTDIR)/$(BINARYDEB)
	@mv *.dsc *.orig.tar.gz *.diff.gz $(RELDEBDIR)/$(DEBDISTDIR)/source
	@echo -e "$(NAME) optional games" > $(RELDEBDIR)/$(DEBDISTDIR)/$(BINARYDEB)/overridefile; cp $(RELDEBDIR)/$(DEBDISTDIR)/$(BINARYDEB)/overridefile $(RELDEBDIR)/$(DEBDISTDIR)/source/
	@cd $(RELDEBDIR); dpkg-scanpackages $(DEBDISTDIR)/$(BINARYDEB) $(DEBDISTDIR)/$(BINARYDEB)/overridefile | gzip -9c > $(DEBDISTDIR)/$(BINARYDEB)/Packages.gz
	@cd $(RELDEBDIR); dpkg-scansources $(DEBDISTDIR)/source $(DEBDISTDIR)/source/overridefile | gzip -9c > $(DEBDISTDIR)/source/Sources.gz

dist-mac: clean osx
	@[ -d $(NAME)-$(VERSION) ] || mkdir $(NAME)-$(VERSION)
	@[ -d $(RELDIR)-$(VERSION) ] || mkdir $(RELDIR)-$(VERSION)
	@cp -Rp $(NAME) AUTHORS COPYING README TODO ChangeLog $(DATAPATH) $(DOCPATH) $(NAME)-$(VERSION)
	@cd $(NAME)-$(VERSION);rm -rf $(DATAPATH)/CVS $(DOCPATH)/CVS
	@hdiutil create $(NAME)-$(VERSION).dmg -srcfolder $(NAME)-$(VERSION) -fs HFS+ -volname "Alpha Shooter $(VERSION)"
	@mv $(NAME)-$(VERSION).dmg $(RELDIR)-$(VERSION)/
	@cd $(RELDIR)-$(VERSION);md5sum * > $(NAME)-$(VERSION)-md5sums.txt
	@-rm -rf $(NAME)-$(VERSION)
	@$(MAKE) clean

release: dist-gz dist-bz2 dist-win dist-deb
	@[ -d $(RELDIR)-$(VERSION) ] || mkdir $(RELDIR)-$(VERSION)
	@mv $(NAME)-$(DATE).tar.gz $(RELDIR)-$(VERSION)/$(NAME)-$(VERSION).tar.gz
	@mv $(NAME)-$(DATE).tar.bz2 $(RELDIR)-$(VERSION)/$(NAME)-$(VERSION).tar.bz2
	@mv $(NAME)-$(DATE).zip $(RELDIR)-$(VERSION)/$(NAME)-$(VERSION).zip
	@mv $(NAME)-$(VERSION).exe $(RELDIR)-$(VERSION)/
	@cp $(NAME)_$(VERSION)-*.deb $(RELDIR)-$(VERSION)/
	@cd $(RELDIR)-$(VERSION);md5sum * > $(NAME)-$(VERSION)-md5sums.txt
	@-rm -rf $(NAME)-$(VERSION)
	@$(MAKE) deb-repository

stats:
	@echo ""
	wc Makefile $(STATLIST)
	@echo ""
	@echo "`grep TODO $(STATLIST) | wc -l`\
		TODO lines found"
	@echo "`grep FIXME $(STATLIST) | wc -l`\
		FIXME lines found"
	@echo "`grep -r "^[:space:]*//\|^[:space:]*/\*\|^\ \*[:space:]*\|^[:space:]*#[:space:]*" Makefile $(STATLIST) | wc -l` lines appear to be comments (but may not all be)"

install:
	@[ -x $(NAME) ] || [ -x $(NAME).exe ] || (echo "Compile the game for one of the supported targets first.";exit 1)
	@$(MAKE) installdirs
	@$(MAKE) install-exe

install-exe:
	@echo "Installing executables in $(bindir)..."
	$(INSTALL_PROGRAM) $(NAME) $(bindir)/$(NAME)
	@echo ""
	@echo "Installing game data in $(DATADIR)/$(NAME)/$(DATAPATH)..."
	$(INSTALL_DATA) $(DATAPATH)/*.tga $(DATADIR)/$(NAME)/$(DATAPATH)/
	$(INSTALL_DATA) $(DATAPATH)/*.mtl $(DATADIR)/$(NAME)/$(DATAPATH)/
	$(INSTALL_DATA) $(DATAPATH)/*.obj $(DATADIR)/$(NAME)/$(DATAPATH)/
	$(INSTALL_DATA) $(DATAPATH)/*.txt $(DATADIR)/$(NAME)/$(DATAPATH)/
	@echo "Done."

installdirs:
	@[ -d $(bindir) ] || mkdir -p $(bindir)
	@[ -d $(DATADIR)/$(NAME)/$(DATAPATH) ] || mkdir -p $(DATADIR)/$(NAME)/$(DATAPATH)

uninstall: uninstall-exe uninstalldirs
	@echo "Done."

uninstall-exe:
	@echo "Uninstalling executables in $(bindir)..."
	-rm -f $(bindir)/$(NAME)
	@echo ""
	@echo "Uninstalling game data in $(DATADIR)/$(NAME)..."
	-rm -rf $(DATADIR)/$(NAME)/*

uninstalldirs:
	-rmdir $(DATADIR)/$(NAME)

clean:
	-rm -f $(NAME) $(NAME).exe $(OBJ)

dist-clean: clean
	-rm -rf $(RELDIR)-$(VERSION) $(NAME)-$(VERSION) $(RELDEBDIR)
	-rm -f *.tar.gz *.tar.bz2 *.zip *.exe *.dsc *.changes *.diff.gz *.deb
