# This makefile by default compiles all the Java code, creates Javadoc documentation for it,
# and creates several jar files:
#
# rickyclarkson.jar - this is everything all together
# percentlayout.jar - this is just the parts that are essential for PercentLayout to work.
# typesafecollections.jar - this is just the parts that are essential for type safe collections.
# testsuite.jar - this is just the parts required for unit testing.
# 
# ***
# Note that the same makefile is copied into percentlayout.jar and typesafecollections.jar, so
# if you are trying to recompile percentlayout.jar, use make percentlayout.jar
# and if you are trying to recompile typesafecollections.jar, use make typesafecollections.jar, etc.
# ***
#
# I could put some error handling in to detect this situation at some point. 

SHELL=/bin/bash

# These are the files that are common between the subsection jar files.
SUBSECT_REQUIRED=Makefile COPYING LGPL-2.1

PERCENT_LAYOUT_REQUIRED=${SUBSECT_REQUIRED} com/rickyclarkson/java/awt/layout/PercentLayout.java com/rickyclarkson/java/awt/layout/PercentLayoutExample.java

TYPE_SAFE_REQUIRED=${SUBSECT_REQUIRED} \
	com/rickyclarkson/java/util/CloneMapEntry.java \
	com/rickyclarkson/java/util/ConstrainedCollection.java \
	com/rickyclarkson/java/util/ConstrainedEntrySet.java \
	com/rickyclarkson/java/util/ConstrainedKeySet.java \
	com/rickyclarkson/java/util/ConstrainedListIterator.java \
	com/rickyclarkson/java/util/ConstrainedList.java \
	com/rickyclarkson/java/util/ConstrainedMapEntry.java \
	com/rickyclarkson/java/util/ConstrainedMap.java \
	com/rickyclarkson/java/util/ConstrainedSet.java \
	com/rickyclarkson/java/util/Constraint.java \
	com/rickyclarkson/java/util/EntrySetIterator.java \
	com/rickyclarkson/java/util/EntrySet.java \
	com/rickyclarkson/java/util/NullConstraint.java \
	com/rickyclarkson/java/util/TypeConstraint.java \
	com/rickyclarkson/java/util/TypeSafeCollection.java \
	com/rickyclarkson/java/util/TypeSafeCollectionsExample.java \
	com/rickyclarkson/java/util/TypeSafeListIterator.java \
	com/rickyclarkson/java/util/TypeSafeList.java \
	com/rickyclarkson/java/util/TypeSafeMap.java \
	com/rickyclarkson/java/util/TypeSafeSet.java

ARRAYS_REQUIRED=${SUBSECT_REQUIRED} com/rickyclarkson/java/util/Arrays.java

COLLECTIONS_REQUIRED=${SUBSECT_REQUIRED} \
	com/rickyclarkson/java/util/Collections.java

TESTSUITE_REQUIRED=${SUBSECT_REQUIRED} \
	com/rickyclarkson/testsuite/UnitTest.java \
	com/rickyclarkson/testsuite/TestResult.java \
	com/rickyclarkson/testsuite/TestResultGroup.java \
	com/rickyclarkson/java/lang/Throwables.java \
	com/rickyclarkson/java/lang/reflect/Reflection.java \
	com/rickyclarkson/java/util/Arrays.java

# all compiles target 'most' and target 'jars', not a single target called
# 'most jars' which natural language makes it look like :)

all: most jars

# The point of 'most' is that it isn't recursive, so it avoids infinite recursion.
most: classfiles javadocs jar

jars: percentlayout.jar typesafecollections.jar arrays.jar collections.jar testsuite.jar

clean: cleanclassfiles cleanjar cleanjavadocs cleanpercentlayoutjar cleantypesafecollectionsjar cleanarrays.jar cleancollections.jar cleantestsuite.jar

# I don't quite believe in javac's versioning, so to be sure I delete everything.
# The syntax here is a bit wasteful, this is a useless use of grep.
classfiles: cleanclassfiles
	find . | grep '\.java$$' | xargs javac -deprecation

cleanclassfiles:
	find . | grep '\.class$$' | xargs rm -f

jar: cleanjar
	jar cf rickyclarkson.jar *

cleanjar:
	rm -f rickyclarkson.jar

javadocs: cleanjavadocs
	find . | grep '\.java$$' | xargs javadoc -quiet -d docs/

cleanjavadocs:
	rm -Rf docs/

percentlayout.jar: FORCE
	mkdir workspace
	cp --parents ${PERCENT_LAYOUT_REQUIRED} workspace
	cd workspace && $(MAKE) most
	cp workspace/rickyclarkson.jar percentlayout.jar
	rm -Rf workspace	

cleanpercentlayoutjar:
	rm -f percentlayout.jar

typesafecollections.jar: FORCE
	mkdir workspace
	cp --parents ${TYPE_SAFE_REQUIRED} workspace
	cd workspace && $(MAKE) most
	cp workspace/rickyclarkson.jar typesafecollections.jar
	rm -Rf workspace

cleantypesafecollectionsjar:
	rm -f typesafecollections.jar

arrays.jar: FORCE
	mkdir workspace
	cp --parents ${ARRAYS_REQUIRED} workspace
	cd workspace && ${MAKE} most
	cp workspace/rickyclarkson.jar arrays.jar
	rm -Rf workspace

cleanarrays.jar:
	rm -f arrays.jar

collections.jar: FORCE
	mkdir workspace
	cp --parents ${COLLECTIONS_REQUIRED} workspace
	cd workspace && ${MAKE} most
	cp workspace/rickyclarkson.jar collections.jar
	rm -Rf workspace

cleancollections.jar:
	rm -f collections.jar

testsuite.jar:
	mkdir workspace
	cp --parents ${TESTSUITE_REQUIRED} workspace
	cd workspace && ${MAKE} most
	cp workspace/rickyclarkson.jar testsuite.jar
	rm -Rf workspace

cleantestsuite.jar:
	rm -f testsuite.jar
	
FORCE:
