Ero sivun ”Makefile” versioiden välillä
Siirry navigaatioon
Siirry hakuun
p →Esimerkki: touch |
päivitys |
||
| (8 välissä olevaa versiota 7 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 ja hallita tiedostojen riippuvuuksia. | ||
== Tiedoston rakenne == | == Tiedoston rakenne == | ||
Makefilen | 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 | |||
{{Huomautus|Huomioitavaa: Komentorivi on pakko aloittaa tabulaattorimerkillä (ei välilyönneillä).}} | |||
Esimerkki: hello.c-nimiselle C-kieliselle ohjelmalle voitaisiin luoda seuraavanlainen Makefile: | |||
<syntaxhighlight lang="makefile"> | |||
hello: hello.c | hello: hello.c | ||
gcc hello.c -o hello | gcc hello.c -o hello | ||
</syntaxhighlight> | |||
Jonka jälkeen samassa hakemistossa ajettu komento make kääntäisi ohjelman. | Jonka jälkeen samassa hakemistossa ajettu komento make kääntäisi ohjelman. | ||
== Useampia kohteita == | == Useampia kohteita (Targets) == | ||
Samassa Makefilessä voi olla useampia käännöskohteita, joita voidaan kutsua | 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: | |||
<syntaxhighlight lang="makefile"> | |||
# Linkityskohde | |||
hello: hello.o world.o | |||
gcc hello.o world.o -o hello | |||
make world.o | |||
Tätä ominaisuutta hyödynnetään usein Makefileissä olevilla clean- ja install-kohteilla. | # 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 | |||
</syntaxhighlight> | |||
Nyt koko ohjelman kääntäminen sujuisi komennolla make. Pelkän world.o-tiedoston kääntäminen onnistuisi komennolla: | |||
make world.o. | |||
== Erityiskohteet == | |||
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 | |||
<syntaxhighlight lang="makefile"> | |||
.PHONY: clean install | |||
clean: | |||
rm -f *.o hello | |||
</syntaxhighlight> | |||
Yllä oleva clean-kohde poistaisi käännetyt objektitiedostot (''hello.o'' ja ''world.o'') ja käännetyn ohjelman (hello). Sitä kutsuttaisiin komentoriviltä komennolla: | |||
make clean | make clean | ||
== Muuttujat == | == Muuttujat == | ||
Make tukee erilaisten muuttujien käyttöä Makefileissä, jolloin saadaan | Make tukee erilaisten muuttujien käyttöä Makefileissä, jolloin tiedostosta saadaan helpommin ylläpidettävä ja siirrettävä. | ||
Muuttujat määritellään syntaksilla: | |||
muuttuja = arvo | muuttuja = arvo | ||
== Esimerkki == | Muuttujiin viitataan koodissa syntaksilla $(muuttuja). | ||
Esimerkki Makefilestä, jota käytetään kääntämään kahdesta [[ | |||
Esimerkki muuttujien käytöstä: | |||
<syntaxhighlight lang="Makefile"> | |||
CC = gcc | |||
CFLAGS = -g | |||
hello.o: hello.c | |||
$(CC) $(CFLAGS) -c hello.c -o hello.o | |||
</syntaxhighlight> | |||
Nyt kääntäjän vaihtaminen (muuttamalla CC=...) tai kääntöoptioiden lisääminen (muuttamalla CFLAGS=...) onnistuu helposti yhdestä paikasta. | |||
== Oletussäännöt == | |||
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ä: | |||
<syntaxhighlight lang="Makefile"> | |||
%.o: %.c | |||
$(CC) $(CFLAGS) -c $< -o $@ | |||
</syntaxhighlight> | |||
(missä $< on riippuvuustiedosto ja $@ on kohdetiedosto) | |||
Tämän ansiosta monissa pienissä Makefilen kohdemäärityksissä tarvitsee määrittää vain riippuvuudet, eikä itse komentoja. | |||
=== Esimerkki === | |||
Esimerkki Makefilestä, jota käytetään kääntämään kahdesta [[C++]]-kielisestä lähdekooditiedostosta (''src/main.cpp'' ja ''src/funktiot.cpp''). | |||
Makefile<br> | |||
<syntaxhighlight lang="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 | |||
</syntaxhighlight> | |||
Nyt projektin hakemistossa voidaan ajaa komento make, jolloin make kääntää projektin: | |||
<syntaxhighlight lang="Bash"> | |||
$ 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 | |||
</syntaxhighlight> | |||
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: | |||
<syntaxhighlight lang="Bash"> | |||
$ 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 | |||
</syntaxhighlight> | |||
== Katso myös == | == Katso myös == | ||
*[[Make]] | * [[Make]] | ||
* [[CMake]] | |||
* [[Autotools]] | |||
* [[Jam]] | |||
* [[SCons]] | |||
[[Luokka:Kehitystyökalut]] | |||
[[Luokka: | |||