(maintain, update and regenerate groups of programs)
Bei der modularen Programmierung bestehen Programme meist aus mehreren Dateien. make bietet eine Methode zum Aktualisieren solcher Programme.
make verwendet ein makefile, in dem Sie Ziele festlegen und angeben können, wie ein Ziel von anderen Zielen abhängt. Wurde eine Quelldatei geändert, erzeugt make das Programm neu, indem es genau die Teile neu übersetzt, die direkt oder indirekt von der geänderten Datei abhängen.
make erstellt das Ziel neu, wenn es älter ist als mindestens eine der Dateien, von denen es abhängt. make berücksichtigt die Abhängigkeitsbeziehungen der Dateien untereinander und ermittelt Datum und Uhrzeit der letzten Änderung einer Datei.
Das makefile heißt normalerweise makefile
, Makefile
, s.makefile
oder s.Makefile
. Folgt man dieser Benennungskonvention, können Sie make ohne Angabe von Argumenten aufrufen. make sucht nach dem makefile im aktuellen Dateiverzeichnis bzw. im Verzeichnis SCCS
und generiert das Ziel neu, wenn mindestens eine Änderung stattgefunden hat.
Syntax
make[ -einpqrst][ -f makefile]... [ -k|-S] [makro=name]... [ziel]... |
Die make-Optionen haben folgende Bedeutung:
überschreibt die Definitionen in makefiles durch Umgebungsvariablen.
makefile wird als Name einer Beschreibungsdatei angesehen.
ignoriert Fehlermeldungen von Kommandos, die in einer Kommandofolge stehen. make setzt die Bearbeitung auch nach Fehlern fort. .IGNORE im makefile bewirkt dasselbe.
bricht die Kommandofolge ab, wenn in einem Eintrag des makefiles ein Fehler auftritt. Die Bearbeitung wird bei allen anderen Zielen fortgesetzt, die vom fehlerhaften Ziel unabhängig sind. -k überschreibt vorangegangene -S-Optionen.
dient als Testhilfe. Alle Kommandos werden ausgegeben, auch die mit vorangestelltem @. Ausgeführt werden nur Kommandos mit vorangestelltem Pluszeichen +.
gibt eine vollständige Liste der Makrodefinitionen und der Beschreibung der Zieldateien aus.
gibt den Status Null zurück, wenn die Zieldatei aktuell ist. Ein Status ungleich Null gibt an, dass die Zieldatei neu erstellt werden muss. Die Zieldatei wird nicht verändert, jedoch werden Kommandos mit vorangestelltem Pluszeichen + ausgeführt.
ignoriert die vordefinierten Regeln.
unterdrückt das Setzen eines neuen Zeitstempels und die Ausgabe der ausgeführten Kommandos.
beendet sich, wenn in einem Eintrag des makefiles ein Fehler auftritt. Dies ist die Standardeinstellung. -S überschreibt vorangegangene -k-Optionen.
gibt den Zielen des makefiles einen neuen Zeitstempel und diese werden als aktuell angenommen. Ausgeführt werden nur Kommandos mit vorangestelltem Pluszeichen +. |
Erzeugen eines makefiles
Das mit der Option -f angegebene makefile ist eine sorgfältig strukturierte Datei mit expliziten Anweisungen zum Aktualisieren von Programmen. Die Datei enthält eine Reihe von Einträgen, die Abhängigkeiten angeben. Die erste Zeile eines Eintrags ist eine durch Leerzeichen getrennte, nicht leere Liste von Zielen, dann folgt ein :, danach eine (möglicherweise leere) Liste der erforderlichen Dateien oder Abhängigkeiten. Auf ein ; folgender Text und alle nachfolgenden Zeilen, die mit einem Tabulator beginnen, sind Shell-Kommandos, die zur Aktualisierung des Ziels ausgeführt werden sollen. Die erste nicht leere Zeile, die nicht mit einem Tabulator oder # anfängt, beginnt eine neue Abhängigkeit oder Makrodefinition. Shell-Kommandos können durch die Angabe von <Backslash><Neue-Zeile-Zeichen> über mehrere Zeilen gehen. Alles, was von make ausgegeben wird (mit Ausnahme des ersten Tabulators), geht direkt und unverändert an die Shell. Daher erzeugt
die Ausgabe von a b genau wie dies auch mit der Shell erfolgen würde. Kommandos, die über mehrere Zeilen gehen, dürfen insgesamt maximal Kommentare werden von # und dem Neue-Zeile-Zeichen umschlossen. Das folgende makefile besagt, dass pgm von den beiden Dateien a.o und b.o abhängig ist, die ihrerseits von ihren jeweiligen Quelldateien (a.c und b.c) sowie von der gemeinsamen Datei pgm: a.o b.o c89 a.o b.o -o pgm a.o: incl.h a.c c89 -c a.c b.o: incl.h b.c c89 -c b.c |
Ausführung eines makefiles
Kommandozeilen werden nacheinander jeweils von einer eigenen Shell ausgeführt. Mit der SHELL-Umgebungsvariablen bzw. dem SHELL-Makro kann die von make zur Ausführung von Kommandos verwendete Shell angegeben werden. Der Standard ist Die folgenden Anweisungen können in einem makefile angegeben werden, um die Ausführung zu steuern:
make unterstützt in vollem Umfang die XPG4 Beschreibung. Andernfalls weicht make in einigen Punkten von der Beschreibung ab, um die Ablauffähigkeit bestehender makefiles zu gewährleisten.
Wenn eine Datei angelegt werden muss, jedoch keine ausdrücklichen Kommandos oder relevanten Standardregeln vorliegen, werden die bei .DEFAULT angegebenen Kommandos verwendet.
Für alle von diesem Ziel abhängigen Dateien werden Fehlermeldungen von Kommandos ignoriert. Ist keine Datei angegeben, entspricht die Wirkung der Option -i.
Von diesem Ziel abhängige Dateien werden nicht gelöscht, falls das Quit- oder Interrupt-Signal empfangen wird. Ist keine Datei angegeben, werden alle Dateien beibehalten.
Für alle von diesem Ziel abhängigen Dateien wird die Ausgabe der ausgeführten Kommandos unterdrückt. Ist keine Datei angegeben, entspricht die Wirkung der Option -s. Die Ausführung einzelner Kommandos kann durch Voranstellen der Zeichen @, - oder + gesteuert werden. Wird ein Kommando auf Standardausgabe geschrieben, werden diese Zeichen nicht mit ausgegeben.
die Ausgabe des Kommandos wird unterdrückt
Fehler werden ignoriert
das Kommando wird immer ausgeführt, auch wenn eine der Optionen -n, -q oder -t gesetzt ist Eine Zeile wird ausgegeben, wenn sie ausgeführt wird, es sei denn, die Option -s ist vorhanden, oder der Eintrag .SILENT ist für die Datei gültig oder die Anfangszeichenkette enthält ein @. Option -n gibt das Kommando aus, ohne es auszuführen, außer wenn der Kommandozeile ein + vorangestellt ist (dann wird die Zeile immer ausgeführt). Die Option -t aktualisiert das geänderte Datum einer Datei ohne Ausführen von Kommandos (außer wenn einem Kommando ein + vorangestellt ist). make wird normalerweise (bzw. wenn die Option -S gesetzt ist) durch Kommandos beendet, die einen Status ungleich Null zurückgeben. Wenn die Option -i vorhanden ist, oder der Eintrag .IGNORE für die Datei gilt, oder die erste Zeichenkette des Kommandos - enthält, wird der Endestatus ignoriert. Wenn die Option -k vorhanden ist, wird die Arbeit am aktuellen Eintrag verlassen, jedoch in anderen Verzweigungen, die nicht von diesem Eintrag abhängen, fortgeführt. Die Zieldatei wird durch Unterbrechung und Verlassen gelöscht, außer der Eintrag .PRECIOUS ist für sie gültig. |
Umgebung
Die Umgebung wird von make gelesen. Alle Variablen werden als Makrodefinitionen verstanden und als solche verarbeitet. Die Umgebungsvariablen werden vor jedem makefile und unmittelbar nach den vordefinierten Regeln verarbeitet. Daher werden Umgebungsvariablen von Makrozuweisungen in einem makefile überschrieben. Die Option -e bewirkt, dass die Umgebung die Makrozuweisungen in einem makefile überschreibt. Dateinamen-Zusätze und ihre entsprechenden Regeln in makefile überschreiben vordefinierte Regeln für diese Erweiterungen. Die Umgebungsvariable Die Umgebungsvariable PROJECTDIR gibt an, in welchem Verzeichnis SCCS-Dateien gesucht werden sollen, falls sie nicht im aktuellen Verzeichnis liegen. SCCS-Dateien werden jeweils in einem Unterverzeichnis SCCS gesucht. Bei Angabe von relativen Pfadnamen wird zunächst das HOME-Verzeichnis nach Unterverzeichnissen src bzw. source durchsucht. Existieren diese Verzeichnisse nicht, wird der Pfad relativ zum aktuellen Verzeichnis gesetzt. |
Include-Dateien
Wenn include am Anfang einer Zeile in makefile erscheint und danach ein Leerzeichen oder ein Tabulator folgt, wird der Rest der Zeile als Dateiname interpretiert, dessen zugehörige Datei vom aktuellen Aufruf nach Ersetzen von Makros gelesen wird. |
Makro-Definitionen
Einträge der Form Zeichenkette1 = Zeichenkette2 sind Makrodefinitionen. Zeichenkette2 wird als Folge aller Zeichen bis zu einem Kommentarzeichen oder einem nicht entwerteten Neue-Zeile-Zeichen definiert. Bei jedem anschließenden Auftreten wird $(Zeichenkette1[:Ersatz1=[Ersatz2]]) durch Zeichenkette2 ersetzt. Die runden Klammern sind optional, wenn ein Makroname mit einem Zeichen verwendet wird und keine Ersetzungs-Regel vorhanden ist. Das optionale :Ersatz1=Ersatz2 ist eine Ersetzungs-Regel. Bei Angabe dieser Regel wird jedes sich nicht überschneidende Auftreten von Ersatz1 im angegebenen Makro durch Ersatz2 ersetzt. Zeichenketten für diese Art von Ersetzung werden durch Leerzeichen, Tabulatorzeichen, Neue-Zeile-Zeichen und Zeilenanfänge begrenzt. Ein Beispiel für die Verwendung der Ersetzungs-Regeln wird im Abschnitt Bibliotheken gezeigt. |
Interne Makros
Es gibt insgesamt fünf intern verwaltete Makros, die zum Schreiben von Regeln für den Aufbau von Zielen nützlich sind.
stellt den Stamm des Dateinamens der aktuellen abhängigen Datei dar, wobei der Zusatz gelöscht ist. Die Auswertung erfolgt nur bei Ausführung der Abhängigkeitsregeln.
stellt den vollen Zielnamen des aktuellen Ziels dar. Die Auswertung erfolgt nur für ausdrücklich angegebene Abhängigkeiten.
wird nur bei Anwendung der Abhängigkeitsregeln oder der .DEFAULT-Regel ausgewertet. Es ist das Modul, das in Bezug auf das Ziel veraltet ist, d.h. der „angefertigte“ abhängige Dateiname. Auf diese Weise würde Makro $< in der Regel
oder:
wird ausgewertet, wenn die expliziten Regeln des makefiles ausgewertet werden. Es ist die Liste der Vorbedingungen, die in Hinblick auf das Ziel veraltet sind.
wird nur ausgewertet, wenn das Ziel ein Teil einer Archivbibliothek in der Form Die Makros können alternative Formen aufweisen. Wenn ein Großbuchstabe D oder F angehängt wird, ändert sich die Bedeutung in „Dateiverzeichnis-Teil“ für D und „Dateiteil“ für F. Daher bezieht sich |
Standardregeln
Bestimmte Namen, wie z. B. solche, die auf .o enden, haben ableitbare Abhängigkeitsbeziehungen wie z.B. .c, .s usw. Wenn für eine solche Datei keine Aktualisierungskommandos in makefile definiert sind, werden Dateien, die den Standard-Abhängigkeitsbeziehungen entsprechen gesucht und übersetzt, um das Ziel zu erzeugen. Für diesen Fall hat make Abhängigkeitsregeln, die durch Prüfung der Suffixe und Bestimmung einer zur Anwendung geeigneten Abhängigkeitsregel den Aufbau von Dateien aus anderen Dateien ermöglichen. Folgende Standard-Abhängigkeitsregeln existieren:
|
Der Benutzer kann zu dieser Liste Regeln hinzufügen, indem diese in die Datei makefile geschrieben werden.
Die Ableitung von Abhängigkeitsbeziehungen kann gesteuert werden. Die Regel zur Erstellung einer Datei mit dem Suffix .o aus einer Datei mit dem Suffix .c ist als Eintrag mit .c.o: als Ziel und ohne Abhängigkeiten spezifiziert. Mit dem Ziel in Zusammenhang stehende Shell-Kommandos definieren die Regel zur Erstellung einer .o-Datei aus einer .c-Datei. Ein Ziel, das keine Schrägstriche aufweist und mit einem Punkt beginnt, wird als Regel angesehen und nicht als echtes Ziel.
Die Standardregeln für make sind in der Quelldatei rules.c für das Programm make enthalten. Sie können lokal verändert werden. Um die in make eingebauten Regeln auf einem beliebigen Gerät in einer für eine Neuübersetzung geeigneten Form auszugeben, wird nachstehendes Kommando verwendet:
make -pf - 2>/dev/null </dev/null
Eine Tilde in den obigen Regeln bezieht sich auf eine SCCS-Datei. Daher würde die Regel .c ̃.o eine SCCS-C-Quelldatei in eine Objektdatei (.o) umwandeln. Da das s. der SCCS-Dateien ein Dateiname-Präfix ist, ist es nicht mit dem Begriff von Suffix im Sinn von make vereinbar. Daher stellt die Tilde eine Möglichkeit zur Änderung eines Dateiverweises in einen SCCS-Dateiverweis dar.
Eine Regel mit nur einem Zusatz (z.B. .c:) ist die Definition dafür, wie man x aus x.c aufbaut. Tatsächlich ist das andere Suffix leer. Dies ist nützlich für den Aufbau von Zielen aus nur einer Quelldatei (z.B. Shell-Prozeduren, einfache C-Programme).
Zusätzliche Suffixe können als Liste bei .SUFFIXES definiert werden. Die Reihenfolge ist von Bedeutung; der erste mögliche Name, für den eine Datei und eine Regel vorhanden sind, wird für die Erzeugung ausgewählt. Die Standardliste lautet:
.SUFFIXES .o .c .c
~ .y .y
~ .l .l
~ .s .s
~ .sh .sh
~ .h .h
~ .f .f
~ .C .C
~ .Y .Y
~ .L .L
~
Das obige Kommando zur Ausgabe der internen Regeln zeigt auch diese Liste der auf der aktuellen Maschine implementierten Zusätze an. Mehrfach-Suffix-Listen sind akkumulierend; .SUFFIXES: ohne Abhängigkeiten löscht die Suffix-Liste.
Das bei „Erzeugen eines makefiles“ angegebene Beispiel lässt sich damit kürzer formulieren:
pgm: a.o b.o c89 a.o b.o -o pgm a.o b.o: incl.h
Die Standard-Abhängigkeitsregeln verwenden gewisse Makros, um die Aufnahme von optionalen Teilen in die erzeugte Kommandofolge zu ermöglichen. Zum Beispiel werden CFLAGS
, LFLAGS
und YFLAGS
für Übersetzeroptionen von c89 [5], lex bzw. yacc verwendet.
Mit der Anweisung .SCCS_GET
können die Standardkommandos zum Zugriff auf SCCS
-Dateien, die nicht im aktuellen Verzeichnis liegen, geändert werden. Standardregel ist:
.SCCS_GET: sccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $@
Bibliotheken
Wenn eine Ziel- oder eine Abhängigkeitsbezeichnung Klammern enthält, wird sie als Archivbibliothek angesehen, wobei die in Klammern stehende Zeichenkette auf einen Eintrag in der Bibliothek verweist. So verweisen Es folgt die Beschreibung der häufigsten Anwendung der Archivschnittstelle. Hier soll davon ausgegangen werden, dass alle Quelldateien C-Quellen sind: lib: lib(file1.o) lib(file2.o) lib(file3.o) @echo lib is now up-to-date .c.a: $(CC) -c $(CFLAGS) $< $(AR) $(ARFLAGS) $@ $*.o rm -f $*.o Tatsächlich ist diese Regel lib: lib(file1.o) lib(file2.o) lib(file3.o) $(CC) -c $(CFLAGS) $(?:.o=.c) $(AR) $(ARFLAGS) lib $? rm $? @echo lib is now up-to-date .c.a:; In diesem Fall wird der Makro-Ersetzungsmechanismus verwendet. Die Liste $? ist als der Satz von Objektdateinamen definiert (innerhalb von |
Datei
/usr/bin/sh |
Hinweis
Einige Kommandos geben ungerechtfertigt einen Status ungleich Null zurück; zur Lösung dieses Problems verwendet man -i oder die Option - in der Kommandozeile. Dateinamen mit den Zeichen = : @ können nicht verarbeitet werden. Kommandos, die direkt von der Shell ausgeführt werden, insbesondere cd, sind in make über Neue-Zeile-Zeichen hinweg wirkungslos. Die Syntax |
Internationale Umgebung
Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos make: LANG Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden. LC_ALL Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen. LC_CTYPE Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung. LC_MESSAGES Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden. NLSPATH Legt den Pfad der Meldungsdateien für LC_MESSAGES fest. |
Siehe auch
ar, lex, yacc c89 [5] |