Ero sivun ”Makefile” versioiden välillä
(alkua) |
(→Esimerkki: pitäis olla näin) |
||
(8 välissä olevaa versiota 5 käyttäjän tekeminä ei näytetä) | |||
Rivi 1: | Rivi 1: | ||
Makefile on tiedosto, jonka perusteella [[make]] kääntää ohjelman | Makefile on tiedosto, jonka perusteella [[make]] [[kääntäminen|kääntää]] ohjelman [[lähdekoodi]]n. Makefilet ovat käteviä etenkin ohjelmoijille, jotka voivat niiden avulla automatisoida ohjelman käännösprosessin. | ||
== Tiedoston rakenne == | == Tiedoston rakenne == | ||
Rivi 42: | Rivi 42: | ||
$(CC) -c hello.c -o hello.o | $(CC) -c hello.c -o hello.o | ||
Nyt kääntäjän vaihtaminen toiseksi onnistuu pelkkää muuttujaa muuttamalla, mistä on hyötyä Makefilen kasvaessa suuremmaksi. Vastaavalla tavalla muuttujina käytetään usein esimerkiksi käännösoptioita, jolloin kaikkiin tiedostoihin saadaan haluttaessa joko debug-käännösoptiot (-g, -O0) tai julkaisua varten tehokkaat optimoinnit (-O3). | Nyt kääntäjän vaihtaminen toiseksi onnistuu pelkkää muuttujaa muuttamalla, mistä on hyötyä Makefilen kasvaessa suuremmaksi. Vastaavalla tavalla muuttujina käytetään usein esimerkiksi käännösoptioita, jolloin kaikkiin tiedostoihin saadaan haluttaessa joko debug-käännösoptiot (-g, -O0) tai julkaisua varten tehokkaat optimoinnit (-O3). | ||
== Esimerkki == | |||
Esimerkki Makefilestä, jota käytetään kääntämään kahdesta [[C plus plus | C++]]-kielisestä lähdekooditiedostosta (<tt>src/main.cpp</tt> ja <tt>src/funktiot.cpp</tt>). | |||
#Objektitiedostot | |||
PROJEKTI = src/main.o src/funktiot.o | |||
#Käännösasetukset | |||
LDFLAGS = -lm | |||
CXXFLAGS = -g | |||
#Oletuksena suoritetaan osio "softa" | |||
all: softa | |||
#Tiedot, mistä lähdekooditiedostoista objektitiedostot käännetään | |||
src/main.o: src/main.cpp | |||
src/funktiot.o: src/funktiot.cpp | |||
#Kääntö | |||
softa: | |||
g++ $(PROJEKTI) $(CXXFLAGS) $(LDFLAGS) -o ohjelma | |||
#Clean, joka poistaa tarpeettomat objektitiedostot | |||
clean: | |||
rm -f $(PROJEKTI) | |||
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 -o ohjelma | |||
Huomaa, että jos nyt muokkaamme tiedostoa src/main.cpp ja ajamme maken uudelleen, tiedostoa src/funktiot.cpp ei käännetä uudestaan: | |||
$[[touch]] src/main.cpp | |||
$make | |||
g++ -g -c -o src/main.o src/main.cpp | |||
g++ src/main.o src/funktiot.o -g -o ohjelma | |||
== Katso myös == | == Katso myös == | ||
*[[Make]] | *[[Make]] | ||
*[[Cmake]] | |||
*[[autotools]] | |||
==Aiheesta muualla== | |||
*[http://www.flug.fi/ohjeita/linux-ohjelmointi.html#Makefile FLUG:in Linux-ohjelmointi]-opas. | |||
[[Luokka: | [[Luokka:Kehitystyökalut]] |
Nykyinen versio 14. helmikuuta 2011 kello 22.39
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.
Tiedoston rakenne[muokkaa]
Makefilen rakenne on tarkasti määrätty seuraavanlaiseksi:
kohdetiedosto: lähdetiedosto1 lähdetiedosto2 lähdetiedosto3 <tabulaattori>kääntämiskomennot
Esimerkiksi 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[muokkaa]
Samassa Makefilessä voi olla useampia käännöskohteita, joita voidaan kutsua joko pelkästään tai niitä voidaan hyödyntää toisesta kohteesta käsin. Esimerkiksi jos edellä käyttämäämme hello-ohjelmaan lisätään toinen tiedosto world.c, voitaisiin Makefilestä tehdä seuraavanlainen:
# Linkitys hello: hello.o world.o gcc hello.o world.o -o hello # Pelkkä käännös, ei linkitystä hello.o: hello.c gcc -c hello.c -o hello.o world.o: world.c gcc -c world.c -o world.o
Jolloin koko ohjelman kääntäminen sujuisi komennolla make. Jos makelle ei kerrota erikseen, mikä kohde halutaan käsitellä, make käsittelee ensimmäisen lohkon. Toisaalta pelkän world.c-tiedoston kääntäminen onnistuisi komennolla
make world.o
Tätä ominaisuutta hyödynnetään usein Makefileissä olevilla clean- ja install-kohteilla. Esimerkiksi Makefilen lopussa voisi olla seuraavanlainen clean-kohde:
clean: rm *.o hello
Joka poistaisi käännetyt objektitiedostot (hello.o ja world.o) ja käännetyn ohjelman (hello). Tätä kutsuttaisiin komentoriviltä komennolla
make clean
Muuttujat[muokkaa]
Make tukee erilaisten muuttujien käyttöä Makefileissä, jolloin saadaan tiedostosta helpommin ylläpidettävä ja siirrettävä kun komentoja ja niiden parametreja ei tarvitse "kovakoodata".
Muuttujat määritellään yksinkertaisesti syntaksilla
muuttuja = arvo
Esimerkiksi C-kääntäjä on yleensä CC-nimisessä muuttujassa:
CC = gcc
Muuttujiin voi viitata koodissa syntaksilla $(muuttuja), esimerkiksi hello.c-tiedoston kääntävä osa edellisestä Makefilestä muuttuisi seuraavanlaiseksi
CC = gcc hello.o: hello.c $(CC) -c hello.c -o hello.o
Nyt kääntäjän vaihtaminen toiseksi onnistuu pelkkää muuttujaa muuttamalla, mistä on hyötyä Makefilen kasvaessa suuremmaksi. Vastaavalla tavalla muuttujina käytetään usein esimerkiksi käännösoptioita, jolloin kaikkiin tiedostoihin saadaan haluttaessa joko debug-käännösoptiot (-g, -O0) tai julkaisua varten tehokkaat optimoinnit (-O3).
Esimerkki[muokkaa]
Esimerkki Makefilestä, jota käytetään kääntämään kahdesta C++-kielisestä lähdekooditiedostosta (src/main.cpp ja src/funktiot.cpp).
#Objektitiedostot PROJEKTI = src/main.o src/funktiot.o #Käännösasetukset LDFLAGS = -lm CXXFLAGS = -g #Oletuksena suoritetaan osio "softa" all: softa #Tiedot, mistä lähdekooditiedostoista objektitiedostot käännetään src/main.o: src/main.cpp src/funktiot.o: src/funktiot.cpp #Kääntö softa: g++ $(PROJEKTI) $(CXXFLAGS) $(LDFLAGS) -o ohjelma #Clean, joka poistaa tarpeettomat objektitiedostot clean: rm -f $(PROJEKTI)
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 -o ohjelma
Huomaa, että jos nyt muokkaamme tiedostoa src/main.cpp ja ajamme maken uudelleen, tiedostoa src/funktiot.cpp ei käännetä uudestaan:
$touch src/main.cpp $make g++ -g -c -o src/main.o src/main.cpp g++ src/main.o src/funktiot.o -g -o ohjelma