Ero sivun ”Makefile” versioiden välillä
Siirry navigaatioon
Siirry hakuun
päivitys |
päivitys |
||
| Rivi 56: | Rivi 56: | ||
== 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 | ||
Muuttujiin viitataan koodissa syntaksilla $(muuttuja). | |||
Muuttujiin | |||
Esimerkki muuttujien käytöstä: | |||
<syntaxhighlight lang="Makefile"> | |||
CC = gcc | |||
Nyt kääntäjän vaihtaminen | 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> | |||
== Esimerkki == | == Esimerkki == | ||