Makefile ohje:


Yleistä

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:


Makefilen rakenne

Alla on hyvin yksinkertainen makefile, jolla esimerkkiohjelman kääntäminen onnistuu (antamalla komento make):

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:

  1. Jos kohteella on riippuvuuksia, tarkistetaan ovatko ne myös kohteina makefilessa.
  2. Mikäli ovat, rakennetaan ne ensin, suorittaen jokaiselle vastava prosessi kohdasta 1 alkaen.
  3. Jos kohteen kaikkien riippuvuuksien rakentamisen jälkeen jokin riippuvuustiedosto on uudempi kuin kohdetiedosto, tai jos kohdetiedostoa ei ole olemassa, suoritetaan kohteelle määritellyt säännöt.

 


Monimutkaisempi esimerkki

Edellisessä kohdassa esitettiin siis hyvin yksinkertainen perus-makefile. Yleensä makefilessa käytetään makroja, josta esimerkki alla.

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 esim2

Makromää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.

 


Esimerkkejä java-projektin hallinnasta make:lla ja muita linkkejä

http://geosoft.no/javamake.html

http://www.eng.hawaii.edu/Tutor/Make/index.html

http://vertigo.hsrl.rutgers.edu/ug/make_help.html