Makefile
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Bei make handelt es sich um ein Werkzeug, mit dem man die Abhängigkeiten eines Build Prozesses auflösen kann. Dieses Stück Software ist schon sehr alt und in unterschiedlichsten Implementierungen verfügbar, die verbreitesten sind wohl GNU make 🇬🇧 und BSD make 🇬🇧 . Leider sind die verschiedenen Varianten untereinander nicht ganz kompatibel.
Dieser Artikel beschränkt sich auf GNU make.
Installation¶
Das benötigte Paket lässt sich unter folgendem Namen installieren [1]:
make
Befehl zum Installieren der Pakete:
sudo apt-get install make
Oder mit apturl installieren, Link: apt://make
Kurze Beschreibung¶
make kann sehr viel mehr, als hier beschrieben werden könnte, es folgt daher lediglich eine kurze Erläuterung, um was es eigentlich geht. In einem Makefile lassen sich Regeln beschreiben, wie bestimmte "Targets" (Ziele) erstellt werden können. Diese können von anderen Zielen oder Dateien abhängen.
Beispielsweise erstellt man eine Objektdatei aus einer Sourcedatei, indem man sie kompiliert. Dazu muss aber natürlich die Sourcedatei vorhanden sein. Eine solche Regel könnte zum Beispiel so aussehen:
1 2 | hello.o: hello.c $(CC) -c $(CFLAGS) hello.c |
die erste Zeile besagt, dass zum Erstellen von hello.o die Datei hello.c benötigt wird. Die Zweite sagt aus, wie das Erstellen von hello.o zu bewerkstelligen ist. Variablen werden mit $ eingeleitet. So beinhaltet zum Beispiel $(CC) in der Regel den Namen des C Compilers.
Derartige Regeln kann man auch mit Wildcards versehen, so kann man eine Regel erstellen, mit der man ausdrücken kann, wie generell aus einer *.c eine *.o Datei zu erstellen ist:
1 2 | %.o: %.c $(CC) -c $(CFLAGS) $< |
Dabei steht die spezielle Variable $< für den Namen der tatsächlichen Source Datei, wie zum Beispiel hello.c.
Beispiel¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | CC = gcc OBJECTS = cbg.o LIBS = -lcurl CFLAGS = -Wall -O2 BINDIR = $(DESTDIR)/usr/bin NAME = cbg cbg: $(OBJECTS) $(CC) -o $(NAME) $(OBJECTS) $(LIBS) %.o: %.c $(CC) -c $(CFLAGS) $< install: install --mode=755 $(NAME) $(BINDIR)/ clean: rm *.o $(NAME) uninstall: rm $(BINDIR)/$(NAME) |
Damit ist es nun möglich, die einzelnen Ziele zu erstellen:
make install make clean make uninstall
Wird kein Ziel angegeben, so wird das erste Ziel erstellt, in obigen Beispiel also cbg.
Links¶