Make

Het doel van make

Make is er voor bedoeld om het compileren van een hoop source sneller en gemakelijker te maken. Hiertoe kent het een groot aantal regels om source files om te zetten in bepaalde targets. Daarbij controleerd het of er iets veranderd is aan een of meer van de source files anders is het namelijk niet meer nodig het geheel te herhalen.

De regels voor onze hello

Ons programma hello.c moet om gezet worden in hello.o waarna hij gelinkt kan worden tot hello. Dit doen we in 2 stappen.
hello.o: hello.c /usr/include/stdio.h
	gcc -c hello.c
Hierin vertellen we dat hello.o uit hello.c gemaakt moet worden via het commando gcc -c hello.c. Voor de rest geven we aan dat als hello.o nieuwer is dan hello.c en /usr/include/stdio.h het niet meer hoeft te gebeuren.
hello: hello.o
	gcc -o hello hello.o

Als we dan boven aan het makefile de volgende regel toe voegen:

all: hello
Dan kunnen we gewoon make aanroepen en hello word gecompileerd.

De syntax voor een makefile

Een target

target: dependicies
  ->	commando
  ->	commando
Hierin vertellen we dat make een target moet maken als een van de dependices nieuwer is dan het target. Dat moet hij dan doen door de onderstaande commando's uit te voeren.

De variabbele

NAAM=Waarde
Hiermee ken je een waarde toe aan een variabbele die je later via ${NAAM} weer kunt gebruiken.

De ingebouwde regels

Gelukkig kent make een hoop ingebouwde regels. De hier bovenstaande regels zouden allemaal via de ingebouwde regels gegenereerd zijn. Hierdoor hoef je in een Makefile alleen maar aan te geven uit welke objectfiles en libries het programma gemaakt moet worden en waar de objectfiles van af hangen. Tevens kunnen er via varriabelle lokale compilatie vlaggen gezet worden.

Extra targets

Binnen de makefiles is het ook mogenlijk om extra targets te specificeren om een aantal andere bewerkingen op de source uit te voeren. Vaak zijn er regels om de programatuur te instaleren en om de objectfiles te verwijderen.

De belangrijkste extra targets die vaak voor komen zijn:

all
Maak alles
install
Installeer de programma's
install_man
Installeer de manual pages
clean
Verwijder alle files die ontstaan is tijdens de compilatie
depend
Genereer de dependicies

Een voorbeeld

CFLAGS=-O2
BINDIR=/usr/local/bin
SRCS=hello.c
OBJS=$(SRCS:.c=.o)
CFLAGS=-O2
BINDIR=/usr/local/bin
SRCS=hello.c
PROG=hello
CP=cp
RM=rm -f

${PROG}: ${OBJS}

install: 
	${CP} ${PROG} ${BINDIR}

clean:
	${RM} ${PROG} ${OBJS}
We defineren hier eerst een aantal variabbele. Hierbij maken we nog gebruik van een substitutie mechanisme om de variabbele OBJS de waarde te geven van SRCS met de .c vervangen door .o. Daarna geven we aan dat ons programma afhankelijk is van de object files. Hiermee weet make verder via de ingebouwde regels wel hoe dit gecompileerd moet worden.

Voor de rest defineren we nog regels voor de installatie en het opruimen van de objectfiles.

Ingewikkeld?

We weten dat we in dit geval het geheel kunnen compileren met gcc -o hello hello.c. Dit is in dit geval dus een hopeloos ingewikkelde manier van het opschrijven hoe het programma gecompileerd moet worden. Maar in de praktijk met programma's bestaande uit vele c en header files en eigen libries blijkt make toch makelijk te werken.