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 tiedostosta helpommin ylläpidettävä ja siirrettävä kun komentoja ja niiden parametreja ei tarvitse "kovakoodata".
Make tukee erilaisten muuttujien käyttöä Makefileissä, jolloin tiedostosta saadaan helpommin ylläpidettävä ja siirrettävä.
 
Muuttujat määritellään syntaksilla:


Muuttujat määritellään yksinkertaisesti syntaksilla
  muuttuja = arvo
  muuttuja = arvo
Esimerkiksi C-kääntäjä on yleensä CC-nimisessä muuttujassa:
 
CC = gcc
Muuttujiin viitataan koodissa syntaksilla $(muuttuja).
Muuttujiin voi viitata koodissa syntaksilla $(muuttuja), esimerkiksi hello.c-tiedoston kääntävä osa edellisestä Makefilestä muuttuisi seuraavanlaiseksi
 
CC = gcc
Esimerkki muuttujien käytöstä:
hello.o: hello.c
<syntaxhighlight lang="Makefile">
      $(CC) -c hello.c -o hello.o
CC = gcc
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).
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 ==
Noudettu kohteesta ”https://www.linux.fi/wiki/Makefile