# Variable definitions used to control the build process.
######################################################################

NAME      = gecco
VERSION   = 1_0beta
LONG_NAME = GECCO 1.0beta, a platform for command and control gaming

DISTALL   = $(NAME)-$(VERSION)-all
DISTBIN   = $(NAME)-$(VERSION)-bin
DISTSRC   = $(NAME)-$(VERSION)-src

GZIP      = gzip
JAVAC     = javac
JAR       = jar
JAVADOC   = javadoc
TAR       = tar
ZIP       = zip

JFLAGS    = -O

CLASSPATH = classes
ROOTDIR   = classes

GAMES = firefighter oresund testgame

SOURCE = $(SOURCE_CLIENT) $(SOURCE_COMMUNICATION) $(SOURCE_SERVER) $(SOURCE_UTIL) $(SOURCE_PJA)

SOURCE_PJA           = `find src/com/eteks -type f -name *.java`

SOURCE_CLIENT        = `find src/gecco/client -type f -name *.java`
SOURCE_COMMUNICATION = `find src/gecco/communication -type f -name *.java`
SOURCE_SERVER        = `find src/gecco/server -type f -name *.java`
SOURCE_UTIL          = `find src/gecco/util -type f -name *.java`

SOURCE_FIREFIGHTER   = `find src/gecco/game/firefighter -type f -name *.java`
SOURCE_ORESUND       = `find src/gecco/game/oresund -type f -name *.java`
SOURCE_TESTGAME      = `find src/gecco/game/testgame -type f -name *.java`

CLASSES_CLIENT       = gecco/client gecco/communication/messages gecco/communication/client
CLASSES_SERVER       = com/eteks gecco/server gecco/util gecco/communication/messages gecco/communication/server

CLASSES_FIREFIGHTER  = gecco/game/firefighter
CLASSES_ORESUND      = gecco/game/oresund
CLASSES_TESTGAME     = gecco/game/testgame

# This creates a space-separated list of all packages. First, 'find'
# finds all .java files. Then 'cat' concatenates them to one long
# stream, and feeds that to 'grep', which extracts all lines beginning
# with "package". Those lines are fed to 'sed', which replaces all
# occurances of the string "package " with nothing. The result is fed
# to another copy of 'sed', which replaces a semicolon and anything
# that follows it to the end of the line with nothing. The result is a
# list of package names. Finally, 'sort' sorts the package names,
# removing duplicates.
PACKAGES = `cat \`find src -type f -name *.java\` | grep '^package' | sed -e 's/package //' | sed -e 's/;.*//' | sort -u`




# Bild targets that do the actual compiling.
######################################################################

.PHONY: all
all: gecco games

.PHONY: games
games: $(GAMES)

.PHONY: gecco
gecco:
	mkdir -p $(CLASSPATH)
	$(JAVAC) $(JFLAGS) -classpath $(CLASSPATH) -d $(ROOTDIR) $(SOURCE)
	mkdir -p $(CLASSPATH)/gecco/client/icons
	cp src/gecco/client/icons/*.gif $(CLASSPATH)/gecco/client/icons
	mkdir -p lib
	cd $(CLASSPATH); \
	$(JAR) cmf ../src/gecco/server/manifest.txt ../lib/gecco-server.jar $(CLASSES_SERVER); \
	$(JAR) cmf ../src/gecco/client/manifest.txt ../lib/gecco-client.jar $(CLASSES_CLIENT)

.PHONY: firefighter
firefighter:
	mkdir -p $(CLASSPATH)
	$(JAVAC) $(JFLAGS) -classpath $(CLASSPATH) -d $(ROOTDIR) $(SOURCE_FIREFIGHTER)
	mkdir -p lib/game/firefighter/classes
	cd $(CLASSPATH); \
	$(JAR) cf ../lib/game/firefighter/classes/classes.jar $(CLASSES_FIREFIGHTER)
	mkdir -p lib/game/firefighter/images
	cp src/gecco/game/firefighter/images/*.gif lib/game/firefighter/images
	mkdir -p lib/game/firefighter/conf
	cp src/gecco/game/firefighter/conf/*.conf lib/game/firefighter/conf
	cp src/gecco/game/firefighter/text/*.txt lib/game/firefighter

.PHONY: oresund
oresund:
	mkdir -p $(CLASSPATH)
	$(JAVAC) $(JFLAGS) -classpath $(CLASSPATH) -d $(ROOTDIR) $(SOURCE_ORESUND)
	mkdir -p lib/game/oresund/classes
	cd $(CLASSPATH); \
	$(JAR) cf ../lib/game/oresund/classes/classes.jar $(CLASSES_ORESUND)
	mkdir -p lib/game/oresund/images
	cp src/gecco/game/oresund/images/*.gif lib/game/oresund/images
	mkdir -p lib/game/oresund/conf
	cp src/gecco/game/oresund/conf/*.conf lib/game/oresund/conf
	cp src/gecco/game/oresund/text/*.txt lib/game/oresund

.PHONY: testgame
testgame:
	mkdir -p $(CLASSPATH)
	$(JAVAC) $(JFLAGS) -classpath $(CLASSPATH) -d $(ROOTDIR) $(SOURCE_TESTGAME)
	mkdir -p lib/game/testgame/classes
	cd $(CLASSPATH); \
	$(JAR) cf ../lib/game/testgame/classes/classes.jar $(CLASSES_TESTGAME)
	mkdir -p lib/game/testgame/images
	cp src/gecco/game/testgame/images/*.gif lib/game/testgame/images
	mkdir -p lib/game/testgame/conf
	cp src/gecco/game/testgame/conf/*.conf lib/game/testgame/conf
	cp src/gecco/game/testgame/text/*.txt lib/game/testgame

.PHONY: javadoc
javadoc:
	mkdir -p javadoc
	$(JAVADOC) -private -sourcepath src -d javadoc -use -author -doctitle "$(LONG_NAME)" -windowtitle "$(LONG_NAME)" -link http://java.sun.com/products/jdk/1.3/docs/api -overview src/overview.html $(PACKAGES) > /dev/null




# Build targets that package everything up into archive files, ready
# to be downloaded.
######################################################################

.PHONY: dist
dist: dist-unixall dist-unixbin dist-unixsrc dist-unixjavadoc dist-winall dist-winbin dist-winsrc dist-winjavadoc

.PHONY: dist-genericall
dist-genericall: dist-genericbin dist-genericsrc
	mkdir -p dist/generic/alldist
	cp -R dist/generic/bindist/* dist/generic/alldist
	mkdir -p dist/generic/alldist/source
	cp -R dist/generic/srcdist/* dist/generic/alldist/source

.PHONY: dist-genericbin
dist-genericbin: all
	mkdir -p dist/generic/bindist
	cp -R lib/* dist/generic/bindist
	cp text/*.txt dist/generic/bindist

.PHONY: dist-genericsrc
dist-genericsrc: 
	mkdir -p dist/generic/srcdist
	cp -R src dist/generic/srcdist
	cp -R startscripts dist/generic/srcdist
	cp -R text dist/generic/srcdist
	cp Makefile dist/generic/srcdist
	rm -rf `find dist/generic/srcdist -type d -name CVS`

.PHONY: dist-genericjavadoc
dist-genericjavadoc: javadoc
	mkdir -p dist/generic/javadoc
	cp -R javadoc/* dist/generic/javadoc

.PHONY: dist-unixall
dist-unixall: dist-genericall
	mkdir -p dist/unix/alldist
	cp -R dist/generic/alldist/* dist/unix/alldist
	cp startscripts/unix/*.sh dist/unix/alldist
	cd dist/unix/alldist; \
	$(TAR) cf $(DISTALL).tar *; \
	$(GZIP) $(DISTALL).tar
	mv dist/unix/alldist/$(DISTALL).tar.gz dist/unix

.PHONY: dist-unixbin
dist-unixbin: dist-genericbin
	mkdir -p dist/unix/bindist
	cp -R dist/generic/bindist/* dist/unix/bindist
	cp startscripts/unix/*.sh dist/unix/bindist
	cd dist/unix/bindist; \
	$(TAR) cf $(DISTBIN).tar *; \
	$(GZIP) $(DISTBIN).tar
	mv dist/unix/bindist/$(DISTBIN).tar.gz dist/unix

.PHONY: dist-unixsrc
dist-unixsrc: dist-genericsrc
	mkdir -p dist/unix/srcdist
	cp -R dist/generic/srcdist/* dist/unix/srcdist
	cd dist/unix/srcdist; \
	$(TAR) cf $(DISTSRC).tar *; \
	$(GZIP) $(DISTSRC).tar
	mv dist/unix/srcdist/$(DISTSRC).tar.gz dist/unix

.PHONY: dist-unixjavadoc
dist-unixjavadoc: dist-genericjavadoc
	mkdir -p dist/unix/javadoc
	cp -R dist/generic/javadoc/* dist/unix/javadoc
	cd dist/unix/javadoc; \
	$(TAR) cf javadoc.tar *; \
	$(GZIP) javadoc.tar
	mv dist/unix/javadoc/javadoc.tar.gz dist/unix

.PHONY: dist-winall
dist-winall: dist-genericall
	mkdir -p dist/win/alldist
	cp -R dist/generic/alldist/* dist/win/alldist
	cp startscripts/win/*.bat dist/win/alldist
	cd dist/win/alldist; \
	$(ZIP) $(DISTALL).zip `find` > /dev/null
	mv dist/win/alldist/$(DISTALL).zip dist/win

.PHONY: dist-winbin
dist-winbin: dist-genericbin
	mkdir -p dist/win/bindist
	cp -R dist/generic/bindist/* dist/win/bindist
	cp startscripts/win/*.bat dist/win/bindist
	cd dist/win/bindist; \
	$(ZIP) $(DISTBIN).zip `find` > /dev/null
	mv dist/win/bindist/$(DISTBIN).zip dist/win

.PHONY: dist-winsrc
dist-winsrc: dist-genericsrc
	mkdir -p dist/win/srcdist
	cp -R dist/generic/srcdist/* dist/win/srcdist
	cd dist/win/srcdist; \
	$(ZIP) $(DISTSRC).zip `find` > /dev/null
	mv dist/win/srcdist/$(DISTSRC).zip dist/win

.PHONY: dist-winjavadoc
dist-winjavadoc: dist-genericjavadoc
	mkdir -p dist/win/javadoc
	cp -R dist/generic/javadoc/* dist/win/javadoc
	cd dist/win/javadoc; \
	$(ZIP) javadoc.zip `find` > /dev/null
	mv dist/win/javadoc/javadoc.zip dist/win

.PHONY: clean
clean:
	rm -f core *~
	rm -rf $(CLASSPATH) lib dist javadoc
