Make
Kurzerklärung
make (engl. - machen) ist ein Computerprogramm, das Kommandos in Abhängigkeit von Bedingungen ausführt. Es wird hauptsächlich im Unixbereich bei der Softwareentwicklung eingesetzt (z. B. mit C, C++ etc.) .
Er wird z. B. genutzt, um in einem Projekt, das aus vielen verschiedenen Dateien mit Quellcode besteht, automatisiert alle Arbeitsschritte (Übersetzung, Bindung, Dateien kopieren, etc.) zu steuern, bis hin zum fertigen ausführbaren Programm.
Alternativen zum Make-Befehl
(erhebt keinen Anspruch auf Vollständigkeit)
- Derivate von Make, sind z.B. GNU Make, nmake (Microsoft), JMake, Opus Make, MKS.
- Apache Ant. XML-basiertes System mit demselben Zweck, das mit Hilfe von Java erweitert werden kann. Siehe dazu http://jakarta.apache.org/ant/.
- Integrierte Entwicklungsumgebung (IDE). Dort wird das Ganze in eine graphische Benutzerschnittstelle (GUI) verpackt und ist subjektiv leichter zu handhaben. Beispiel unter GNU/Linux ist KDE KDevelop, das es erlaubt, C, C++ für die Konsole und QT und KDE Programme für KDE zu erstellen. Ein Beispiel unter Windows ist der Borland C++ Builder.
Erklärung
Make liest ein so genanntes Makefile, in dem der Erstellungsprozess von Programmen formalisiert erfasst ist. Dieser Formalisierung beschreibt, welche Quelldateien der Compiler zu welchen Objektdateien verarbeitet, und welche Objektdateien vom Linker dann zu Programmbibliotheken oder ausführbaren Programmen verbunden werden. Wenn das Makefile vom make-Programm abgearbeitet wird, wird eine Umwandlung etwa einer Quelldatei in eine Objektdatei nur dann vorgenommen, wenn die Quelldatei neuer als die Objektdatei ist. Bei der Entwicklung großer Programmpakete mit vielen Quelldateien und vielen ausführbaren Programmen entfällt so die Notwendigkeit, bei einer Reihe kleiner Veränderungen alle Compilationen erneut durchzuführen. Der Erfolg dieser 'Sparmaßnahme' hängt natürlich von der korrekten Angabe der Dateiabhängigkeiten ab. Alle Abhängigkeiten müssen vollständig und korrekt im Makefile beschrieben sein - was bei großen Projekten nicht leicht zu realisieren ist. Insbesondere bei Programmänderungen oder -erweiterungen können neue Abhängigkeiten entstehen. Diese müssen sofort im Makefile eingetragen werden.
Die von make ausgeführten Befehle sind nicht auf Compiler oder Linker beschränkt. Jedes Werkzeug, das der Kommandozeileninterpreter zur Verfügung stellt, kann benutzt werden, um die gewünschten Dateimanipulationen zu erreichen. So kann man z. B. automatisch Bilder aus Texten erzeugen.
Beispiel
Ein Programm "prog" soll aus zwei Quelldateien "filea.c" und "fileb.c" so erzeugt werden, dass immer möglichst wenig Übersetzungs- und Bindevorgänge benötigt werden, wenn nur eine der beiden Quellen geändert wird.
prog: filea.obj fileb.obj LD -o prog filea.obj fileb.obj
filea.obj: filea.c CC -c filea.c
fileb.obj: fileb.c CC -c fileb.c
Die erste Zeile bedeutet, dass das Programm prog aus den Teilen filea.obj und fileb.obj hergestellt wird. Die darauffolgende Zeile gibt an, wie mit welchem Werkzeug - hier ein Linker - dies erfolgen soll. Die dritte Zeile gibt an, dass filea.obj aus filea.c hergestellt wird und zwar in der vierten Zeile durch Aufruf von cc dem C-Kompiler. Die fünfte und sechste Zeile sind analog.
Der Erstellungsvorgang wird dann auf der Kommandozeile mittels make prog gestartet.
Das vorliegende Beispiel zeigt lediglich die einfachste Form eines Makefiles, es gibt Methoden wie z. B. Patternregeln, die das Makefile einfacher machen.
Prinzip
Ein Makefile gibt eine Abhängigkeit von vielen Dateien untereinander vor.
Umfeld
Starke Verwendung erfährt Make in der Welt des Open Source, deren Projekte im Quellcode vorliegen.
Die Vorgehensweise, um daraus ein ausführbares Programm zu machen, ist meist wie folgt:
- Archiv auspacken, siehe tar-Befehl
- in das Verzeichnis wechseln (per cd)
- auf der Befehlszeile './configure' eingeben (hilfreich ist immer ein Blick in alle 'INSTALL' oder 'README' genannten Dateien)
- danach 'make' und meistens noch ein 'make install' ausführen, um das Programm zu installieren, d.h. in die entsprechenden Verzeichnisse zu kopieren