The mighty make

`make’ ist eines dieser Programme zu denen auch `screen’ und der `vim’ gehören — Existenz wahrgenommen, soll einiges können, aber nie selbst eingearbeitet. Diejenigen aber die diese Programme in ihren Workflow aufgenommen haben, können nicht mehr ohne!

make introduction

Früher hatte ich mir irgendwelche fertigen Makefiles zusammenkopiert und angepasst. Vor ein paar Monaten habe ich mich dann aber mal etwas intensiver mit make befasst und bin nun regelrecht begeistert von diesem mächtigen Tool.

Ich möchte hier eine kleine Einführung und einige Anregungen geben make doch auch mal einzusetzen. Es gibt so viele Anwendungsbereiche dafür und ein paar möchte ich hier vorstellen.

Wie make im Einzelnen funktioniert und was dies oder das genau bedeutet kann in Manpages, dem WWW und Büchern nachgelesen werden. Wenn man sich selbst damit befasst, versteht man auch und kann nicht nur.

make desire-for-more

make kann weit mehr als nur Quellcode kompilieren. Natürlich kann es das auch und zwar höchst effizient und bequem.

make kann aber auch alles was ein Shellscript kann – make ist quasi ein Shellscript.

make gibt es (fast) überall … auch auf Windows

make overview

Makefiles bestehen aus einzelnen Targets die dem Befehl `make’ als Parameter übergeben werden können.
Die übergebenen Targets (und ihre Abhängigkeiten) werden automatisch ausgeführt.

Wenn eine Datei mit gleichem Namen wie das übergebene Target existiert und aktuell ist, dann wird das Target nicht ausgeführt.
Aktuell sein heißt dabei, dann keine ihrer Abhängigkeiten jünger als sie ist.

Wird kein Target übergeben, dann wird automatisch das Erste ausgeführt.

make compile

Für das Kompilieren heißt das nun, dass nur kompiliert wird, wenn es notwendig ist. Also wenn eine Source-Datei jünger als die Binary ist.
Am Besten lässt man (beim gcc) die Zwischenobjekte *.o auch erstellen, dann werden auch nur diejenigen neu kompiliert bei denen sich die Sourcen auch verändert haben. Die Anderen werden nur gelinkt.
Auf diese Weise kann man sich (gerade bei größeren Programmen) recht viel Zeit sparen.

Der zweite große Grund für make ist die gewisse Vergesslichkeit die (besonders) bei Programmierern schon mal vorkommt.
Da möchte man ein altes Projekt neu kompilieren und muss grübeln welche Libs man dazu linken muss, u.ä.
Steht der Compileraufruf aber im Makefile, dann reicht auch nach Jahren noch ein simples `make clean all’ aus

Da Makefiles ja auch (fast) nur Shellscripte sind, können auch Targets wie ‘clean’ (normalerweise: entfernt alle automatisch erzeugten Dateien) eingebaut werden.

`make clean all’ würde also alle *.o und die Binary löschen und danach das Programm komplett neue kompilieren. (Das Target ‘all’ wird üblicherweise als Erstes aufgeführt und kompiliert das komplette Programm)

Wie zu sehen ist gibt es Targets mit gängigen Namen und Funktionen (`make install’ düfte ja bekannt sein). Wichtig ist dabei nur, dass es im Verzeichnis keine Dateien mit exakt diesen Namen gibt, da diese sonst als aktuell angesehen werden könnten und make das Target somit überspringt.

Um nicht jedesmal mein Makefile von Grund auf neu schreiben zu müssen, habe ich mal ein Allgemeines Makefile erstellt, das für quasi jedes C/C++-Programm verwendbar ist. (Zumindest als Grundlage). Einfach in das Projekt kopieren und die Variable SRC korrekt setzen.

make pdf

Ein weiteres Anwendungsgebiet bei dem Makefiles äußerst nützlich sind, ist das Erstellen von Dokumenten mit LaTeX.

Okay das ist letztendlich auch nur Kompilieren … aber zugegeben, wer hat an den Einsatz von Makefiles dabei schon gedacht?

Denkbare Targets wären hier:
- all: einmaliger Durchlauf
- complete: dreimaliger Durchlauf (für Inhaltsverzeichnis und korrekte Seitenzahlen)
- show: öffnen des fertigen Dokuments im Viewer (äußerst praktisch)
- clean: immer gut
- …

Mein Beispiel-Makefile hierzu ist schon etwas älter und deshalb auch recht simpel. Hier ließe sich deutlich mehr herausholen (auch im Bezug auf Teilkompilierungen). Ich hatte nur bisher keine Lust es neu aufzusetzen ;-P

make upload

Weshalb denn nicht Webdesign-Projekte per Makefile (via ncftpput) hochladen?

make backup

Oder Backup auf diese Weise erledigen. Makefiles sind schließlich auch Shellscripte …. mit bereits eingebauter Argumentauswertung.

make nice-hint

Makefiles kann man im Vim einfach durch `:make [targets]‘ ausführen … der Editor muss dazu nicht geschlossen werden. Das ist doch deutlich komfortabler als Strg+z und `fg’.

make final-words

make ist klasse!
make ist mächtig!
make ist omnipotent! ;-)

apt-get install make


Über diesen Beitrag


  1. Doomshammer 27.4.2007 / 8:16

    GNU make (+ auto) sind tod. CMake ftw! http://www.cmake.org/HTML/Documentation.html

  2. meillo 27.4.2007 / 21:42

    make ist keinesfalls tot!
    CMake wäre ganz schön aufgeschmissen, gäbe es kein make mehr.

    vgl.

    [...]used to generate standard build files (e.g., makefiles on Unix) which are used in the usual way.
    [...]
    Despite the use of “make” in the name, CMake is a separate and higher-level application suite than the make system common to Unix development.

    CMake ist also nur ein (platformunabhängiger) Wrapper für make.

    … und der ist zudem als Debian-Paket 4.9MB (!) groß ….. nur um mir das Makefile schreiben abzunehmen!? :-S

    @Doomshammer: ich kann meine Aussage nicht wirklich nachvollziehen. Willst du erklären?

    (Ich möchte allerdings anmerken, dass ich CMake nie verwendet habe. Meine Informationen basieren nur auf meiner Recherche.)

  3. dioli 28.4.2007 / 14:11

    Jo, make ist echt der hit und ja, warum nur für’s kompilieren hernehmen!

    Bin auch nicht der Ansicht es sei tot. Make ftw!

  4. pascal 13.7.2007 / 19:46

    Das allgemeine Makefile ist ziemlich übertrieben — zumindest bei gnu-make kann man fast alles weglassen,

    target : a.o b.o
    a.o : x.h y.h
    b.o : x.h

    reicht eigentlich, nur noch CFLAGS und LDLIBS setzen.

  5. meillo 13.7.2007 / 20:05

    @pascal: ja, das stimmt (wie ich inzwischen auch erfahren habe)

    … nur, wenn man kein GNU-make hat? Ich kenne mich da zu wenig aus um fundierte Informationen liefen zu können.

    Wichtig war mir aber auch anschaulich Makefiles zu erklären, und zum Verständnis ist dieses “unnötige” Zeug sicher nützlich.

    dennoch: Danke für die Anmerkung!
    (Ich verlinke auch sehr gerne ein Beispiel-Makefile von dir)

Hinterlasse einen Kommentar

XHTML: Folgende Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>




Safari hates me