Makefile on aputiedosto, jolla voidaan helpottaa esim. C-ohjelmien kääntämistä. Isompia, monesta tiedostosta koostuvia ohjelmia kirjoitettaessa se on käytännössä lähes välttämätön, koska kääntämiseen tarvittavien komentojen määrä kasvaa ja niiden kirjoittaminen komentoriville käy hankalaksi. Makefilen käyttöön liittyy:
esimohjelma: osa1.o osa2.o gcc osa1.o osa2.o -o esimohjelma osa1.o: osa1.c header.h gcc -Wall -ansi -pedantic -c osa1.c osa2.o: osa2.c header.h gcc -Wall -ansi -pedantic -c osa2.c |
Makefilessa on kohteita (targets), riippuvuuksia (dependencies) ja sääntöjä (rules). Perusajatus on, että make muodostaa riippuvuustiedostoista kohdetiedoston käyttäen sille määriteltyjä sääntöjä.
Järjestyksessä ensimmäinen kohde (tässä esimohjelma) on ns. default-kohde, josta ohjelman rakentaminen aloitetaan suoritettaessa komento make ilman argumentteja. Kohteen rakentaminen tapahtuu seuraavasti:
|
# # Tämä kääntää kuvitteellisen ohjelman nimeltä esim2, # jossa käytetään curses- ja matematiikkakirjastoja. # Kaikki #-merkillä alkavat rivit ovat kommentteja. # CC = gcc CFLAGS = -Wall -ansi -pedantic LDFLAGS = -lm -lcurses OBJS = main.o math.o user.o EXE = esim2 RM = /bin/rm -f $(EXE): $(OBJS) $(CC) $(OBJS) $(LDFLAGS) -o $(EXE) main.o: main.c defs.h math.h user.h $(CC) $(CFLAGS) -c main.c math.o: math.c defs.h $(CC) $(CFLAGS) -c math.c user.o: user.c defs.h $(CC) $(CFLAGS) -c user.c clean: $(RM) $(OBJS) |
Tässä ohjelma koostuu kolmesta lähdetiedostosta (main.c, math.c ja user.c) ja kolmesta header-tiedostosta (defs.h, math.h ja user.h).
Makefilessa on edelleen kohteita, riippuvuuksia ja sääntöjä, sekä uutena asiana makroja. Makroina onkin tässä määritelty esimerkin vuoksi lähes kaikki mahdollinen.
Makro määritellään merkinnällä NIMI=sisältö, ja sen jälkeen kaikki $(NIMI)-viittaukset korvautuvat makron sisällöllä. Esim. ensimmäisen kohteen säännössä makrot korvataan makea ajettaessa näin:
esim2: main.o math.o user.o gcc main.o math.o user.o -lm -lcurses -o esim2Makromäärittelyistä on se hyöty, että makefilen muuttaminen tulee helpommaksi. Jos halutaan vaikkapa kääntää kaikki tiedostot debug-optiolla -g, se voidaan yksinkertaisesti lisätä CFLAGS-makron määrittelyyn sen sijaan, että jokaista sääntöä pitäisi muuttaa erikseen. Myös ohjelman siirtäminen toiseen ympäristöön (eri nimiselle kääntäjälle jne.) helpottuu.
CC, CFLAGS ja LDFLAGS ovat standardinimiä, joiden käyttämiseen on omat syynsä. -lm ja -lcurses ovat linkkerin optioita, joilla saadaan käyttöön matematiikka- ja curses-kirjastojen funktiot. Jos ohjelmassa ei käytetä <math.h>:n tai <curses.h>:n funktioita, ei -l-optioitakaan tarvita käännettäessä.
Tässä makefilessa on myös yksi kohde, johon ei liity mitään tiedostoa: clean. Muu kuin default-kohde voidaan rakentaa antamalla kohteen nimi komentoriviargumenttina makelle, tässä siis make clean.
Kohteella clean ei ole riippuvuuksia, joten se ei aiheuta minkään muiden sääntöjen suorittamista. Sen omat säännöt sen sijaan suoritetaan aina, koska tiedostoa nimeltä clean ei ole olemassa. Käytännössä siis käsky make clean tuhoaa käännöksessä syntyneet objektitiedostot, jolloin seuraava make ilman argumentteja aloittaa 'puhtaalta pöydältä' ja kääntää kaikki lähdetiedostot uudestaan.
http://geosoft.no/javamake.html
http://www.eng.hawaii.edu/Tutor/Make/index.html
http://vertigo.hsrl.rutgers.edu/ug/make_help.html