Ero sivun ”Makefile” versioiden välillä
→Esimerkki: pitäis olla näin |
päivitys |
||
| Rivi 1: | Rivi 1: | ||
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. | 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 | ||
Versio 15. marraskuuta 2025 kello 01.22
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
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)
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
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
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
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