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

NAME      = DKE
VERSION   = 1.0
LONG_NAME = DKE, Dynamiskt Krigsspel för Experiment baserat på GECCO

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

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

JFLAGS    = -g

CLASSPATH = classes
ROOTDIR   = classes

GAMES     = dke

SOURCE = $(SOURCE_CLIENT) $(SOURCE_COMMON) $(SOURCE_COMMUNICATION) $(SOURCE_SERVER) $(SOURCE_UTIL) $(SOURCE_DKE)

SOURCE_CLIENT        = `find src/gecco/client -type f -name *.java`
SOURCE_COMMON        = `find src/gecco/common -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_DKE          = `find src/gecco/game/dke -type f -name *.java`

CLASSES_CLIENT       = gecco/client gecco/common gecco/communication/messages gecco/communication/client \
                       gecco/server/core/ActionDefinition.class gecco/util gecco/game/dke/Def.class
CLASSES_SERVER       = gecco/client/Action.class gecco/common gecco/communication/messages \
                       gecco/communication/server gecco/server gecco/util

CLASSES_DKE         = gecco/game/dke

# 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`




# Build 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
	mkdir -p $(CLASSPATH)/gecco/client/audio
	cp src/gecco/client/icons/*.gif $(CLASSPATH)/gecco/client/icons
	cp src/gecco/client/audio/*.wav $(CLASSPATH)/gecco/client/audio
	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: dke
dke: 
	mkdir -p $(CLASSPATH)
	$(JAVAC) $(JFLAGS) -classpath $(CLASSPATH) -d $(ROOTDIR) $(SOURCE_DKE)
	mkdir -p lib/game/dke/classes
	cd $(CLASSPATH); \
	$(JAR) cf ../lib/game/dke/classes/classes.jar $(CLASSES_DKE)
	mkdir -p lib/game/dke/images
	cp src/gecco/game/dke/images/*.gif lib/game/dke/images
	mkdir -p lib/game/dke/conf
	cp src/gecco/game/dke/conf/*.conf lib/game/dke/conf
	cp src/gecco/game/dke/text/*.txt lib/game/dke/


.PHONY: javadoc
javadoc:
	mkdir -p javadoc
	$(JAVADOC) -protected -sourcepath src -d javadoc -use -author -doctitle "$(LONG_NAME)" -windowtitle "$(LONG_NAME)" -link http://java.sun.com/products/jdk/1.4/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/$(DISTALL)
	cp -R dist/generic/$(DISTBIN)/* dist/generic/$(DISTALL)
	mkdir -p dist/generic/$(DISTALL)/source
	cp -R dist/generic/$(DISTSRC)/* dist/generic/$(DISTALL)/source

.PHONY: dist-genericbin
dist-genericbin: all
	mkdir -p dist/generic/$(DISTBIN)
	cp -R lib/* dist/generic/$(DISTBIN)
	cp text/*.txt dist/generic/$(DISTBIN)

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

.PHONY: dist-genericjavadoc
dist-genericjavadoc: javadoc
	mkdir -p dist/generic/$(DISTJDOC)
	cp -R javadoc/* dist/generic/$(DISTJDOC)

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

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

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

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

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

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

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

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

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