Makefile
Makefile on tiedosto, jonka perusteella make kääntää ohjelman lähdekoodin. Makefilet ovat käteviä etenkin ohjelmoijille, jotka voivat niiden avulla automatisoida ohjelman käännösprosessin ja hallita tiedostojen riippuvuuksia.
Tiedoston rakenne
[muokkaa]Makefilen perusrakenne on tarkasti määrätty ja koostuu kohteesta (target), sen riippuvuuksista (prerequisites) ja komennoista (recipes).
Makefile
kohdetiedosto: lähdetiedosto1 lähdetiedosto2 lähdetiedosto3 <tabulaattori>kääntämiskomennot
Esimerkki: hello.c-nimiselle C-kieliselle ohjelmalle voitaisiin luoda seuraavanlainen Makefile:
hello: hello.c
gcc hello.c -o hello
Jonka jälkeen samassa hakemistossa ajettu komento make kääntäisi ohjelman.
Useampia kohteita (Targets)
[muokkaa]Samassa Makefilessä voi olla useampia käännöskohteita, joita voidaan kutsua erikseen tai hyödyntää toisesta kohteesta käsin.
Jos makelle ei kerrota erikseen, mikä kohde halutaan käsitellä, make käsittelee tiedoston ensimmäisen lohkon (joka on perinteisesti all).
Esimerkki moduuleista: Jos edellä käyttämäämme hello-ohjelmaan lisätään toinen tiedosto world.c, voitaisiin Makefile tehdä seuraavanlaiseksi:
# Linkityskohde
hello: hello.o world.o
gcc hello.o world.o -o hello
# Pelkkä käännös (Moduulit)
hello.o: hello.c
gcc -c hello.c -o hello.o
world.o: world.c
gcc -c world.c -o world.o
Nyt koko ohjelman kääntäminen sujuisi komennolla make. Pelkän world.o-tiedoston kääntäminen onnistuisi komennolla:
make world.o.
Erityiskohteet
[muokkaa]Tätä ominaisuutta hyödynnetään usein Makefileissä olevilla clean- ja install-kohteilla, joita kutsutaan pseudokohteiksi (phony targets), sillä ne eivät luo oikeita tiedostoja.
Makefile
.PHONY: clean install
clean:
rm -f *.o hello
Yllä oleva clean-kohde poistaisi käännetyt objektitiedostot (hello.o ja world.o) ja käännetyn ohjelman (hello). Sitä kutsuttaisiin komentoriviltä komennolla:
make clean
Muuttujat
[muokkaa]Make tukee erilaisten muuttujien käyttöä Makefileissä, jolloin tiedostosta saadaan helpommin ylläpidettävä ja siirrettävä.
Muuttujat määritellään syntaksilla:
muuttuja = arvo
Muuttujiin viitataan koodissa syntaksilla $(muuttuja).
Esimerkki muuttujien käytöstä:
CC = gcc
CFLAGS = -g
hello.o: hello.c
$(CC) $(CFLAGS) -c hello.c -o hello.o
Nyt kääntäjän vaihtaminen (muuttamalla CC=...) tai kääntöoptioiden lisääminen (muuttamalla CFLAGS=...) onnistuu helposti yhdestä paikasta.
Oletussäännöt
[muokkaa]Make-työkalussa on sisäänrakennettuja oletussääntöjä yleisimpiin käännöstehtäviin, kuten C-koodin kääntämiseen.
Kun esimerkiksi hello.o-tiedosto riippuu hello.c-tiedostosta, Make tietää automaattisesti, että se tarvitsee C-kääntäjän. Jos käytetään yllä määriteltyjä muuttujia, Make käyttää oletussääntöä, joka on käytännössä:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
(missä $< on riippuvuustiedosto ja $@ on kohdetiedosto)
Tämän ansiosta monissa pienissä Makefilen kohdemäärityksissä tarvitsee määrittää vain riippuvuudet, eikä itse komentoja.
Esimerkki
[muokkaa]Esimerkki Makefilestä, jota käytetään kääntämään kahdesta C++-kielisestä lähdekooditiedostosta (src/main.cpp ja src/funktiot.cpp).
Makefile
# Objektitiedostot
PROJEKTI = src/main.o src/funktiot.o
# Käännösasetukset
LDFLAGS = -lm
CXXFLAGS = -g
# Oletuksena suoritetaan osio "softa"
all: softa
# Objektitiedostot käännetään C++-oletussäännöillä,
# mutta riippuvuus määritellään Makefilessa.
src/main.o: src/main.cpp
src/funktiot.o: src/funktiot.cpp
# Linkityskohde
softa: $(PROJEKTI)
g++ $(PROJEKTI) $(CXXFLAGS) $(LDFLAGS) -o ohjelma
# Clean, joka poistaa tarpeettomat objektitiedostot
clean:
rm -f $(PROJEKTI) ohjelma
Nyt projektin hakemistossa voidaan ajaa komento make, jolloin make kääntää projektin:
$ make
g++ -g -c -o src/main.o src/main.cpp
g++ -g -c -o src/funktiot.o src/funktiot.cpp
g++ src/main.o src/funktiot.o -g -lm -o ohjelma
Huomaa, että jos nyt muokkaamme tiedostoa src/main.cpp ja ajamme maken uudelleen, tiedostoa src/funktiot.cpp ei käännetä uudestaan, koska sen riippuvuus on jo ajan tasalla. Tämä on riippuvuuksienhallinnan ydin:
$ touch src/main.cpp
$ make
g++ -g -c -o src/main.o src/main.cpp
g++ src/main.o src/funktiot.o -g -lm -o ohjelma