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
-
27.4.2007 / 8:16
GNU make (+ auto) sind tod. CMake ftw! http://www.cmake.org/HTML/Documentation.html
-
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.)
-
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!
-
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. -
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>
navigation
- [1] was ist [ pimp my shell ] ?
- [2] programme
- [3] skripte / dotfiles
- [4] shellshots
- [5] mitmachen
- [6] autoren
- [7] einloggen
- [8] impressum
aussehen
ältere beiträge
- 08.26 lsr – Das fehlende Listing
- 06.18 wirklich? so einfach?
- 06.17 fbcmd – update
- 06.04 worklog – die zeit im griff
- 05.30 google-reader >> snownews
- 05.28 fbcmd – facebook in der shell
- 05.28 bitlbee – alles in einem!
- 05.16 NoPaste/pastebin-Service über die Shell mit curl und sprunge.us
- 04.15 Die Heirloom-Tools – Unix unter Linux
- 02.13 dvtm – dwm für die Konsole
beitrags-archiv
- August 2010 (1)
- Juni 2010 (3)
- Mai 2010 (3)
- Mai 2008 (1)
- April 2008 (1)
- Februar 2008 (4)
- Januar 2008 (1)
- Dezember 2007 (2)
- September 2007 (1)
- August 2007 (1)
- Juli 2007 (6)
- Juni 2007 (1)
kategorien
- allgemein (17)
- berichte (7)
- fun (2)
- gnu_screen (2)
- hintergrundwissen (3)
- how-tos (11)
- internes (6)
- programme (31)
- shells (6)
- tutorials (6)
- user-skripte (2)
- vim (5)
- webseiten (5)
5 Kommentare
Zum Kommentarformular | Kommentar rss [?] | trackback uri [?]