############################################################-*-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.GeneratorTest EXAMPLES_DIR = $(ROOT)/examples TESTS_DIR = $(ROOT)/tests/5 TO_ADDRESS = compilation@lampsun1.epfl.ch # Global ROOT = . TARGETS += $(JC_TARGET) TARGETS += $(SC_TARGET) SOURCES += $(JC_SOURCES) SOURCES += $(SC_SOURCES) OBJECTS += $(SC_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_FILES += RISC JC_SOURCES += $(JC_FILES:%=sources/zweic/%.java) # 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_FILES += Code SC_FILES += Generator SC_FILES += GeneratorTest 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 $(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 %) $?) $(TOUCH) $@ ##############################################################################