IT-Academy Logo
Sign Up Login Help
Home - Betriebssysteme - Linux - Anwendungssoftware - Das Kommando "make"



Das Kommando "make"

Ohne "make" nix los könnte man meinen. Eines der wichtigsten Tools im Linux/Unix-Bereich zum kompilieren von Source-Code. Hier eine Einführung.


Autor: Franz Schaefer (mond)
Datum: 06-04-2002, 11:28:00
Referenzen: info make
http://www.cs.bris.ac.uk/Teaching/Resources/General/make_intro.html
http://linux.oreillynet.com/lpt/a/linux/2002/01/31/make_intro.html
Schwierigkeit: Anfänger
Ansichten: 4002x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Übersicht

wer schon mal selbst programme von source weg installiert hat kennt den
"make" befehl schon. heute wollen wir lernen wir wir einfache makefiles
selber erzeugen.

wozu make? die befehle zum uebersetzen eines programmes koennten wir doch
ebensogut in ein kleines shellscript schreiben dass wir anstarten wenn wir
das programm compilieren wollen. der nachteil: bei grossen projekten
wuerden wir dann immer alles uebersetzten auch wenn sich nur irgendwo eine
zeile geaendert haben und man nur ein einziges file neu compilieren
muesste. "make" ist dazu da genau dieses problem zu loesen. man kann make
aber nicht nur zum aufruf eines compiliers verwenden sondern jeglichen
befehl der outputfiles in abhaengigkeit von input files erzeugt und der
aufgerufen soll wenn eines der input files sich geaendert hat. z.b:

ein latex text besteht aus haupt.tex und inkludiert teil1.tex und
teil2.tex wenn sich eines der beiden geaendert hat soll ein neues .dvi
file erzeugt werden.

haupt.dvi: haupt.tex teil1.tex teil2.tex
latex haupt.tex

^__ hier KEINE spaces sondern einen tabulator.

WICHTIG: die befehlszeile muss IMMER mit einem tabulator beginnen.

obiges schreiben wir in ein file namens "Makefile". (man beachte das
grosse M)

obiges besagt dass das "target" haupt.dvi abhaengig ist von 3 .tex files
darunter stehen ein oder mehrere befehle die mit einem TABULATOR
eingerueckt sind die zum erzeugen dieses targets aufgerufen werden
muessen.

wenn wir nun

make

aufrufen so wird latex haupt.tex augerufen um das haupt.dvi file zu
erzeugen falls es nicht schon existiert und aelter ist als die 3 .tex
files von denen es abhaengt.

zum testen ob der latex befehl wirklich aufegrufen wird wenn sich eines
der files aendert koennen wir es editiren oder wir aktualsieren die zeit des
files mit einem "touch"

touch teil2.tex

wir koennen nun auch z.b. den befehl zum erzeugen eines .ps files
dazugeben:

ausgabe.ps: haupt.dvi
dvips -ta4 haupt.dvi -oausgabe.ps

wenn wir nun:

make ausgabe.ps

aufrufen so ruft uns das Makefile den dvips befehl nur dann auf falls
"haupt.dvi" neuer is als "ausgabe.ps"

ein make ohne parameter versucht nur das erste target zu erzeugen. wir
koennen daher z.b. eine zeile angeben:

all: ausgabe.ps

unser Makefile sieht dann so aus:


----schnippp-----------------
all: ausgabe.ps

haupt.dvi: haupt.tex teil1.tex teil2.tex
latex haupt.tex


ausgabe.ps: haupt.dvi
dvips -ta4 haupt.dvi -oausgabe.ps
----schnappp-----------------


rufen wir unser make jetzt mit:

make all

oder ohne parameter auf so will make das ausgabe.ps erzeugen. existiert
das dafuer notwendige haupt.dvi noch nicht oder ist nicht up-to-date so
wird auch der latex befehl aufgerufen.

manchmal will man alle files die aus anderen erzeugt werden koennen wieder
loeschen. wir machen uns dazu ein target namens "clean":

clean:
rm haupt.dvi ausgabe.ps

wenn wir jezt

make clean

aufrufen. wird der rm befehl ausgefuehrt.

GNU make kennt auch einige implizite targets. d.h. wenn ein file namens
blabla.o irgendwo in der abhaengigkeitsliste auftaucht aber keine regel
existiert wie ein blabla.o file erzeut werden soll, jedoch ein blabla.c
file existiert so ruft make automatisch einen C compiler auf um aus dem
blabla.c ein blabla.o file zu machen. welcher C compiler und mit welchen
optionen er aufgerufen wird, das kann mit variablen gesteuert werden. wir
schreiben z.b ins Makefile:

CC=gcc
CFLAGS="-Wall"

obiges besagt dass der implizit aufgerufene compiler gcc sein soll und mit
den flags "-Wall" augerufen werden soll.

implizite rules die alle files mit bestimmten endungen betreffen kann man
auch selbst erstellen. mehr dazu in der info page zu make.

gibt es probleme beim compilieren von software die man irgendwo
downgeloaded hat hilft es meist das Makefile etwas zu editieren und die
richtigen compiler flags und include-pfade dort einzustellen.

EXERCISES:

* schreibe und teste ein Makefile das ein file blibla.txt mit dem cat
befehl aus bla.txt und bli.txt zusammenfuegt.
cat bla.txt bli.txt > blibla.txt

das cat soll bei einem "make" immer dann ausgefuehrt werden wenn eines
der beiden files neuer ist als das blibla.txt

* ergaenze das Makefile um ein target "all" und "clean" und um ein
"install". das "install" soll das blibla.txt in ein andres verzeichniss
kopieren.

* schau dir Makefiles von echten programmen an.

_______________________________________________
CD ist ein service von SILVER SERVER
der inhalt unterliegt der GFDL
_______________________________________________



[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04505
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06241
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1140
Comments: 0