Hallo lug-ddler!
Ich möchte von einem Make-Durchlauf ein komplettes Logfile anlegen lassen. Um die Auswirkung von Parametern vergleichen zu können, soll bei jedem Durchlauf ein neues Logfile angelegt werden. Dazu wird mit date eine Zeichenkette gebildet, die dem Dateinamen des Logfiles angehangen wird. Allerdings beißen sich Logfile und make noch ein bißchen:
Variante 1 (Die Prozesse legen einzelne reports an, die ungefähr der Bildschirmausgabe entsprechen.)
--Makefile-- DATE = $(shell date +"%Y-%m-%d__%H_%M") export LOGFILE := logfile_$(DATE).txt
all: module_B
module.A: process_A cat process_A.report > $(LOGFILE)
module.B: module.A process_B cat process_B.report >> $(LOGFILE) --end--
Problem: Im Fehlerfall wird cat nicht mehr aufgerufen und das Logfile ist unvollständig; es enthält nur die reports von den erfolgreichen Prozessen
Variante 2
--Makefile-- DATE = $(shell date +"%Y-%m-%d__%H_%M") export LOGFILE := logfile_$(DATE).txt
all: module_B
module.A: process_A | tee $(LOGFILE)
module.B: module.A process_B | tee --append $(LOGFILE) --end--
Auch hier ist der Fehlerfall das Problem, da tee den Fehler "abfängt" bzw. maskiert. Damit läuft make trotz Fehler weiter.
(Variante 3) make TARGET | tee LOGFILE
Das ist keine (bequeme) Lösung, da bei jedem Start der Dateinamen manuell eingegeben werden müßte.
(Variante 4) Ein Skript welches make entsprechend startet (wie in Variante 3) empfinde ich als unelegant. Da geht der Vorteil verloren alle targets in einem Makefile zu haben.
Vielleicht hat ja von Euch jemand eine Idee oder einen Vorschlag, wie sich das Ganze mit make-Bordmitteln elegant lösen lässt.
Grüße Bert
P.S.: Das eigentliche Makefile besteht aus mehr als zwei Prozessen und läuft unter cygwin auf Win7.
On Thursday 18 August 2011, Bert Lange wrote:
Ich möchte von einem Make-Durchlauf ein komplettes Logfile anlegen lassen. Um die Auswirkung von Parametern vergleichen zu können, soll bei jedem Durchlauf ein neues Logfile angelegt werden. Dazu wird mit date eine Zeichenkette gebildet, die dem Dateinamen des Logfiles angehangen wird. Allerdings beißen sich Logfile und make noch ein bißchen:
Deine Varianten 3 und 4 sind die einfachsten, die ich genommen hätte. Varianten 1 + 2 sind recht unelegant, aber lassen sich mit etwas Magie ausbessern:
Variante 2
--Makefile-- DATE = $(shell date +"%Y-%m-%d__%H_%M") export LOGFILE := logfile_$(DATE).txt
pre_all: $(MAKE) all 2>&1 |tee $(LOGFILE)
all: module_B
module.A: process_A
module.B: module.A process_B --end--
Die "pre_all"-Regel wird per default ausgeführt - alles was sie tut ist make nochmal aufrufen und den Output umleiten, das 2>&1 sorgt dafür dass auch Fehlermeldungen im Log landen.
Konrad
Am 18.08.2011 um 22:04 schrieb Konrad Rosenbaum:
Deine Varianten 3 und 4 sind die einfachsten, die ich genommen hätte.
Ja, aber auch die Unbequemsten. Und Bequemlichkeit ist ja bekanntlich(?) ein große Motivation für den Ingenieur ;-)
--Makefile-- DATE = $(shell date +"%Y-%m-%d__%H_%M") export LOGFILE := logfile_$(DATE).txt
pre_all: $(MAKE) all 2>&1 |tee $(LOGFILE)
Danke, das paßt hervorragend, da es schon sowas wie pre_all schon existiert.
Die "pre_all"-Regel wird per default ausgeführt - alles was sie tut ist make nochmal aufrufen und den Output umleiten, das 2>&1 sorgt dafür dass auch Fehlermeldungen im Log landen.
Manchmal kommt man eben nicht auf die einfachsten Dinge.
Vielen Dank für alle Antworten. (Auch an Thomas, dessen Lösung auf einem anderen System leider *nicht* gleich out-of-the-box laufen würde.)
Ciao Bert
Bert Lange wrote:
Hallo lug-ddler!
Ich möchte von einem Make-Durchlauf ein komplettes Logfile anlegen lassen. Um die Auswirkung von Parametern vergleichen zu können, soll bei jedem Durchlauf ein neues Logfile angelegt werden. Dazu wird mit date eine Zeichenkette gebildet, die dem Dateinamen des Logfiles angehangen wird.
Ich würde eine Shell-Funktion bauen, zum Beispiel so:
function make() { DATE=`date +"%Y-%m-%d__%H_%M"` /usr/bin/make "$@" |& tee logfile_$DATE.txt }
Ciao, Thomas
lug-dd@mailman.schlittermann.de