.\" .\" aegis - project change supervisor .\" Copyright (C) 1997, 2001, 2002, 2006-2008 Peter Miller .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see .\" . .\" .nh 1 "Das Gesamtbild" In diesem Kapitel werden alle auf den vorangegangenen Seiten er\*:orterten Aspekte zusammengef\*:ugt und das Beispielprojekt mit seinen getrennten Modulen wird vorgestellt, aber mit einem Gesamtprojekt-\f[CW]Makefile\fP. Die Verzeichnisstruktur unterscheidet sich wenig von der rekursiven, au\(sser dass die tieferliegenden \f[CW]Makefiles\fP durch modulspezifische Include-Dateien ersetzt werden: .so 07.figure1.so .LP Das \f[CW]Makefile\fP sieht folgenderma\(ssen aus: .TS H center,box; lw(2.5i)f(CW). .TH MODULES := ant bee .sp 0.2 # look for include files in # each of the modules CFLAGS += $(patsubst %,-I%,\e $(MODULES)) .sp 0.2 # extra libraries if required LIBS := .sp 0.2 # each module will add to this SRC := .sp 0.2 # include the description for # each module include $(patsubst %,\e %/module.mk,$(MODULES)) .sp 0.2 # determine the object files OBJ := \e $(patsubst %.c,%.o, \e $(filter %.c,$(SRC))) \e $(patsubst %.y,%.o, \e $(filter %.y,$(SRC))) .sp 0.2 # link the program prog: $(OBJ) $(CC) -o $@ $(OBJ) $(LIBS) .sp 0.2 # include the C include # dependencies include $(OBJ:.o=.d) .sp 0.2 # calculate C include # dependencies %.d: %.c depend.sh `dirname $*.c` $(CFLAGS) $*.c > $@ .TE Das erscheint sehr lang, aber es enth\*:alt alle \*:ublichen Elemente an einer Stelle, so dass die Make-Include-Dateien in den einzelnen Modulen sehr kurz sein k\*:onnen. .LP Die ant/module.mk Datei sieht folgenderma\(ssen aus: .TS center,box; lw(2.5i)f(CW). SRC += ant/main.c .TE Die bee/module.mk Datei sieht so aus: .TS center,box; lw(2.5i)f(CW). SRC += bee/parse.y LIBS += -ly .sp 0.2 %.c %.h: %.y $(YACC) -d $*.y mv y.tab.c $*.c mv y.tab.h $*.h .TE .LP Beachten Sie bitte, dass die Built-in-Regeln f\*:ur die C-Dateien verwendet werden, aber wir ben\*:otigen ein spezielles yacc-Verfahren, um die erzeugte \f[CW].h\fP-Datei zu bekommen. .LP Die Einsparungen in diesem Beispiel wirken unerheblich, weil das \f[CW]Makefile\fP der obersten Ebene so gro\(ss ist. Aber stellen Sie sich vor, es handele sich um 100 Module, jedes mit ein paar funktionellen, modulspezifischen Zeilen. Insgesamt erreicht man oft, ohne an Modularit\*:at zu verlieren, einen geringeren Zeitaufwand als bei Verwendung eines rekursiven Makes. .LP Der entsprechende DAG des \f[CW]Makefiles\fP sieht, nachdem man alle Einf\*:ugungen vorgenommen hat, folgenderma\(ssen aus: .so 07.figure2.so .LP Die Knotenpunkte und Kanten f\*:ur die Inklude-Dateiabh\*:angikeitsdateien sind ebenfalls vorhanden, da sie wichtig sind, damit Make fehlerlos funktionieren kann. .nh 2 "Nebeneffekte" Es gibt eine Reihe w\*:unschenswerter Nebeneffekte, wenn man ein einziges \f[CW]Makefile\fP verwendet. .IP \(bu 2n Die -j-Option des GNU-Makes f\*:ur parallel laufende Builds funktioniert besser als vorher. Sie kann sogar mehr voneinander unabh\*:angige Vorg\*:ange zugleich ausf\*:uhren und leidet nicht mehr an subtilen Fehlern. .\" My thanks to Marcus Harnisch for this .\" insight into parallel build problems. .IP \(bu 2n Die -k-Option des allgemeinen Makes, die daf\*:ur sorgt, dass Make selbst angesichts von Fehlern so weit wie m\*:oglich weiter arbeitet, funktioniert ebenfalls besser als vorher. Sie findet sogar mehr Material, mit dem sie weiterarbeiten kann.