Ero sivun ”Makefile” versioiden välillä

Siirry navigaatioon Siirry hakuun
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 rakenne on tarkasti määrätty seuraavanlaiseksi:
Makefilen perusrakenne on tarkasti määrätty ja koostuu kohteesta (target), sen riippuvuuksista (prerequisites) ja komennoista (recipes).
kohdetiedosto''':''' lähdetiedosto1 lähdetiedosto2 lähdetiedosto3
  <tabulaattori>kääntämiskomennot


Esimerkiksi hello.c-nimiselle [[C]]-kieliselle ohjelmalle voitaisiin luoda seuraavanlainen Makefile:
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 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:
Samassa Makefilessä voi olla useampia käännöskohteita, joita voidaan kutsua erikseen tai hyödyntää toisesta kohteesta käsin.
# Linkitys
 
hello: hello.o world.o
Jos makelle ei kerrota erikseen, mikä kohde halutaan käsitellä, make käsittelee tiedoston ensimmäisen lohkon (joka on perinteisesti all).
      gcc hello.o world.o -o hello
 
# Pelkkä käännös, ei linkitystä
Esimerkki moduuleista: Jos edellä käyttämäämme hello-ohjelmaan lisätään toinen tiedosto world.c, voitaisiin Makefile tehdä seuraavanlaiseksi:
hello.o: hello.c
 
      gcc -c hello.c -o hello.o  
<syntaxhighlight lang="makefile">
world.o: world.c
# Linkityskohde
      gcc -c world.c -o world.o
hello: hello.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
    gcc hello.o world.o -o hello
  make world.o
 
Tätä ominaisuutta hyödynnetään usein Makefileissä olevilla clean- ja install-kohteilla. Esimerkiksi Makefilen lopussa voisi olla seuraavanlainen clean-kohde:
# Pelkkä käännös (Moduulit)
clean:
hello.o: hello.c
      rm *.o hello
    gcc -c hello.c -o hello.o  
Joka poistaisi käännetyt objektitiedostot (hello.o ja world.o) ja käännetyn ohjelman (hello). Tätä kutsuttaisiin komentoriviltä komennolla
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


Noudettu kohteesta ”https://www.linux.fi/wiki/Makefile