############################################################-*-Makefile-*-####
# Makefile pour le projet de compilation (nécessite GNUMake).
##############################################################################
#
# Par défaut, ne recompile que les fichiers qui ont été modifiés après
# la dernière compilation réussie.
# Pour forcer la compilation de tous les fichiers, utiliser "make force".
#
# $Id: Makefile,v 1.1 2004/02/24 16:12:37 schinz Exp $
#
##############################################################################

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

# Global
ROOT			 = .
TARGETS			+= $(JC_TARGET)
TARGETS			+= $(SC_TARGET)
SOURCES			+= $(JC_SOURCES)
SOURCES			+= $(SC_SOURCES)
OBJECTS			+= $(JC_OUTPUTDIR)

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

JC_SOURCES		+= src/misc/Position.java
JC_SOURCES		+= src/misc/Global.java
JC_SOURCES		+= src/misc/AbstractMain.java
JC_SOURCES		+= src/misc/ScalaMain.java
JC_SOURCES		+= src/misc/ScalaMainRunnable.java
JC_SOURCES		+= src/misc/Tokens.java
JC_SOURCES		+= src/misc/Scanner.java
JC_SOURCES		+= src/misc/ScannerTest.java

# Compilation Scala
SC_COMMAND		 = socos
SC_FLAGS		 =
SC_OUTPUTDIR		 = $(JC_OUTPUTDIR)
SC_CLASSPATH		 = $(SC_OUTPUTDIR)
SC_TARGET		 = .latest-sc

SC_SOURCES		+= src/misc/Tree.scala
SC_SOURCES		+= src/misc/Parser.scala
SC_SOURCES		+= src/misc/ParserTest.scala

# Comptage
WC_COMMAND		 = wc
WC_FILES		 = $(SOURCES)

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

# Utilitaires divers
ECHO			 = echo
RM			 = rm
FIND			 = find
MKDIR			 = mkdir
TOUCH			 = touch
WC			 = wc

##############################################################################
# Fonctions

# Affiche puis exécute une commande
run			 = $(ECHO) $(1); $(1) || exit $$?

##############################################################################
# Commandes

all		: $(TARGETS)

force		:
	$(RM) -f $(TARGETS)
	$(MAKE) all

clean		:
	$(RM) -f $(TARGETS)
	$(RM) -rf $(OBJECTS)

distclean	: 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


.PHONY		: all force clean distclean

##############################################################################
# Règles

$(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) $@


$(SC_TARGET)	: $(SC_SOURCES)
	@if [ ! -d $(SC_OUTPUTDIR) ]; then \
	    $(call run,$(MKDIR) -p $(SC_OUTPUTDIR)); \
	fi
	$(strip $(SC_COMMAND) $(SC_FLAGS) $(SC_OUTPUTDIR:%=-d %) \
	    $(SC_CLASSPATH:%=-classpath %) $(SC_SOURCES))
	$(TOUCH) $@

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