############################################################-*-Makefile-*-####
# Makefile for the compilation project (requires GNUMake).
##############################################################################
#
# By default compiles only the files that were modified 
# since the last  successful compilation.
# To force the compilation of all files use "make force"
#
# $Id: Makefile,v 1.1 2004/02/24 15:57:04 schinz Exp $
#
##############################################################################

##############################################################################
# Variables

# Global
ROOT		 = .
TARGETS		+= $(JC_TARGET)
OBJECTS		+= $(JC_OUTPUTDIR)

CUP_RUNTIME	 = /home/iclamp/local/packages/CUP/lib/rt.jar

EXPR		 = $(ROOT)/src/expressive
SPEC		 = $(ROOT)/src/spec
EVM		 = $(EXPR)/evm

# Java compilation
JC_COMMAND	 = javac
JC_FLAGS	 = -g -deprecation -source 1.4
JC_OUTPUTDIR	 = $(ROOT)/classes
JC_CLASSPATH	 = $(JC_OUTPUTDIR):$(CUP_RUNTIME)
JC_TARGET	 = .latest-jc

# Javadoc generation
JD_COMMAND	 = javadoc
JD_FLAGS	 = -source 1.4 -quiet -sourcepath $(ROOT)/src
JD_OUTPUTDIR	 = $(ROOT)/javadoc
JD_CLASSPATH	 = $(JC_OUTPUTDIR):$(CUP_RUNTIME)
JD_TARGET	 = .latest-jd

SCANNER		 = $(EXPR)/Scanner.java
SCANNER_LEX	 = $(SPEC)/expressive.lex

TOKENS		 = $(EXPR)/Tokens.java

PARSER_CLASS	 = Parser
PARSER		 = $(EXPR)/$(PARSER_CLASS).java
PARSER_CUP	 = $(SPEC)/expressive.cup

SOURCES		+= $(EXPR)/Position.java
SOURCES		+= $(EXPR)/Global.java
SOURCES		+= $(EXPR)/AbstractMain.java
SOURCES		+= $(EXPR)/ScannerTest.java
SOURCES		+= $(EXPR)/ParserTest.java
#SOURCES		+= $(EXPR)/Tree.java
#SOURCES		+= $(EXPR)/Type.java
#SOURCES		+= $(EXPR)/Visitor.java
#SOURCES		+= $(EXPR)/Symbol.java

JC_SOURCES	 = $(SOURCES)
JC_SOURCES	+= $(TOKENS)
JC_SOURCES	+= $(SCANNER)
JC_SOURCES	+= $(PARSER)


# JLex & CUP
JLEX		 = /home/iclamp/soft/bin/jlex
JAVA_CUP	 = /home/iclamp/soft/bin/cup

# Accounting
WC_COMMAND	 = wc
WC_FILES	 = $(SOURCES)

# Searching
GREP_COMMAND	 = grep
GREP_FILES	 = $(SOURCES)
GREP_ARGS	?= $(ARGS)

# various utilities
ECHO		 = echo
RM		 = rm
FIND		 = find
MKDIR		 = mkdir
TOUCH		 = touch
WC		 = wc

##############################################################################
# Functions

# Print and execute command
run			 = $(ECHO) $(1); $(1) || exit $$?

##############################################################################
# Commands

all		: $(TARGETS)

force		: clean
	$(MAKE) all

clean		:
	$(RM) -f  $(TARGETS)
	$(RM) -rf $(OBJECTS)
	$(RM) -f  $(SCANNER) $(PARSER) $(TOKENS)

doc		: all $(JD_TARGET)

doc-clean	:
	$(RM) -f  $(JD_TARGET)
	$(RM) -rf $(JD_OUTPUTDIR)

distclean	: clean doc-clean
	$(strip $(FIND) . \
	    \( -name "*~" \
	    -o -name "*.class" \
	    -o -name "core" \
	    \) \
	    -exec $(RM) "{}" ";")

wc		:
	@$(WC_COMMAND) $(WC_FILES)

grep		:
	@if [ -z $(GREP_ARGS) ]; then \
	    $(ECHO) "usage: make grep ARGS=<regexp>"; \
	else \
	    $(GREP_COMMAND) $(GREP_ARGS) $(GREP_FILES); \
	fi

help		:
	@$(ECHO) "USAGE:"
	@$(ECHO) "  make           - same as 'make all'"
	@$(ECHO) "  make all       - builds the project by compiling only the files\
	            that changed since the last build"
	@$(ECHO) "  make clean     - deletes the files generated by the build process"
	@$(ECHO) "  make force     - compiles all files"
	@$(ECHO) "  make doc       - creates documentation in Javadoc format; look at ./javadoc/index.html"
	@$(ECHO) "  make doc-clean - deletes the generated documentation"
	@$(ECHO) "  make distclean - deletes all generated files"
	@$(ECHO) "  make wc        - count the number on lines in source files"
	@$(ECHO) "  make help      - displays this message"
	@$(ECHO)
	@$(ECHO) "Note: on some platforms you may need to use 'gmake' instead of 'make'"

.PHONY		: all force clean distclean doc doc-clean wc grep help

##############################################################################
# Rules

$(JC_TARGET)	: $(JC_SOURCES)
	@if [ ! -d $(JC_OUTPUTDIR) ]; then \
	    $(call run,$(MKDIR) -p $(JC_OUTPUTDIR)); \
	fi
	$(strip $(JC_COMMAND) $(JC_FLAGS) $(JC_OUTPUTDIR:%=-d %) \
	    $(JC_CLASSPATH:%=-classpath %) $?)
	$(TOUCH) $@

$(JD_TARGET)	: $(SOURCES)
	@if [ ! -d $(JD_OUTPUTDIR) ]; then \
	    $(call run,$(MKDIR) -p $(JD_OUTPUTDIR)); \
	fi
	$(strip $(JD_COMMAND) $(JD_FLAGS) $(JD_OUTPUTDIR:%=-d %) \
	    $(JD_CLASSPATH:%=-classpath %) $(SOURCES))
	$(TOUCH) $@

$(SCANNER)	: $(SCANNER_LEX)
	$(JLEX) $(SCANNER_LEX)
	mv $(SCANNER_LEX).java $(SCANNER)

$(PARSER)	: $(PARSER_CUP)
	$(JAVA_CUP) -interface -symbols Tokens -parser $(PARSER_CLASS) < $(PARSER_CUP)
	mv $(PARSER_CLASS).java $(PARSER)
	mv Tokens.java $(EXPR)

$(TOKENS)	: $(PARSER)

##############################################################################
