# Makefile zur Erzeugung der Uebungsblaetter
# (weitere Informationen siehe Target "help")

#
# Variablen/Makros definieren
#

# Umgebung
SHELL = /bin/bash
FILE_BROWSER = nautilus
VCS_DIR = .svn

# verwendete Befehle und Parameter
CD = cd
MKDIR = /bin/mkdir -v -p
ECHO = /bin/echo
ECHO_ESCAPES = $(ECHO) -e
CAT = /bin/cat
RM = /bin/rm -v -f
RM_RECURSIVE = $(RM) -r
CP = /bin/cp -v
CP_RECURSIVE = $(CP) -r
MV = /bin/mv -v
TOUCH = /usr/bin/touch
FIND = find
#TAR_CREATE = tar --verify --dereference --hard-dereference --check-links --exclude-vcs -cvf
TAR_CREATE = tar -h -l --exclude='$(VCS_DIR)' -cvf
GZIP_COMPRESS = gzip -9 -f
LATEX = pdflatex
LATEX_PARAMS = -shell-escape
LATEX2HTML = htlatex
LATEX2HTML_PARAMS = "html,3,info,graphics-,fn-in" "" -d$(HTML_DIR)/
LATEX2HTML_MLSG_PARAMS = "html,3,info,graphics-,fn-in" "" -d$(HTML_MLSG_DIR)/
PDFTOPS = pdftops
PSTOPS = pstops
PS2PDF = ps2pdf
A2PS = a2ps
GHOSTSCRIPT = gs -dNOPAUSE -sDEVICE=pswrite
ERZEUGE_MULTI_PDF_SCRIPT = ../erzeuge_multi_pdf
ERZEUGE_MULTI_PS_SCRIPT = ../erzeuge_multi_ps
UPDATE_CODE_SCRIPT = $(POOL_DIR)/update_java_code_version.sh

# allgemeine Verzeichnisse
BLATT_CONFIG_DIR = .
MASTERFILES_DIR = ./blatt_masterfiles
AUFGABEN_DIR_NAME = Aufgaben
AUFGABEN_DIR = ./$(AUFGABEN_DIR_NAME)
UEBUNG_DIR_NAME = Uebung
UEBUNG_DIR = ../$(UEBUNG_DIR_NAME)
HTML_DIR = html
HTML_MLSG_DIR = $(HTML_DIR)_mlsg
TMP_DIR = /tmp

# LaTeX- und Text-Bausteine, aus denen die Uebungsblaetter u.a. zusammengesetzt werden
LATEX_HEADER = blatt_latex_header.tex
LATEX_MACROS = blatt_latex_macros.tex
LATEX_FOOTER = blatt_latex_footer.tex
BLATT_HEADER = blatt_header.tex
BLATT_PREAMBLE = blatt_preamble.tex
BLATT_CONFIG = blatt_config.tex
BLATT_PREAMBLE_BEWERTUNG = blatt_preamble_bewertung.txt
BLATT_PREAMBLE_VORBESPRECHUNG = blatt_preamble_vorbesprechung.txt
BLATT_PREAMBLE_NACHBESPRECHUNG = blatt_preamble_nachbesprechung.txt
LATEX2HTML_CONF = tex4ht.env

# Verzeichnisse und Dateinamen der Uebungsblaetter
BLATT_DIR = blatt$(BLATTNUMMER)
BLATT = blatt$(BLATTNUMMER).tex
BLATT_PDF = blatt$(BLATTNUMMER).pdf
BLATT_PS = blatt$(BLATTNUMMER).ps
BLATT_ZWEISEITIG_PDF = blatt$(BLATTNUMMER)_zweiseitig.pdf
BLATT_ZWEISEITIG_PS = blatt$(BLATTNUMMER)_zweiseitig.ps
BLATT_MLSG = blatt$(BLATTNUMMER)_mlsg.tex
BLATT_MLSG_PDF = blatt$(BLATTNUMMER)_mlsg.pdf
BLATT_MLSG_PS = blatt$(BLATTNUMMER)_mlsg.ps
BLATT_MLSG_ZWEISEITIG_PDF = blatt$(BLATTNUMMER)_mlsg_zweiseitig.pdf
BLATT_MLSG_ZWEISEITIG_PS = blatt$(BLATTNUMMER)_mlsg_zweiseitig.ps
BLATT_MLSG_ZWEISEITIG_KOMPLETT_PDF = blatt$(BLATTNUMMER)_mlsg_zweiseitig_komplett.pdf
BLATT_MLSG_ZWEISEITIG_KOMPLETT_PS = blatt$(BLATTNUMMER)_mlsg_zweiseitig_komplett.ps
BLATT_CONF = blatt$(BLATTNUMMER).conf
MULTI_BLATT = multi_blatt
BLATT_VORBESPRECHUNG = blatt$(BLATTNUMMER)_vorbesprechung.txt
BLATT_NACHBESPRECHUNG = blatt$(BLATTNUMMER)_nachbesprechung.txt
BLATT_BEWERTUNG = blatt$(BLATTNUMMER)_bewertung.txt
BLATT_ARCHIV = blatt$(BLATTNUMMER)_uebung_mlsg.tar
BLATT_ARCHIV_COMPRESSED = blatt$(BLATTNUMMER)_uebung_mlsg.tar.gz
BLATT_TUTOR_ARCHIV = blatt$(BLATTNUMMER).tar
BACKUP_ARCHIV_PREFIX = aufgaben_uebung

# Verzeichnisse und Dateien im Aufgabenpool, Uebungs- und Uebungsblattverzeichnis
POOL_DIR = ./pool
POOL_AUSGABE_DIR = ausgabe
POOL_UEBUNG_DIR = uebung
POOL_MLSG_DIR = mlsg
FRAGENKATALOG_DIR = $(POOL_DIR)/fragenkatalog
CODE_DIR = code
IDE_DIR = ide
LATEX_AUFG = auf.tex
LATEX_BLATT_TEST = blatt_test
VORBESPRECHUNG = vorbesprechung.txt
NACHBESPRECHUNG = nachbesprechung.txt
BEWERTUNG = bewertung.txt

# aktuelles Datum/aktuelle Uhrzeit fuer Dateinamen (z.B. bei der Archiverstellung)
DATE := date +"%Y-%m-%d_%H%M"
START_DATE := $(shell $(DATE))
CURRENT_DATE := `$(DATE)`

#
# (Pseudo-)Targets des Makefiles definieren
#

# Ausgabe des Hilfetextes
help:
	@$(ECHO) "Makefile zur Erzeugung der Uebungsblaetter"
	@$(ECHO) "Version: 2013-02-22"
	@$(ECHO) "Autor: Wolfgang Runte (woru@informatik.uni-osnabrueck.de)"
	@$(ECHO) ""
	@$(ECHO) "Beispiele fuer den Aufruf des Makefiles:"
	@$(ECHO) "1. make b01 - Erzeugt das erste Uebungsblatt sowie eine Version inklusive"
	@$(ECHO) "              Musterloesungen im Verzeichnis './blatt01'. Ausserdem wird im"
	@$(ECHO) "              selben Verzeichnis das Bewertungsschema fuer das Uebungsblatt aus"
	@$(ECHO) "              den einzelnen Dateien unter './pool/.../bewertung.txt' der"
	@$(ECHO) "              einzelnen Aufgaben generiert (soweit vorhanden) und die fuer die"
	@$(ECHO) "              fuer die Bearbeitung des Uebungsblattes benoetigten/auszugebenen"
	@$(ECHO) "              Dateien in das Unterverzeichnis './blatt01/ausgabe' abgelegt. Die"
	@$(ECHO) "              Quellcode-Dateien, die innerhalb einer IDE waehrend der Uebungen"
	@$(ECHO) "              vorliegen muessen (aus den Verzeichnissen './pool/.../mlsg/code',"
	@$(ECHO) "              './pool/.../uebung/code' und './pool/.../ausgabe/code'), werden im"
	@$(ECHO) "              Verzeichnis './blatt01/ide' gesammelt. In 'ide' wird zwischen"
	@$(ECHO) "              Dateien fuer 'mlsg' und 'uebung' unterschieden. Ausserdem werden"
	@$(ECHO) "              die Dateien fuer den Fragenkatalog (sofern er existiert) von"
	@$(ECHO) "              './pool/fragenkatalog/01*' (alt. './pool/fragenkatalog/blatt01*')"
	@$(ECHO) "              nach './blatt01' kopiert."
	@$(ECHO) "   make b02 - Erzeugt das zweite Uebungsblatt im Verzeichnis './blatt02', etc."
	@$(ECHO) "              (maximal sind bisher 15 Uebungsblaetter vorgesehen)."
	@$(ECHO) "2. make blattall - Erzeugen aller Uebungsblaetter 01 bis 15 (soweit vorhanden)."
	@$(ECHO) "3. make ueb01 - Erzeugt das Uebungsverzeichnis fuer das Uebungsblatt 01 unter"
	@$(ECHO) "                '../Uebung/01/'. Darin enthalten sind die fuer die Uebung"
	@$(ECHO) "                benoetigten (Beispiel-)Dateien der jeweiligen Aufgaben aus"
	@$(ECHO) "                './pool/.../uebung/', die fuer das Uebungsblatt benoetigten"
	@$(ECHO) "                Dateien aus './pool/.../ausgabe/' sowie die Musterloesungen aus"
	@$(ECHO) "                './pool/.../mlsg/'. In ../Uebung/ befinden sich anschliessend"
	@$(ECHO) "                ausserdem die Gesamtdateien fuer die Vor- und Nachbesprechung"
	@$(ECHO) "                'blatt01_vorbesprechung.txt' und 'blatt01_nachbesprechung.txt'"
	@$(ECHO) "                der jeweiligen Aufgaben (sofern die Einzeldateien mit den Namen"
	@$(ECHO) "                'vorbesprechung.txt' und 'nachbesprechung.txt' in den einzelnen"
	@$(ECHO) "                pool-Verzeichnissen vorhanden sind). WICHTIG: Vor dem Aufruf von"
	@$(ECHO) "                z.B. 'make ueb01' muss 'make b01' aufgerufen werden, damit die"
	@$(ECHO) "                erforderliche Datei './blatt01/blatt01.conf' existiert und auf"
	@$(ECHO) "                dem aktuellen Stand ist. In das Verzeichnis './blatt01/' wird"
	@$(ECHO) "                ausserdem eine gepackte Version des Uebungsverzeichnisses inkl."
	@$(ECHO) "                der Dateien der Musterloesung abgelegt zwecks Ausgabe an die"
	@$(ECHO) "                Tutoren."
	@$(ECHO) "4. make clean - Loescht ohne Rueckfrage die folgende Dateien:"
	@$(ECHO) "                -> alle .log, .aux und .out-Dateien in 'blatt01', 'blatt02',"
	@$(ECHO) "                   etc."
	@$(ECHO) "                -> die Konfigurationsdatei fuer die HTML-Ausgabe sowie alle"
	@$(ECHO) "                   .4ct, .4tc, .idv, .lg, .dvi, .tmp, .xref, *.css und"
	@$(ECHO) "                   .html-Dateien in 'blatt01', 'blatt02', etc., die temporaer"
	@$(ECHO) "                   fuer die HTML-Ausgabe benoetigt bzw. erzeugt werden"
	@$(ECHO) "                -> alle .log, .aux und .out-Dateien sowie die erzeugten .pdf-"
	@$(ECHO) "                   Dateien in allen pool-Verzeichnissen"
	@$(ECHO) "                -> alle "*~"-Dateien rekursiv im aktuellen Verzeichnis"
	@$(ECHO) "                -> alle "*~"-Dateien rekursiv im Uebungsverzeichnis"
	@$(ECHO) "5. make 01 - Ruft 'make b01', 'make ueb01' und 'make clean' der Reihe nach auf,"
	@$(ECHO) "             so dass das Uebungsblatt, die Musterloesung etc. und das"
	@$(ECHO) "             Uebungsverzeichnis erzeugt und anschliessend aufgeraeumt wird."
	@$(ECHO) "6. make all - Erzeugt alle Uebungsblaetter und Uebungsverzeichnisse durch"
	@$(ECHO) "              Aufrufen von 'make 01', 'make 02', ... (inkl. anschliessendem"
	@$(ECHO) "              Aufraeumen mit 'make clean')."
	@$(ECHO) "7. make tut01 - Archiv inkl. druckbarer (kompletter) PDF-Datei mit Fragenkatalog"
	@$(ECHO) "                und Bewertung zur Ausgabe an die Tutoren erzeugen. WICHTIG:"
	@$(ECHO) "                Zuvor muss mit 'make b01' *UND* 'make ueb01' oder alternativ mit"
	@$(ECHO) "                'make 01' das entsprechende Uebungsblatt-Verzeichnis ('blatt01')"
	@$(ECHO) "                samt Archiv mit den Uebungsinhalten und Musterloesungen erzeugt"
	@$(ECHO) "                worden sein."
	@$(ECHO) "8. make codeup01 - Quellcode der Aufgaben auf dem jeweiligen Uebungsblatt"
	@$(ECHO) "                   aktualisieren, d.h. das '@version'-Tag in Java mit dem"
	@$(ECHO) "                   aktuellen Datum belegen. WICHTIG: Zuvor muss mit 'make b01'"
	@$(ECHO) "                   oder alternativ mit 'make 01' das entsprechende Uebungsblatt-"
	@$(ECHO) "                   Verzeichnis ('blatt01') erzeugt worden sein."
	@$(ECHO) "9. make dir - Standardordner im Datei-Browser (Default: Nautilus) oeffnen."
	@$(ECHO) "10. make dir01 - Alle relevanten Verzeichnisse zu einem Uebungsblatt im"
	@$(ECHO) "                 Datei-Browser (Default: Nautilus) oeffnen. Ordner des"
	@$(ECHO) "                 Uebungsblattes, das entsprechende Uebungsverzeichnis und"
	@$(ECHO) "                 Verzeichnisse im Aufgabenpool der Aufgaben fuer das aktuelle"
	@$(ECHO) "                 Uebungsblatt oeffnen. WICHTIG: Zuvor muss mit 'make b01' oder"
	@$(ECHO) "                 alternativ mit 'make 01' das entsprechende Uebungsblatt-"
	@$(ECHO) "                 Verzeichnis ('blatt01') erzeugt worden sein."
	@$(ECHO) "11. make backup - Aufraeumen und ein .tar.gz erstellen (Backup)."
	@$(ECHO) ""

# lediglich zum Testen der Variablen/Makros
# [rekursiver Aufruf von 'b01', 'b02', ... 'b15']
private_blatt_test:
	$(ECHO) $(BLATTNUMMER)
	$(ECHO) $(BLATTNUMMER_KURZ)
	$(ECHO) $(BLATT_DIR)
	$(ECHO) $(BLATT)
	$(ECHO) $(BLATT_MLSG)
	$(ECHO) $(BLATT_CONF)
	for i in $$(cat $(BLATT_DIR)/$(BLATT_CONF)); do AUFGABE=$$($(ECHO) $$i); $(ECHO) "Aufgabe: $$AUFGABE"; done
	while read AUFGABE; do echo "Aufgabe: $$AUFGABE"; done < $(BLATT_DIR)/$(BLATT_CONF)

# Uebungsblatt OHNE Musterloesungen erstellen
# [wird rekursiv aufgerufen von Target 'b01', 'b02', ... 'b15']
private_blatt:
	# Verzeichnis fuer Uebungsblatt erzeugen, wenn es noch nicht existiert
	if ! test -d  $(BLATT_DIR); then $(MKDIR) $(BLATT_DIR); fi
	# falls die zu erstellende Datei bereits existiert, wird sie umbenannt
	if test -e  $(BLATT_DIR)/$(BLATT); then $(MV) $(BLATT_DIR)/$(BLATT) $(BLATT_DIR)/$(BLATT)~; fi
	# Uebungsblatt nacheinander aus den Bausteinen zusammensetzen
	$(CAT) $(MASTERFILES_DIR)/$(LATEX_HEADER) > $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	$(CAT) $(MASTERFILES_DIR)/$(LATEX_MACROS) >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	# Blattnummmer und Flag fuer Musterloesung ja/nein einfuegen
	$(ECHO) "\newcommand{\blattNummer}{"$(BLATTNUMMER)"}" >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "\newcommand{\blattNummerKurz}{"$(BLATTNUMMER_KURZ)"}" >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "\setboolean{mlsg}{false}" >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	$(CAT) $(BLATT_CONFIG_DIR)/$(BLATT_CONFIG) >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_HEADER) >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_PREAMBLE) >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	# Aufruf zur Erzeugung des Koerpers mit den Uebungsaufgaben einfuegen
	$(ECHO) "\blattBody" >> $(BLATT_DIR)/$(BLATT)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT)
	$(CAT) $(MASTERFILES_DIR)/$(LATEX_FOOTER) >> $(BLATT_DIR)/$(BLATT)
	# Uebungsblatt 2x tex'en (wg. Referenzen)
	$(CD) $(BLATT_DIR) && $(LATEX) $(LATEX_PARAMS) $(BLATT)
	$(CD) $(BLATT_DIR) && $(LATEX) $(LATEX_PARAMS) $(BLATT)
	# Postscript erzeugen
	$(CD) $(BLATT_DIR) && $(PDFTOPS) $(BLATT_PDF) $(BLATT_PS)
	# LaTeX2HTML bzw. htlatex/tex4ht anwenden
	$(CP) $(MASTERFILES_DIR)/$(LATEX2HTML_CONF) $(BLATT_DIR)
	$(MKDIR) $(BLATT_DIR)/$(HTML_DIR)
	$(CD) $(BLATT_DIR) && $(LATEX2HTML) $(BLATT) $(LATEX2HTML_PARAMS)
	# sicherstellen, dass die .conf-Datei existiert
	$(TOUCH) $(BLATT_DIR)/$(BLATT_CONF)
	# zweiseitige Versionen der Musterloesung erstellen (A4: zum Drucken, falls 3-4 Seiten benoetigt werden)
	$(CD) $(BLATT_DIR) && $(PSTOPS) "2:0L@.7(21cm,0)+1L@.7(21cm,14.85cm)" -pa4 $(BLATT_PS) $(BLATT_ZWEISEITIG_PS)
	$(CD) $(BLATT_DIR) && $(PS2PDF) $(BLATT_ZWEISEITIG_PS) $(BLATT_ZWEISEITIG_PDF)
	# multi-Blatt-Versionen des Uebungsblattes erstellen (A5: zum Drucken, falls nur 2 Seiten benoetigt werden)
	$(CD) $(BLATT_DIR) && $(SHELL) $(ERZEUGE_MULTI_PDF_SCRIPT) $(BLATT_PDF)
	$(CD) $(BLATT_DIR) && $(SHELL) $(ERZEUGE_MULTI_PS_SCRIPT) $(BLATT_PS)
	$(CD) $(BLATT_DIR) && $(MV) $(MULTI_BLATT).pdf $(MULTI_BLATT)$(BLATTNUMMER).pdf
	$(CD) $(BLATT_DIR) && $(MV) $(MULTI_BLATT).ps $(MULTI_BLATT)$(BLATTNUMMER).ps 

# Uebungsblatt MIT Musterloesungen erstellen
# [wird rekursiv aufgerufen von Target 'b01', 'b02', ... 'b15']
private_blatt_mlsg:
	# Verzeichnis fuer Uebungsblatt erzeugen, wenn es noch nicht existiert
	if ! test -d  $(BLATT_DIR); then $(MKDIR) $(BLATT_DIR); fi
	# falls die zu erstellende Datei bereits existiert, wird sie umbenannt
	if test -e  $(BLATT_DIR)/$(BLATT_MLSG); then $(MV) $(BLATT_DIR)/$(BLATT_MLSG) $(BLATT_DIR)/$(BLATT_MLSG)~; fi
	# Uebungsblatt nacheinander aus den Bausteinen zusammensetzen
	$(CAT) $(MASTERFILES_DIR)/$(LATEX_HEADER) > $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(CAT) $(MASTERFILES_DIR)/$(LATEX_MACROS) >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_MLSG)
	# Blattnummmer und Flag fuer Musterloesung ja/nein einfuegen
	$(ECHO) "\newcommand{\blattNummer}{"$(BLATTNUMMER)"}" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "\newcommand{\blattNummerKurz}{"$(BLATTNUMMER_KURZ)"}" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "\setboolean{mlsg}{true}" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(CAT) $(BLATT_CONFIG_DIR)/$(BLATT_CONFIG) >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_HEADER) >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_PREAMBLE) >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_MLSG)
	# Aufruf zur Erzeugung des Koerpers mit den Uebungsaufgaben einfuegen
	$(ECHO) "\blattBody" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_MLSG)
	$(CAT) $(MASTERFILES_DIR)/$(LATEX_FOOTER) >> $(BLATT_DIR)/$(BLATT_MLSG)
	# Uebungsblatt mit Musterloesung 2x tex'en (wg. Referenzen)
	$(CD) $(BLATT_DIR) && $(LATEX) $(LATEX_PARAMS) $(BLATT_MLSG)
	$(CD) $(BLATT_DIR) && $(LATEX) $(LATEX_PARAMS) $(BLATT_MLSG)
	# Postscript erzeugen
	$(CD) $(BLATT_DIR) && $(PDFTOPS) $(BLATT_MLSG_PDF) $(BLATT_MLSG_PS)
	# LaTeX2HTML bzw. htlatex/tex4ht anwenden
	$(CP) $(MASTERFILES_DIR)/$(LATEX2HTML_CONF) $(BLATT_DIR)
	$(MKDIR) $(BLATT_DIR)/$(HTML_MLSG_DIR)
	$(CD) $(BLATT_DIR) && $(LATEX2HTML) $(BLATT_MLSG) $(LATEX2HTML_MLSG_PARAMS)
	# sicherstellen, dass die .conf-Datei existiert
	$(TOUCH) $(BLATT_DIR)/$(BLATT_CONF)
	# zweiseitige Versionen der Musterloesung erstellen
	$(CD) $(BLATT_DIR) && $(PSTOPS) "2:0L@.7(21cm,0)+1L@.7(21cm,14.85cm)" -pa4 $(BLATT_MLSG_PS) $(BLATT_MLSG_ZWEISEITIG_PS)
	$(CD) $(BLATT_DIR) && $(PS2PDF) $(BLATT_MLSG_ZWEISEITIG_PS) $(BLATT_MLSG_ZWEISEITIG_PDF)

# die fuer die Bearbeitung des Uebungsblattes benoetigten/auszugebenen Dateien gesammelt in das Verzeichnis fuer das Uebungsblatt kopieren (in die Unterverzeichnisse 'ausgabe' zum Hochladen auf den Webserver und 'ide' zum Uebertragen in eine Entwicklungsumgebung zur Praesentation in den Uebungen)
# [wird rekursiv aufgerufen von Target 'b01', 'b02', ... 'b15']
private_files:
	# Verzeichnis fuer Uebungsblatt erzeugen, wenn es noch nicht existiert
	if ! test -d  $(BLATT_DIR); then $(MKDIR) $(BLATT_DIR); fi
	# Aufgabenpool durchgehen und auszugebene Dateien fuer das aktuelle Uebungsblatt aus 'ausgabe' in das entsprechende 'ausgabe'-Verzeichnis fuer das gesamte Uebungsblatt kopieren
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_AUSGABE_DIR); then $(MKDIR) $(BLATT_DIR)/$(POOL_AUSGABE_DIR); $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_AUSGABE_DIR)/* $(BLATT_DIR)/$(POOL_AUSGABE_DIR); fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# Aufgabenpool durchgehen und die zur Praesentation in den Uebungen innerhalb einer IDE benoetigte Dateien fuer das aktuelle Uebungsblatt in das IDE-Verzeichnis kopieren
	# 1. 'mlsg/code/'-Verzeichnisse aus 'pool/' kopieren nach 'ide/mlsg/':
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_MLSG_DIR)/$(CODE_DIR); then $(MKDIR) $(BLATT_DIR)/$(IDE_DIR)/$(POOL_MLSG_DIR); $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_MLSG_DIR)/$(CODE_DIR)/* $(BLATT_DIR)/$(IDE_DIR)/$(POOL_MLSG_DIR); fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# 2. 'uebung/code/'-Verzeichnisse aus 'pool/' kopieren nach 'ide/uebung/':
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_UEBUNG_DIR)/$(CODE_DIR); then $(MKDIR) $(BLATT_DIR)/$(IDE_DIR)/$(POOL_UEBUNG_DIR); $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_UEBUNG_DIR)/$(CODE_DIR)/* $(BLATT_DIR)/$(IDE_DIR)/$(POOL_UEBUNG_DIR); fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# 3. 'ausgabe/code/'-Verzeichnisse aus 'pool/' kopieren nach 'ide/uebung/':
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_AUSGABE_DIR)/$(CODE_DIR); then $(MKDIR) $(BLATT_DIR)/$(IDE_DIR)/$(POOL_UEBUNG_DIR); $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_AUSGABE_DIR)/$(CODE_DIR)/* $(BLATT_DIR)/$(IDE_DIR)/$(POOL_UEBUNG_DIR); fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# ueberfluessige VCS-Ordner aus dem Verzeichnis fuer das Uebungsblatt entfernen (z.B. '.svn' im 'ausgabe'-Verzeichnis und im 'ide/'-Verzeichnis)
	$(CD) $(BLATT_DIR) && $(FIND) -name '$(VCS_DIR)' | while read DIRECTORY; do $(RM_RECURSIVE) "$$DIRECTORY"; done;

# einsammeln der Fragen fuer das aktuelle Uebungsblatt, sofern der Ordner fuer den Fragenkatalog existiert
# [wird rekursiv aufgerufen von Target 'b01', 'b02', ... 'b15']
private_fragen:
	# aus dem Fragenkatalog alle Dateien, die mit der Nummer des aktuellen Uebungsblatts beginnen, in das Uebungsblatt-Verzeichnis kopieren
#	if test -d  $(FRAGENKATALOG_DIR); then $(CP) $(FRAGENKATALOG_DIR)/$(BLATTNUMMER)* $(BLATT_DIR); $(CP) $(FRAGENKATALOG_DIR)/blatt$(BLATTNUMMER)* $(BLATT_DIR); exit 0; fi
# Hinweis: die 'exit'-Anweisung am Ende dient lediglich dazu zu verhindern, dass 'make' abbricht, wenn keine Fragenkatalog-Dateien existieren (verhindert positiven Exit-Code fuer diese Zeile
	# Dateien kopieren, die mit der Blattnummer beginnen (z.B. 01*)
	if test -d  $(FRAGENKATALOG_DIR); then FILESPEC='$(FRAGENKATALOG_DIR)/$(BLATTNUMMER)*'; for i in $$FILESPEC; do if [ "$$i" = "$$FILESPEC" ]; then echo $$i nicht gefunden!; exit 0; fi; $(CP) $$i $(BLATT_DIR); done; fi
	# Dateien kopieren, die mit blatt+Blattnummer beginnen (z.B. blatt01*)
	if test -d  $(FRAGENKATALOG_DIR); then FILESPEC='$(FRAGENKATALOG_DIR)/blatt$(BLATTNUMMER)*'; for i in $$FILESPEC; do if [ "$$i" = "$$FILESPEC" ]; then echo $$i nicht gefunden!; exit 0; fi; $(CP) $$i $(BLATT_DIR); done; fi

# Bewertungsschema zu den Uebungsaufgaben erstellen
# [wird rekursiv aufgerufen von Target 'b01', 'b02', ... 'b15']
private_bewertung:
	# Verzeichnis fuer Uebungsblatt erzeugen, wenn es noch nicht existiert
	if ! test -d  $(BLATT_DIR); then $(MKDIR) $(BLATT_DIR); fi
	# falls die zu erstellende Datei bereits existiert, wird sie umbenannt
	if test -e  $(BLATT_DIR)/$(BLATT_BEWERTUNG); then $(MV) $(BLATT_DIR)/$(BLATT_BEWERTUNG) $(BLATT_DIR)/$(BLATT_BEWERTUNG)~; fi
	# Kopfzeilen schreiben
	$(ECHO) "Bewertung zum Uebungsblatt $(BLATTNUMMER)" > $(BLATT_DIR)/$(BLATT_BEWERTUNG)
	$(ECHO) "=============================" >> $(BLATT_DIR)/$(BLATT_BEWERTUNG)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_PREAMBLE_BEWERTUNG) >> $(BLATT_DIR)/$(BLATT_BEWERTUNG)
	$(ECHO) "" >> $(BLATT_DIR)/$(BLATT_BEWERTUNG)
	# Aufgabenpool durchgehen und die Gesamtdatei fuer die Vorbesprechung im zugehoerigen Uebungsverzeichnis erstellen
	ZEILE=1; while read AUFGABE; do $(ECHO_ESCAPES) "Aufgabe $(BLATTNUMMER_KURZ).$$ZEILE: \c" >> $(BLATT_DIR)/$(BLATT_BEWERTUNG); let ZEILE=$$ZEILE+1; if test -e $(POOL_DIR)/$$AUFGABE/$(BEWERTUNG); then $(CAT) $(POOL_DIR)/$$AUFGABE/$(BEWERTUNG) >> $(BLATT_DIR)/$(BLATT_BEWERTUNG); else $(ECHO_ESCAPES) "N.N.\n" >> $(BLATT_DIR)/$(BLATT_BEWERTUNG); fi; $(ECHO_ESCAPES) "[$$AUFGABE]\n\n" >> $(BLATT_DIR)/$(BLATT_BEWERTUNG); done < $(BLATT_DIR)/$(BLATT_CONF)

# einzelne Uebungsblaetter durch rekursive Aufrufe erzeugen
# [werden rekursiv aufgerufen von Target 'all']
b01:
	$(MAKE) private_blatt BLATTNUMMER=01 BLATTNUMMER_KURZ=1
	$(MAKE) private_blatt_mlsg BLATTNUMMER=01 BLATTNUMMER_KURZ=1
	$(MAKE) private_files BLATTNUMMER=01 BLATTNUMMER_KURZ=1
	$(MAKE) private_fragen BLATTNUMMER=01 BLATTNUMMER_KURZ=1
	$(MAKE) private_bewertung BLATTNUMMER=01 BLATTNUMMER_KURZ=1

b02:
	$(MAKE) private_blatt BLATTNUMMER=02 BLATTNUMMER_KURZ=2
	$(MAKE) private_blatt_mlsg BLATTNUMMER=02 BLATTNUMMER_KURZ=2
	$(MAKE) private_files BLATTNUMMER=02 BLATTNUMMER_KURZ=2
	$(MAKE) private_fragen BLATTNUMMER=02 BLATTNUMMER_KURZ=2
	$(MAKE) private_bewertung BLATTNUMMER=02 BLATTNUMMER_KURZ=2

b03:
	$(MAKE) private_blatt BLATTNUMMER=03 BLATTNUMMER_KURZ=3
	$(MAKE) private_blatt_mlsg BLATTNUMMER=03 BLATTNUMMER_KURZ=3
	$(MAKE) private_files BLATTNUMMER=03 BLATTNUMMER_KURZ=3
	$(MAKE) private_fragen BLATTNUMMER=03 BLATTNUMMER_KURZ=3
	$(MAKE) private_bewertung BLATTNUMMER=03 BLATTNUMMER_KURZ=3

b04:
	$(MAKE) private_blatt BLATTNUMMER=04 BLATTNUMMER_KURZ=4
	$(MAKE) private_blatt_mlsg BLATTNUMMER=04 BLATTNUMMER_KURZ=4
	$(MAKE) private_files BLATTNUMMER=04 BLATTNUMMER_KURZ=4
	$(MAKE) private_fragen BLATTNUMMER=04 BLATTNUMMER_KURZ=4
	$(MAKE) private_bewertung BLATTNUMMER=04 BLATTNUMMER_KURZ=4

b05:
	$(MAKE) private_blatt BLATTNUMMER=05 BLATTNUMMER_KURZ=5
	$(MAKE) private_blatt_mlsg BLATTNUMMER=05 BLATTNUMMER_KURZ=5
	$(MAKE) private_files BLATTNUMMER=05 BLATTNUMMER_KURZ=5
	$(MAKE) private_fragen BLATTNUMMER=05 BLATTNUMMER_KURZ=5
	$(MAKE) private_bewertung BLATTNUMMER=05 BLATTNUMMER_KURZ=5

b06:
	$(MAKE) private_blatt BLATTNUMMER=06 BLATTNUMMER_KURZ=6
	$(MAKE) private_blatt_mlsg BLATTNUMMER=06 BLATTNUMMER_KURZ=6
	$(MAKE) private_files BLATTNUMMER=06 BLATTNUMMER_KURZ=6
	$(MAKE) private_fragen BLATTNUMMER=06 BLATTNUMMER_KURZ=6
	$(MAKE) private_bewertung BLATTNUMMER=06 BLATTNUMMER_KURZ=6

b07:
	$(MAKE) private_blatt BLATTNUMMER=07 BLATTNUMMER_KURZ=7
	$(MAKE) private_blatt_mlsg BLATTNUMMER=07 BLATTNUMMER_KURZ=7
	$(MAKE) private_files BLATTNUMMER=07 BLATTNUMMER_KURZ=7
	$(MAKE) private_fragen BLATTNUMMER=07 BLATTNUMMER_KURZ=7
	$(MAKE) private_bewertung BLATTNUMMER=07 BLATTNUMMER_KURZ=7

b08:
	$(MAKE) private_blatt BLATTNUMMER=08 BLATTNUMMER_KURZ=8
	$(MAKE) private_blatt_mlsg BLATTNUMMER=08 BLATTNUMMER_KURZ=8
	$(MAKE) private_files BLATTNUMMER=08 BLATTNUMMER_KURZ=8
	$(MAKE) private_fragen BLATTNUMMER=08 BLATTNUMMER_KURZ=8
	$(MAKE) private_bewertung BLATTNUMMER=08 BLATTNUMMER_KURZ=8

b09:
	$(MAKE) private_blatt BLATTNUMMER=09 BLATTNUMMER_KURZ=9
	$(MAKE) private_blatt_mlsg BLATTNUMMER=09 BLATTNUMMER_KURZ=9
	$(MAKE) private_files BLATTNUMMER=09 BLATTNUMMER_KURZ=9
	$(MAKE) private_fragen BLATTNUMMER=09 BLATTNUMMER_KURZ=9
	$(MAKE) private_bewertung BLATTNUMMER=09 BLATTNUMMER_KURZ=9

b10:
	$(MAKE) private_blatt BLATTNUMMER=10 BLATTNUMMER_KURZ=10
	$(MAKE) private_blatt_mlsg BLATTNUMMER=10 BLATTNUMMER_KURZ=10
	$(MAKE) private_files BLATTNUMMER=10 BLATTNUMMER_KURZ=10
	$(MAKE) private_fragen BLATTNUMMER=10 BLATTNUMMER_KURZ=10
	$(MAKE) private_bewertung BLATTNUMMER=10 BLATTNUMMER_KURZ=10

b11:
	$(MAKE) private_blatt BLATTNUMMER=11 BLATTNUMMER_KURZ=11
	$(MAKE) private_blatt_mlsg BLATTNUMMER=11 BLATTNUMMER_KURZ=11
	$(MAKE) private_files BLATTNUMMER=11 BLATTNUMMER_KURZ=11
	$(MAKE) private_fragen BLATTNUMMER=11 BLATTNUMMER_KURZ=11
	$(MAKE) private_bewertung BLATTNUMMER=11 BLATTNUMMER_KURZ=11

b12:
	$(MAKE) private_blatt BLATTNUMMER=12 BLATTNUMMER_KURZ=12
	$(MAKE) private_blatt_mlsg BLATTNUMMER=12 BLATTNUMMER_KURZ=12
	$(MAKE) private_files BLATTNUMMER=12 BLATTNUMMER_KURZ=12
	$(MAKE) private_fragen BLATTNUMMER=12 BLATTNUMMER_KURZ=12
	$(MAKE) private_bewertung BLATTNUMMER=12 BLATTNUMMER_KURZ=12

b13:
	$(MAKE) private_blatt BLATTNUMMER=13 BLATTNUMMER_KURZ=13
	$(MAKE) private_blatt_mlsg BLATTNUMMER=13 BLATTNUMMER_KURZ=13
	$(MAKE) private_files BLATTNUMMER=13 BLATTNUMMER_KURZ=13
	$(MAKE) private_fragen BLATTNUMMER=13 BLATTNUMMER_KURZ=13
	$(MAKE) private_bewertung BLATTNUMMER=13 BLATTNUMMER_KURZ=13

b14:
	$(MAKE) private_blatt BLATTNUMMER=14 BLATTNUMMER_KURZ=14
	$(MAKE) private_blatt_mlsg BLATTNUMMER=14 BLATTNUMMER_KURZ=14
	$(MAKE) private_files BLATTNUMMER=14 BLATTNUMMER_KURZ=14
	$(MAKE) private_fragen BLATTNUMMER=14 BLATTNUMMER_KURZ=14
	$(MAKE) private_bewertung BLATTNUMMER=14 BLATTNUMMER_KURZ=14

b15:
	$(MAKE) private_blatt BLATTNUMMER=15 BLATTNUMMER_KURZ=15
	$(MAKE) private_blatt_mlsg BLATTNUMMER=15 BLATTNUMMER_KURZ=15
	$(MAKE) private_files BLATTNUMMER=15 BLATTNUMMER_KURZ=15
	$(MAKE) private_fragen BLATTNUMMER=15 BLATTNUMMER_KURZ=15
	$(MAKE) private_bewertung BLATTNUMMER=15 BLATTNUMMER_KURZ=15

# alle Uebungsblaetter durch rekursive Aufrufe erzeugen
blattall:
	$(MAKE) b01
	$(MAKE) b02
	$(MAKE) b03
	$(MAKE) b04
	$(MAKE) b05
	$(MAKE) b06
	$(MAKE) b07
	$(MAKE) b08
	$(MAKE) b09
	$(MAKE) b10
	$(MAKE) b11
	$(MAKE) b12
	$(MAKE) b13
	$(MAKE) b14
	$(MAKE) b15

# Gesamtdatei fuer die Vorbesprechung im Uebungverzeichnis erzeugen
# [wird aufgerufen von Target 'private_uebung']
private_vorbesprechung:
	# Verzeichnis fuer die Uebungen erzeugen, wenn es noch nicht existiert
	if ! test -d  $(UEBUNG_DIR); then $(MKDIR) $(UEBUNG_DIR); fi
	# falls die zu erstellende Datei bereits existiert, wird sie umbenannt
	if test -e  $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG); then $(MV) $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG) $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG)~; fi
	# Kopfzeilen schreiben
	$(ECHO) "Vorbesprechung zum Uebungsblatt $(BLATTNUMMER)" > $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG)
	$(ECHO) "==================================" >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_PREAMBLE_VORBESPRECHUNG) >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG)
	$(ECHO) "" >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG)
	# Aufgabenpool durchgehen und die Gesamtdatei fuer die Vorbesprechung im zugehoerigen Uebungsverzeichnis erstellen
	ZEILE=1; while read AUFGABE; do $(ECHO_ESCAPES) "Aufgabe $(BLATTNUMMER_KURZ).$$ZEILE: \c" >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG); let ZEILE=$$ZEILE+1; if test -e $(POOL_DIR)/$$AUFGABE/$(VORBESPRECHUNG); then $(CAT) $(POOL_DIR)/$$AUFGABE/$(VORBESPRECHUNG) >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG); else $(ECHO_ESCAPES) "N.N.\n" >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG); fi; $(ECHO_ESCAPES) "[$$AUFGABE]\n\n" >> $(UEBUNG_DIR)/$(BLATT_VORBESPRECHUNG); done < $(BLATT_DIR)/$(BLATT_CONF)

# Gesamtdatei fuer die Nachbesprechung im Uebungverzeichnis erzeugen
# [wird aufgerufen von Target 'private_uebung']
private_nachbesprechung:
	# Verzeichnis fuer die Uebungen erzeugen, wenn es noch nicht existiert
	if ! test -d  $(UEBUNG_DIR); then $(MKDIR) $(UEBUNG_DIR); fi
	# falls die zu erstellende Datei bereits existiert, wird sie umbenannt
	if test -e  $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG); then $(MV) $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG) $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG)~; fi
	# Kopfzeilen schreiben
	$(ECHO) "Nachbesprechung zum Uebungsblatt $(BLATTNUMMER)" > $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG)
	$(ECHO) "===================================" >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG)
	$(CAT) $(MASTERFILES_DIR)/$(BLATT_PREAMBLE_NACHBESPRECHUNG) >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG)
	$(ECHO) "" >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG)
	# Aufgabenpool durchgehen und die Gesamtdatei fuer die Nachbesprechung im zugehoerigen Uebungsverzeichnis erstellen
	ZEILE=1; while read AUFGABE; do $(ECHO_ESCAPES) "Aufgabe $(BLATTNUMMER_KURZ).$$ZEILE: \c" >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG); let ZEILE=$$ZEILE+1; if test -e $(POOL_DIR)/$$AUFGABE/$(NACHBESPRECHUNG); then $(CAT) $(POOL_DIR)/$$AUFGABE/$(NACHBESPRECHUNG) >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG); else $(ECHO_ESCAPES)  "N.N.\n" >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG); fi; $(ECHO_ESCAPES) "[$$AUFGABE]\n\n" >> $(UEBUNG_DIR)/$(BLATT_NACHBESPRECHUNG); done < $(BLATT_DIR)/$(BLATT_CONF)

# Uebungsverzeichnisse mit benoetigten Dateien, Beispielen, Musterloesungen und den Gesamtdateien fuer die Vor- und Nachbesprechung erzeugen
# [wird rekursiv aufgerufen von Target 'ueb01', 'ueb02', ... 'ueb15']
private_uebung: private_vorbesprechung private_nachbesprechung
	# Verzeichnis fuer die Uebungen erzeugen, wenn es noch nicht existiert
	if ! test -d  $(UEBUNG_DIR); then $(MKDIR) $(UEBUNG_DIR); fi
	# Verzeichnis fuer das aktuelle Uebungsblatt erzeugen, wenn es noch nicht existiert
	if ! test -d  $(UEBUNG_DIR)/$(BLATTNUMMER); then $(MKDIR) $(UEBUNG_DIR)/$(BLATTNUMMER); fi
	# Aufgabenpool durchgehen und Dateien fuer die Uebungen zum aktuellen Uebungsblatt in das entsprechende Uebungsverzeichnis kopieren
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_UEBUNG_DIR); then $(MKDIR) $(UEBUNG_DIR)/$(BLATTNUMMER)/$$ZEILE\_$$AUFGABE; $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_UEBUNG_DIR)/* $(UEBUNG_DIR)/$(BLATTNUMMER)/$$ZEILE\_$$AUFGABE/; fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# Aufgabenpool durchgehen und benoetigte/auszugebene Dateien fuer das aktuelle Uebungsblatt in das entsprechende Uebungsverzeichnis kopieren
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_AUSGABE_DIR); then $(MKDIR) $(UEBUNG_DIR)/$(BLATTNUMMER)/$$ZEILE\_$$AUFGABE; $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_AUSGABE_DIR)/* $(UEBUNG_DIR)/$(BLATTNUMMER)/$$ZEILE\_$$AUFGABE/; fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# Aufgabenpool durchgehen und Dateien der Musterloesung fuer das aktuelle Uebungsblatt in das entsprechende mlsg-Verzeichnis im Uebungsverzeichnis kopieren
	ZEILE=1; while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE/$(POOL_MLSG_DIR); then $(MKDIR) $(UEBUNG_DIR)/$(BLATTNUMMER)/$$ZEILE\_$$AUFGABE; $(CP_RECURSIVE) $(POOL_DIR)/$$AUFGABE/$(POOL_MLSG_DIR) $(UEBUNG_DIR)/$(BLATTNUMMER)/$$ZEILE\_$$AUFGABE; fi; let ZEILE=$$ZEILE+1; done < $(BLATT_DIR)/$(BLATT_CONF)
	# ueberfluessige VCS-Ordner aus dem Verzeichnis fuer das aktuelle Uebungsblatt im Uebungsverzeichnis entfernen
	$(CD) $(UEBUNG_DIR)/$(BLATTNUMMER) && $(FIND) -name '$(VCS_DIR)' | while read DIRECTORY; do $(RM_RECURSIVE) "$$DIRECTORY"; done;
	# Uebungsordner samt Musterloesungen packen und das Archiv in den Ordner fuer das Uebungsblatt ablegen (zur Ausgabe an die Tutoren)
	$(CD) ..; $(TAR_CREATE) $(AUFGABEN_DIR_NAME)/$(BLATT_DIR)/$(BLATT_ARCHIV) $(UEBUNG_DIR_NAME)/$(BLATTNUMMER)
	$(GZIP_COMPRESS) $(BLATT_DIR)/$(BLATT_ARCHIV)

# einzelne Uebungsverzeichnisse durch rekursive Aufrufe erzeugen
ueb01:
	$(MAKE) private_uebung BLATTNUMMER=01 BLATTNUMMER_KURZ=1

ueb02:
	$(MAKE) private_uebung BLATTNUMMER=02 BLATTNUMMER_KURZ=2

ueb03:
	$(MAKE) private_uebung BLATTNUMMER=03 BLATTNUMMER_KURZ=3

ueb04:
	$(MAKE) private_uebung BLATTNUMMER=04 BLATTNUMMER_KURZ=4

ueb05:
	$(MAKE) private_uebung BLATTNUMMER=05 BLATTNUMMER_KURZ=5

ueb06:
	$(MAKE) private_uebung BLATTNUMMER=06 BLATTNUMMER_KURZ=6

ueb07:
	$(MAKE) private_uebung BLATTNUMMER=07 BLATTNUMMER_KURZ=7

ueb08:
	$(MAKE) private_uebung BLATTNUMMER=08 BLATTNUMMER_KURZ=8

ueb09:
	$(MAKE) private_uebung BLATTNUMMER=09 BLATTNUMMER_KURZ=9

ueb10:
	$(MAKE) private_uebung BLATTNUMMER=10 BLATTNUMMER_KURZ=10

ueb11:
	$(MAKE) private_uebung BLATTNUMMER=11 BLATTNUMMER_KURZ=11

ueb12:
	$(MAKE) private_uebung BLATTNUMMER=12 BLATTNUMMER_KURZ=12

ueb13:
	$(MAKE) private_uebung BLATTNUMMER=13 BLATTNUMMER_KURZ=13

ueb14:
	$(MAKE) private_uebung BLATTNUMMER=14 BLATTNUMMER_KURZ=14

ueb15:
	$(MAKE) private_uebung BLATTNUMMER=15 BLATTNUMMER_KURZ=15

# aufraeumen: Dateien mit Endungen .aux, .log, .out, ~, etc. loeschen; erzeugte .pdf-Dateien in den pool-Verzeichnissen ebenfalls loeschen
clean:
	$(RM) blatt??/blatt*.log blatt??/blatt*.aux blatt??/blatt*.out
	$(RM) blatt??/$(LATEX2HTML_CONF) blatt??/blatt*.4ct blatt??/blatt*.4tc blatt??/blatt*.idv blatt??/blatt*.lg blatt??/blatt*.dvi blatt??/blatt*.tmp blatt??/blatt*.xref blatt??/blatt*.css blatt??/blatt*.html
	$(RM) $(POOL_DIR)/*/*.log $(POOL_DIR)/*/*.aux $(POOL_DIR)/*/*.out $(POOL_DIR)/*/$(LATEX_BLATT_TEST).pdf
	$(FIND) $(BLATT_CONFIG_DIR) -name '*~' | while read FILE; do $(RM) "$$FILE"; done;
	$(FIND) $(UEBUNG_DIR) -name '*~' | while read FILE; do $(RM) "$$FILE"; done;

# einzelne Uebungsblaetter und Uebungsverzeichnisse durch rekursive Aufrufe erzeugen
# [werden aufgerufen von Target 'all']
01:
	$(MAKE) b01
	$(MAKE) ueb01
	$(MAKE) clean

02:
	$(MAKE) b02
	$(MAKE) ueb02
	$(MAKE) clean

03:
	$(MAKE) b03
	$(MAKE) ueb03
	$(MAKE) clean

04:
	$(MAKE) b04
	$(MAKE) ueb04
	$(MAKE) clean

05:
	$(MAKE) b05
	$(MAKE) ueb05
	$(MAKE) clean

06:
	$(MAKE) b06
	$(MAKE) ueb06
	$(MAKE) clean

07:
	$(MAKE) b07
	$(MAKE) ueb07
	$(MAKE) clean

08:
	$(MAKE) b08
	$(MAKE) ueb08
	$(MAKE) clean

09:
	$(MAKE) b09
	$(MAKE) ueb09
	$(MAKE) clean

10:
	$(MAKE) b10
	$(MAKE) ueb10
	$(MAKE) clean

11:
	$(MAKE) b11
	$(MAKE) ueb11
	$(MAKE) clean

12:
	$(MAKE) b12
	$(MAKE) ueb12
	$(MAKE) clean

13:
	$(MAKE) b13
	$(MAKE) ueb13
	$(MAKE) clean

14:
	$(MAKE) b14
	$(MAKE) ueb14
	$(MAKE) clean

15:
	$(MAKE) b15
	$(MAKE) ueb15
	$(MAKE) clean

# alle Uebungsblaetter und Uebungsverzeichnisse durch rekursive Aufrufe erzeugen,
# anschliessend mit 'clean' aufraeumen
all:
	$(MAKE) 01
	$(MAKE) 02
	$(MAKE) 03
	$(MAKE) 04
	$(MAKE) 05
	$(MAKE) 06
	$(MAKE) 07
	$(MAKE) 08
	$(MAKE) 09
	$(MAKE) 10
	$(MAKE) 11
	$(MAKE) 12
	$(MAKE) 13
	$(MAKE) 14
	$(MAKE) 15

# Archiv inkl. druckbare (komplette) PDF-Datei mit Fragenkatalog und Bewertung zur Ausgabe an die Tutoren erzeugen; zuvor muss z.B. mit 'make b01' und 'make ueb01' oder alternativ mit 'make 01' das entsprechende Uebungsblatt-Verzeichnis ('blatt01') samt Archiv mit den Uebungsinhalten und Musterloesungen erzeugt worden sein; ausserdem muessen sich ggf. die benoetigten Fragenkataloge (.txt-Dateien) bereits im Uebungsblatt-Verzeichnis befinden
# [wird rekursiv aufgerufen von Target 'tut01', 'tut02', ... 'tut15']
private_tutor:
	# erzeuge ein temp. Verzeichnis im Aufgabeverzeichnis (z.B. 'blatt01/blatt01/')
	$(MKDIR) $(BLATT_DIR)/$(BLATT_DIR)
	# kopiere benoetigte Dateien in das temp. Verzeichnis
	$(CP) $(BLATT_DIR)/*.txt $(BLATT_DIR)/$(BLATT_DIR)
	$(CP) $(BLATT_DIR)/$(BLATT_PDF) $(BLATT_DIR)/$(BLATT_DIR)
	$(CP) $(BLATT_DIR)/$(BLATT_BEWERTUNG) $(BLATT_DIR)/$(BLATT_DIR)
	$(CP) $(BLATT_DIR)/$(BLATT_MLSG_PDF) $(BLATT_DIR)/$(BLATT_DIR)
	$(CP) $(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_PDF) $(BLATT_DIR)/$(BLATT_DIR)
	$(CP) $(BLATT_DIR)/$(BLATT_ARCHIV_COMPRESSED) $(BLATT_DIR)/$(BLATT_DIR)
	# konvertiere alle .txt-Dateien (Fragenkatalog und Bewertung) nach Postscript
	$(CD) $(BLATT_DIR) && for i in *.txt; do $(A2PS) $$i -o $$i.ps; done
	# fuege die doppelseitige Postscript-Musterloesung und die erzeugten .txt.ps-Dateien zu einer (kompletten) PS-Datei zusammen
	PSFILES=$(BLATT_MLSG_ZWEISEITIG_PS); $(CD) $(BLATT_DIR) && for i in *.txt.ps; do PSFILES="$$PSFILES $$i"; done; $(GHOSTSCRIPT) -sOutputFile=$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PS) $$PSFILES -c quit
	# ... alternativ das ganze mit 'psmerge' (funktioniert nicht auf allen Systemen)
	#PSFILES=$(BLATT_MLSG_ZWEISEITIG_PS); $(CD) $(BLATT_DIR) && for i in *.txt.ps; do PSFILES="$$PSFILES $$i"; done; psmerge -o$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PS) $$PSFILES
	# erzeugte (komplette) PS-Datei in PDF wandeln
	$(PS2PDF) $(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PS) $(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PDF)
	# erzeugte (komplette) PDF-Datei in das temp. Verzeichnis kopieren
	$(CP) $(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PDF) $(BLATT_DIR)/$(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PDF)
	# erzeuge ein Archiv zur Ausgabe an die Tutoren
	$(CD) $(BLATT_DIR) && $(TAR_CREATE) $(BLATT_TUTOR_ARCHIV) $(BLATT_DIR)
	$(CD) $(BLATT_DIR) && $(GZIP_COMPRESS) $(BLATT_TUTOR_ARCHIV)
	# entferne die erzeugten .txt.ps-Dateien
	$(RM) $(BLATT_DIR)/*.txt.ps
	# entferne (komplette) PS-Datei
	#$(RM) $(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PS)
	# entferne (komplette) PDF-Datei
	#$(RM) $(BLATT_DIR)/$(BLATT_MLSG_ZWEISEITIG_KOMPLETT_PDF)
	# entferne das temp. Verzeichnis
	$(RM_RECURSIVE) $(BLATT_DIR)/$(BLATT_DIR)

# einzelne Archive zur Ausgabe an die Tutoren durch rekursive Aufrufe erzeugen
tut01:
	$(MAKE) private_tutor BLATTNUMMER=01

tut02:
	$(MAKE) private_tutor BLATTNUMMER=02

tut03:
	$(MAKE) private_tutor BLATTNUMMER=03

tut04:
	$(MAKE) private_tutor BLATTNUMMER=04

tut05:
	$(MAKE) private_tutor BLATTNUMMER=05

tut06:
	$(MAKE) private_tutor BLATTNUMMER=06

tut07:
	$(MAKE) private_tutor BLATTNUMMER=07

tut08:
	$(MAKE) private_tutor BLATTNUMMER=08

tut09:
	$(MAKE) private_tutor BLATTNUMMER=09

tut10:
	$(MAKE) private_tutor BLATTNUMMER=10

tut11:
	$(MAKE) private_tutor BLATTNUMMER=11

tut12:
	$(MAKE) private_tutor BLATTNUMMER=12

tut13:
	$(MAKE) private_tutor BLATTNUMMER=13

tut14:
	$(MAKE) private_tutor BLATTNUMMER=14

tut15:
	$(MAKE) private_tutor BLATTNUMMER=15

# Quellcode aktualisieren, z.B. das '@version'-Tag in Java mit dem aktuellen Datum belegen
# [wird rekursiv aufgerufen von Target 'codeup01', 'codeup02', ... 'codeup15']
private_code_update:
	# Aufgabenpool durchgehen und das Skript fuer die Quellcode-Aktualisierung jeweils aufrufen
	while read AUFGABE; do $(SHELL) $(UPDATE_CODE_SCRIPT) $(POOL_DIR)/$$AUFGABE/; done < $(BLATT_DIR)/$(BLATT_CONF)

# Quellcode der einzelnen Uebungsblaetter durch rekursive Aufrufe updaten (z.B. '@version'-Tag in Java aktualisieren)
codeup01:
	$(MAKE) private_code_update BLATTNUMMER=01

codeup02:
	$(MAKE) private_code_update BLATTNUMMER=02

codeup03:
	$(MAKE) private_code_update BLATTNUMMER=03

codeup04:
	$(MAKE) private_code_update BLATTNUMMER=04

codeup05:
	$(MAKE) private_code_update BLATTNUMMER=05

codeup06:
	$(MAKE) private_code_update BLATTNUMMER=06

codeup07:
	$(MAKE) private_code_update BLATTNUMMER=07

codeup08:
	$(MAKE) private_code_update BLATTNUMMER=08

codeup09:
	$(MAKE) private_code_update BLATTNUMMER=09

codeup10:
	$(MAKE) private_code_update BLATTNUMMER=10

codeup11:
	$(MAKE) private_code_update BLATTNUMMER=11

codeup12:
	$(MAKE) private_code_update BLATTNUMMER=12

codeup13:
	$(MAKE) private_code_update BLATTNUMMER=13

codeup14:
	$(MAKE) private_code_update BLATTNUMMER=14

codeup15:
	$(MAKE) private_code_update BLATTNUMMER=15

# alle relevanten Verzeichnisse zu einem Uebungsblatt im Datei-Browser (z.B. Nautilus) oeffnen
# [wird rekursiv aufgerufen von Target 'dir01', 'dir02', ... 'dir15']
private_directories:
	# Ordner des Uebungsblattes und das entsprechende Uebungsverzeichnis oeffnen
	$(FILE_BROWSER) $(BLATT_DIR) $(UEBUNG_DIR)/$(BLATTNUMMER)
	# Aufgabenpool durchgehen und Verzeichnisse der Aufgaben fuer das aktuelle Uebungsblatt oeffnen
	while read AUFGABE; do if test -d $(POOL_DIR)/$$AUFGABE; then $(FILE_BROWSER) $(POOL_DIR)/$$AUFGABE; fi; done < $(BLATT_DIR)/$(BLATT_CONF)

# Standardordner im Datei-Browser (z.B. Nautilus) oeffnen
dir:
	$(FILE_BROWSER) $(BLATT_CONFIG_DIR)

dir01:
	$(MAKE) private_directories BLATTNUMMER=01

dir02:
	$(MAKE) private_directories BLATTNUMMER=02

dir03:
	$(MAKE) private_directories BLATTNUMMER=03

dir04:
	$(MAKE) private_directories BLATTNUMMER=04

dir05:
	$(MAKE) private_directories BLATTNUMMER=05

dir06:
	$(MAKE) private_directories BLATTNUMMER=06

dir07:
	$(MAKE) private_directories BLATTNUMMER=07

dir08:
	$(MAKE) private_directories BLATTNUMMER=08

dir09:
	$(MAKE) private_directories BLATTNUMMER=09

dir10:
	$(MAKE) private_directories BLATTNUMMER=10

dir11:
	$(MAKE) private_directories BLATTNUMMER=11

dir12:
	$(MAKE) private_directories BLATTNUMMER=12

dir13:
	$(MAKE) private_directories BLATTNUMMER=13

dir14:
	$(MAKE) private_directories BLATTNUMMER=14

dir15:
	$(MAKE) private_directories BLATTNUMMER=15

# Aufraeumen und ein .tar.gz erstellen (Backup)
backup: clean
	@echo "Creating archive..."
	$(CD) ..; $(TAR_CREATE) $(TMP_DIR)/$(BACKUP_ARCHIV_PREFIX)_$(START_DATE).tar $(AUFGABEN_DIR_NAME) $(UEBUNG_DIR_NAME)
	$(GZIP_COMPRESS) $(TMP_DIR)/$(BACKUP_ARCHIV_PREFIX)_$(START_DATE).tar
	$(MV) $(TMP_DIR)/$(BACKUP_ARCHIV_PREFIX)_$(START_DATE).tar.gz ./$(BACKUP_ARCHIV_PREFIX)_$(START_DATE).tar.gz
	@echo "Archive ready."

