############################################################-*-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$
#
##############################################################################
##############################################################################
# Variables
# Groupe
GROUP_NUMBER = 39 # remplacez ceci par votre numéro de groupe #
GROUP = $(GROUP_NUMBER:%=compil%)
COMPILER_MAIN = zweic.AnalyzerTest
EXAMPLES_DIR = $(ROOT)/examples
TESTS_DIR = $(ROOT)/tests/4
TO_ADDRESS = compilation@lampsun1.epfl.ch
# Global
ROOT = .
TARGETS += $(SC_TARGET)
SOURCES += $(SC_SOURCES)
OBJECTS += $(SC_OUTPUTDIR)
# Compilation Scala
SC_COMMAND = scalac
SC_FLAGS =
SC_OUTPUTDIR = $(ROOT)/classes
SC_CLASSPATH = $(SC_OUTPUTDIR)
SC_TARGET = .latest-sc
SC_FILES += Position
SC_FILES += Report
SC_FILES += Tokens
SC_FILES += Scanner
SC_FILES += ScannerTest
SC_FILES += Name
SC_FILES += Operators
SC_FILES += Tree
SC_FILES += Parser
SC_FILES += ParserTest
SC_FILES += Printer
SC_FILES += PrinterTest
SC_FILES += Symbol
SC_FILES += Type
SC_FILES += Analyzer
SC_FILES += AnalyzerTest
SC_SOURCES += $(SC_FILES:%=sources/zweic/%.scala)
# Execution Scala
SCALA_COMMAND = scala
# Comptage
WC_COMMAND = wc
WC_FILES = $(SOURCES)
# Recherche
GREP_COMMAND = grep
GREP_FILES = $(SOURCES)
GREP_ARGS ?= $(ARGS)
# Utilitaires divers
CHGRP = chgrp
CHMOD = chmod
ECHO = echo
FIND = find
MKDIR = mkdir
MPACK = /home/iclamp/soft/bin/mpack
PRINTF = printf
RM = rm -f
SED = sed
TOUCH = touch
WC = wc
ZIP = zip
##############################################################################
# Fonctions
# Affiche puis exécute une commande
run = $(ECHO) $(1); $(1) || exit $$?
##############################################################################
# Commandes
all : $(TARGETS)
force :
$(RM) $(TARGETS)
$(MAKE) all
clean :
$(RM) $(TARGETS)
$(RM) -r $(OBJECTS)
distclean : clean
$(RM) $(GROUP).zip
$(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
stat :
@sorted=`echo $(JC_SOURCES) $(SC_SOURCES) | xargs -n 1 | sort`; \
total=0; total1=0; \
tmpfile="/tmp/$(USER)_stat.tmp"; \
for file in $$sorted; do \
size=0; size1=0; \
if [ -f "$$file" ]; then \
size=`stat -L -c%s $$file`; \
total=`echo "$$total + $$size" | bc`; \
$(SED) -es"#^[ \t]*\(.*\)#\1#" $$file > $$tmpfile; \
size1=`stat -L -c%s $$tmpfile`; \
total1=`echo "$$total1 + $$size1" | bc`; \
fi; \
$(PRINTF) "%6d %6d %s\n" $$size $$size1 $$file; \
done; \
$(PRINTF) "%6d %6d\n" $$total $$total1; \
$(RM) $$tmpfile
fix-permissions : test-group
$(CHGRP) -R $(GROUP) .
$(CHMOD) -R g=u .
$(CHMOD) -R o-rwx .
submit : test-group
$(ZIP) $(GROUP).zip $(SOURCES)
$(MPACK) -s "$(GROUP)" $(GROUP).zip "$(TO_ADDRESS)"
$(RM) $(GROUP).zip
test-group :
@if [ -z "$(GROUP_NUMBER)" ]; then \
$(ECHO) "erreur : votre numero de groupe manque"; \
$(ECHO) "solution: definissez-le dans votre fichier Makefile"; \
exit 1; \
fi
@exist=`groups | grep -c $(GROUP)`; \
if [ "$$exist" -lt 1 ]; then \
$(ECHO) "erreur : le groupe Unix \"$(GROUP)\" n'existe pas"; \
$(ECHO) "solution: verifiez votre numero de groupe"; \
exit 1; \
fi
tests : all
@for file in `ls -1 $(TESTS_DIR)/*.zwei`; do \
$(ECHO); \
$(ECHO) "fichier $$file"; \
$(SCALA_COMMAND) -cp $(SC_OUTPUTDIR) $(COMPILER_MAIN) $$file; \
done
examples : all
@for file in `ls -1 $(EXAMPLES_DIR)/*.zwei`; do \
$(ECHO); \
$(ECHO) "fichier $$file"; \
$(SCALA_COMMAND) -cp $(SC_OUTPUTDIR) $(COMPILER_MAIN) $$file; \
done
.PHONY : all
.PHONY : force
.PHONY : clean
.PHONY : distclean
.PHONY : wc
.PHONY : grep
.PHONY : stat
.PHONY : fix-premissions
.PHONY : submit
.PHONY : test-group
.PHONY : tests
.PHONY : examples
##############################################################################
# Règles
$(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 %) $?)
$(TOUCH) $@
##############################################################################