# This Makefile requires GNU make.

# IF YOU HAVE TROUBLE COMPILING, JUST REMOVE SOME MODULES
# AND GREEK CLANGS FIRST.

#
# Modules
#	- which modules (directories in ../Modules) to compile in
#
MODULES=applet mbox joystick test 3d xml extern prez \
	textcloud daytimedemo hypergenealogy nile notemap \
	benchmark zaubertrank mind \
	$(EXTRA)

#
# Clangs
#	- which clangs (directories in clang/) to compile in
#
GREEKCLANG=heraclitus flowing #thales
# 	(flowing's not a GREEK clang really, but make doesn't care...)

#
# Architectures
#	- which architecture-dependent code to compile
#	  (directories in arch/)
# ARCH=

# Default: none - set on command line.

# Put here the shell argument line to generate the build tag for the
# window title
BUILD_TAG := $(shell echo "Custom CVS Build `date -u +%Y-%m-%dT%H:%M:%SZ` by `whoami`@`hostname`")

# NOT COMPILED BY DEFAULT:
#     sound xml applet

# It would be nice to use standard paths !
#
#JAVA_LIB=/usr/local/java/lib
JAVA_DOC=/usr/local/java/docs/api

JAVADOCOPTS=-use -version -author -windowtitle "GZigZag Java API"

TEMP=/tmp

ZOB:=$(wildcard *.zob) $(wildcard */*.zob) \
    $(foreach module,$(MODULES),$(wildcard ../Modules/$(module)/*.zob)) \
    $(foreach clang,$(GREEKCLANG),$(wildcard clang/$(clang)/*.zob) $(wildcard clang/$(clang)/*/*.zob)) \
    $(foreach arch,$(ARCH),$(wildcard arch/$(arch)/*.zob)) 

ifeq ($(findstring ztp, $(MODULES)),ztp)
ZOB += $(wildcard ../Modules/ztp/*/*.zob)
endif

AUTOGENSRC := clang/ZZClangOps.java $(ZOB:.zob=.java) storage/Recs.java
AUTOGENERATED := $(AUTOGENSRC)

%.java: %.zob zob2java.pl ; perl zob2java.pl $< $@

# Can't add ZZClangOps since javac complains of doubly defined class...
# maybe should use uniq?
SRC0:=$(wildcard *.java) $(wildcard media/*.java) $(wildcard clang/*.java) \
    $(wildcard storage/*.java) $(wildcard errors/*.java)  \
    $(wildcard flob/*.java) $(wildcard transform/*.java)  \
    $(wildcard part/*.java) \
    $(foreach module,$(MODULES),$(wildcard ../Modules/$(module)/*.java)) \
    $(foreach clang,$(GREEKCLANG),$(wildcard clang/$(clang)/*.java) $(wildcard clang/$(clang)/*/*.java)) \
    $(foreach arch,$(ARCH),$(wildcard arch/$(arch)/*.java))  \
    $(AUTOGENSRC)

ifeq ($(findstring ztp, $(MODULES)),ztp)
SRC0 += ../Modules/ztp/*/*.java
endif

SRC:=$(shell echo $(SRC0) | perl -pe 's/\s+/\n/g' - | sort | uniq | tee /tmp/foo)

jikes := $(shell which jikes)
# DEBUG=-g

ifeq (,$(JAVAC))
 ifneq (,$(jikes))
	JAVAC=jikes +P
 else
	JAVAC=javac 
 endif
endif

JAVANCSS=/BIG/javancss9.24/javancss

archcompile = set -e; for d in "$(ARCH)"; do if [ -e arch/$(ARCH)/arch.mk ] ; then $(MAKE) -f arch/$(ARCH)/arch.mk; fi; done
archclean = set -e; for d in "$(ARCH)"; do if [ -e arch/$(ARCH)/arch.mk ] ; then $(MAKE) -f arch/$(ARCH)/arch.mk clean; fi; done

# all must compile everywhere
all: $(SRC)
	@echo "*** NOTE: YOU MAY HAVE TO RUN 'make' MORE THAN ONE TIME"
	@echo "*** TO GET EVERYTHING TO COMPILE DUE TO DEPENDENCIES"
	rm -f BuildInfo.java
	sed 's/@@@@@/$(BUILD_TAG)/' BuildInfo.java.in > BuildInfo.java.new && mv BuildInfo.java.new BuildInfo.java
	$(JAVAC) -deprecation $(DEBUG) -d . BuildInfo.java
	$(JAVAC) -deprecation $(DEBUG) -d . $(SRC)
	$(archcompile)

# If you want to try out the opengl stuff
opengl:
	@echo "********************************************"
	@echo "* requires gltt !!                         *"
	@echo "* add ../Modules/openGL to LD_LIBRARY_PATH *"
	@echo "********************************************"
	(cd ../Modules/openGL; make)
	$(JAVAC) -deprecation $(DEBUG) -d . ../Modules/openGL/*.java

doc::  $(SRC)
	sh ./make-src-tree.sh $(TEMP)/zzsrc
	rm -Rf doc
	mkdir doc
	javadoc $(JAVADOCOPTS) -d doc -sourcepath $(TEMP)/zzsrc org.gzigzag   \
	    org.gzigzag.clang \
	    org.gzigzag.module 
	rm -Rf $(TEMP)/zzsrc

zobdoc::  $(SRC)
	sh ./make-src-tree.sh $(TEMP)/zzsrc
	rm -Rf zobdoc
	mkdir zobdoc
	javadoc -doclet org.gzigzag.ZobDoc -d zobdoc \
	    -sourcepath $(TEMP)/zzsrc \
		org.gzigzag org.gzigzag.clang org.gzigzag.module 
	rm -Rf $(TEMP)/zzsrc


#      perl -pi.bak -e's|</h1>|"</h1>".`cat Package.html`|e' doc/Package-org.gzigzag.html

MODULESUPPORT=no
JARMODULES=applet mbox joystick test 3d xml extern prez \
	   textcloud daytimedemo hypergenealogy nile notemap zaubertrank mind
JARARCHES=
JARNAME=gzigzag.jar
jar: buildir=$(JARNAME).build
jar:
	cd .. && ./makedist.sh Java/$(buildir)
	-$(MAKE) -C $(buildir)/Java ARCH="$(JARARCHES)" MODULES="$(JARMODULES)" all
	-$(MAKE) -C $(buildir)/Java MODULES="$(JARMODULES)" allRCH="$(JARARCHES)" 
	-$(MAKE) -C $(buildir)/Java ARCH="$(JARARCHES)" MODULES="$(JARMODULES)" all
	$(MAKE) -C $(buildir)/Java ARCH="$(JARARCHES)" MODULES="$(JARMODULES)" all
	echo 'Main-Class: org.gzigzag.Main' > $(buildir)/Java/manifest
	set -e ; if [ "$(MODULESUPPORT)" != "no" ] ; \
		 then \
		    (cd $(buildir)/Java && jar -xvf $(MODULESUPPORT) gnu org) ;\
		 fi
	cd $(buildir)/Java && cp ../LICENSE.lgpl ../LICENSE.xpl .
	cd $(buildir)/Java && cp ../README README.source
	cd $(buildir)/Java && jar cvfm $(JARNAME) manifest fi foo xanadu gnu org README README.source LICENSE* 
	mv $(buildir)/Java/$(JARNAME) .
	rm -rf $(buildir)


mvdoc: doc
	scp -r doc/* tjl@gzigzag.sourceforge.net:/home/groups/gzigzag/www/javadoc/

%.java: %.pl
	perl $< $@

clean:
	rm -rf fi foo xanadu org
	rm -f $(AUTOGENERATED)
	rm -f BuildInfo.java clang/ZZClangOps.java
	$(archclean)

tags: $(SRC)
	ctags $(SRC)

CVS2CL=cvs2cl

ChangeLog::
	$(MAKE) -C .. ChangeLog

ncss:: $(SRC)
	$(JAVANCSS) -function $(SRC) | perl mungencss.pl |  \
			sort -rnk3 -k1 >ncss-ccn
	sort -rnk2 -k1 <ncss-ccn >ncss-ncss
	sort -rnk4 -k1 <ncss-ccn >ncss-jvdc
#	$(JAVANCSS) -all $(SRC) >ncss



