# farm makefile
#
# Type "make farm" to compile the project
# #######################################################

###
# Vars
###

# Locations and such
DIR	= .
LIBS	= $(DIR)/../lib
CLASSD	= $(DIR)/classes
SRCD	= $(DIR)/src
DOCD	= $(DIR)/doc
SCRIPTS	= ../bin
JAVART	= 
FARMFAQ = farmfaq.html
VERSION	= $(shell head -1 VERSION | sed -e 's/\s$$//')
FARMZIP = farm.$(VERSION).zip

# Constants
SEP	= \:
EMPTY	=
SPACE	= $(EMPTY) $(EMPTY)

# More locations - you may have to change these if
# your java executable is not in your path.
#
# JAVART should point to the directory containing
# your java executables (java, javac, jar).
ARCH	= $(shell uname -s)
ifeq "$(ARCH)" "Linux"
	JAVART	= /usr/maslocal/jdk2/bin/
endif
ifeq "$(ARCH)" "cygwin"
        #JAVART = /cygdrive/c/jdk/bin/
        JAVART  = /cygdrive/c/jdk1.3.1_01/bin/
        SEP     = \;
endif

# Find the JNIDIR
ifeq "$(ARCH)" "Darwin"
	JNIDIR	= macosx
endif
ifeq "$(ARCH)" "Linux"
	JNIDIR = linux
endif
export LD_LIBRARY_PATH:=../jni/$(JNIDIR):$(LD_LIBRARY_PATH)

# Programs
JAVAC	= $(JAVART)javac
JAVA	= $(JAVART)java
JAR	= $(JAVART)jar
JAVADOC	= $(JAVART)javadoc
RMIREG	= $(JAVART)rmiregistry
RMIC	= $(JAVART)rmic
PERL	= perl

# Files
JLIBS	= $(wildcard $(LIBS)/*[".jar"|".zip"|".so"])
CLASSPTH= $(CLASSPATH)$(SEP)$(CLASSD)$(SEP)$(subst $(SPACE),$(SEP),$(strip $(JLIBS)))

# Lists of things
JAVASRC = $(shell if [ -e $(SRCD) ]; then find $(SRCD) -name "*.java" -print; fi)
JAVAPAK	= $(shell grep "^\\s*package.*;\\s*$$" $(JAVASRC) | sed -e "s/.*package *\(.*\);$$/\1/" | sort | uniq)
JDEPS   = $(patsubst $(SRCD)/%.java, $(CLASSD)/%.class, $(JAVASRC))
CLASSES = cd $(CLASSD); find . -name "*.class" -print | sed -e's/\$$/\\$$/g'
AGENTENV= $(shell $(MAGENV))
MODULES	= simulator generic ants graphcolor sat bandit

# Variables
HOST	= $(shell echo $(HOME) | perl -ne "split /\//; print @_[2];")
RUNJAVA	= $(JAVA) \
	    -Xmx128m \
	    -classpath $(CLASSPTH) \
	    -Djava.library.path=$(LD_LIBRARY_PATH) \
	    -Djava.security.policy=../lib/security.txt

###
# Rules
###

# By default, we compile
farm: 
	for i in $(MODULES); do cd $$i; $(MAKE) all; cd ..; done

# Clean stuff up
cleanfarm:
	-rm $(FARMFAQ)
	for i in $(MODULES); do cd $$i; $(MAKE) veryclean; cd ..; done

# Make the distribution
dist: cleanfarm farmdoc
	cd ..; rm $(FARMZIP); zip -P farmerbob -r $(FARMZIP) farm -x *CVS/* -x *.#* -x *~ -x *.sav
	cp ../$(FARMZIP) /usr/maslocal/ftp/download/
	chmod a+r /usr/maslocal/ftp/download/farm*
	cp VERSION /usr/maslocal/http/research/farm/
	chmod a+r /usr/maslocal/http/research/farm/VERSION
	@echo "** Remember to update /usr/maslocal/http/download.html"

# Get the online docs
farmdoc: FORCE
	wget -q -O $(FARMFAQ) http://mas.cs.umass.edu/maswiki/moin.cgi/FarmFaq?action=print

# Compiles .java files
$(CLASSD)/%.class: $(SRCD)/%.java
	$(JAVAC) -g -d $(CLASSD) -deprecation -sourcepath $(SRCD) \
	  -classpath $(CLASSPTH) \
	  $<

# Compiles stub files
%.stub:
	$(RMIC) \
	  -d $(CLASSD) -classpath $(CLASSPTH) \
	  $*

# Generates the javadoc documentation from the source files
doc: FORCE
	-@mkdir $(DOCD)
	$(JAVADOC) -d $(DOCD) -public -author \
	  -sourcepath $(SRCD) \
	  -classpath $(CLASSPTH) \
	  $(JAVAPAK)

# Generates a jar file containing the class files produced by
# the .java files in src.  Use this if you need to migrate your
# components to a different environment without moving the
# source code.
jar: $(JARFILE)

$(JARFILE): $(JDEPS)
	cd $(CLASSD); $(JAR) cf tmp.jar $(shell $(CLASSES)) $(DATA)
	@mv $(CLASSD)/tmp.jar $(JARFILE)

# Prints out some relevant variables
debug:
	@ echo "           ARCH = $(ARCH)"
	@ echo "       HOSTTYPE = $(HOSTTYPE)"
	@ echo "LD_LIBRARY_PATH = $(LD_LIBRARY_PATH)"
	@ echo "            DIR = $(DIR)"
	@ echo "         JAVART = $(JAVART)"
	@ echo "          JAVAC = $(JAVAC)"
	@ echo "           JAVA = $(JAVA)"
	@ echo "           LIBS = $(LIBS)"
	@ echo "          JLIBS = $(JLIBS)"
	@ echo "      CLASSPATH = $(CLASSPATH)"
	@ echo "       CLASSPTH = $(CLASSPTH)"
	@ echo "        MODULES = $(MODULES)"
	@ echo "        RUNJAVA = $(RUNJAVA)"
	@ echo "           Host = `uname -a`"

FORCE: ;

# Cleaning
clean: FORCE
	-cd $(CLASSD); rm $(shell $(CLASSES))
	-rm $(JARFILE)
	-rm core*

veryclean: clean
	-rm *.log
	-rm *.sav
	-rm -rf $(DOCD)

# Script convenience rules
runjava:
	@echo "$(RUNJAVA)"

classpath:
	@echo $(CLASSPTH)

# Build rules
classes: $(JDEPS)

stubs: classes $(STUBS)

all: classes stubs jar doc

# Farm convenience rules
registry:
	export CLASSPATH=$(CLASSPTH); $(RMIREG) &

runsim:
	$(RUNJAVA) farm.simulator.FarmSimulator -m 1

runkill:
	$(RUNJAVA) farm.generic.plugins.drivers.KillDriver
