Lyhyt johdatus "Makefiles" -sovellukseen avoimen lähdekoodin ohjelmistokehityksessä GNU Maken avulla


GNU Make on kehitysapuohjelma, joka määrittää tietyn koodikannan osat, jotka käännetään uudelleen, ja voi antaa komentoja näiden toimintojen suorittamiseksi koodikannassa. Tätä nimenomaista make-apuohjelmaa voidaan käyttää minkä tahansa ohjelmointikielen kanssa edellyttäen, että niiden käännös voidaan tehdä komentotulkista antamalla komentoja.

Jotta voisimme käyttää GNU Make -ohjelmaa, meillä on oltava joukko sääntöjä, jotka määrittelevät ohjelmamme eri tiedostojen väliset suhteet ja komennot kunkin tiedoston päivittämiseksi. Nämä kirjoitetaan erityiseen tiedostoon nimeltä makefile. make-komento käyttää makefile-tietokantaa ja tiedostojen viimeisiä muokkausaikoja päättääkseen jotka kaikki tiedostot käännetään uudelleen.

Makefile-tiedoston sisältö

Yleensä 'makefiles' sisältää 5 erilaista asiaa, nimittäin: implisiittiset säännöt, eksplisiset säännöt, muuttujamääritykset , ohjeet ja kommentit.

  1. Erityinen sääntö määrittää, kuinka yksi tai useampi tiedosto (kutsutaan kohteiksi, selitetään myöhemmin) tehdään tai tehdään uudelleen ja milloin sama tehdään.
  2. Epäsuora sääntö määrittää, kuinka yksi tai useampi tiedosto luodaan tai tehdään uudelleen niiden nimien perusteella. Se kuvaa, kuinka kohdetiedoston nimi liittyy yhteen tiedostoon, jonka nimi on samanlainen kuin kohde.
  3. Muuttujamäärittely on rivi, joka määrittää merkkijonon arvon muuttujalle, joka korvataan myöhemmin.
  4. Direktiivi on ohje makeille tehdä jotain erityistä samalla kun luet make-tiedostoa.
  5. #-symboli edustaa kommentin alkua make-tiedostoissa . Rivi, joka alkaa kirjaimella #, ohitetaan.

Makefile-tiedostojen rakenne

Tiedot, jotka kertovat make, kuinka järjestelmä käännetään uudelleen, saadaan lukemalla makefile-niminen tietokanta. Yksinkertainen makefile koostuu seuraavan syntaksin säännöistä:

target ... : prerequisites ... 
	recipe 
... 
...

Kohde on määritelty ohjelman luomaksi tulostiedostoksi. Se voi olla myös tehellisiä kohteita, jotka selitetään alla. Esimerkkejä kohdetiedostoista ovat suoritettavat tiedostot, objektitiedostot tai teolliset kohteet, kuten clean, asenna, poista jne.

Edellytys on tiedosto, jota käytetään syötteenä kohdetiedostojen luomiseen.

Resepti on toiminto, jonka make suorittaa kohdetiedoston luomiseksi edellytysten perusteella. Jokaisen makefiles -tiedoston reseptin eteen on lisättävä sarkainmerkki, ellemme määritä .RECIPEPREFIX-muuttujaa jonkin muun merkin määrittämiseksi etuliitteeksi reseptiin.

Malli Makefile

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f main.o end.o inter.o start.o

Yllä olevassa esimerkissä käytimme 4 C-lähdetiedostoa ja kahta otsikkotiedostoa suoritettavan lopullisen-tiedoston luomiseen. Tässä jokainen .o-tiedosto on sekä kohde että edellytys make-tiedoston sisällä. Katso nyt viimeistä kohteen nimeä puhdas. Se on vain toiminto eikä kohdetiedosto.

Koska emme normaalisti tarvitse tätä kääntämisen aikana, sitä ei kirjoiteta edellytykseksi muissa säännöissä. Kohteita, jotka eivät viittaa tiedostoihin vaan ovat vain toimintoja, kutsutaan teollisiksi kohteiksi. Niillä ei ole edellytyksiä kuin muilla kohdetiedostoilla.

Kuinka GNU Make käsittelee Maketiedoston

Oletuksena make alkaa makefile -tiedoston ensimmäisestä kohteesta ja sitä kutsutaan nimellä oletustavoite". Esimerkkimme perusteella meillä on lopullinen ensimmäinen kohde. Koska sen edellytykset sisältävät muita objektitiedostoja, ne on päivitettävä ennen lopullisen luomista. Jokainen näistä edellytyksistä käsitellään omien sääntöjensä mukaisesti.

Uudelleenkääntäminen tapahtuu, jos lähdetiedostoihin tai otsikkotiedostoihin on tehty muutoksia tai jos objektitiedostoa ei ole ollenkaan. Kun tarvittavat objektitiedostot on käännetty uudelleen, make päättää, linkitetäänkö lopullinen vai ei. Tämä on tehtävä, jos tiedostoa lopullinen ei ole olemassa tai jos jokin objektitiedostoista on sitä uudempi.

Jos siis muutamme tiedostoa inter.c, ajettaessa make se kääntää lähdetiedoston uudelleen päivitettäväksi objektitiedosto inter.o ja sitten linkki lopullinen.

Muuttujien käyttäminen Makefilesin sisällä

Esimerkissämme meidän oli lueteltava kaikki objektitiedostot kahdesti lopullisen -säännössä alla olevan kuvan mukaisesti.

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o

Tällaisten päällekkäisyyksien välttämiseksi voimme ottaa käyttöön muuttujia, jotka tallentavat makefile -tiedoston sisältämien objektitiedostojen luettelon. Käyttämällä muuttujaa OBJ voimme kirjoittaa makefile -esimerkin uudelleen samanlaiseksi alla näkyväksi tiedostoksi.

OBJ = main.o end.o inter.o start.o
final: $(OBJ)
	gcc -o final $(OBJ)
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f $(OBJ)

Säännöt lähdehakemiston puhdistamiseen

Kuten näimme esimerkissä makefile, voimme määrittää säännöt puhdistamaan lähdehakemiston poistamalla ei-toivotut objektitiedostot kääntämisen jälkeen. Oletetaan, että meillä on kohdetiedosto nimeltä clean. Miten voidaan saada erottelemaan edellä mainitut kaksi tilannetta? Tässä tulee käsite tehekohteet.

Tehteellinen kohde ei ole varsinaisesti tiedoston nimi, vaan se on vain nimi reseptille, joka suoritetaan aina, kun makefile-tiedostosta<. Yksi tärkeimmistä syistä teollisen kohteen käyttämiseen on välttää ristiriita samannimisen tiedoston kanssa. Toinen syy on parantaa suorituskykyä.

Tämän asian selittämiseksi paljastan yhden odottamattoman käänteen. Clean -reseptiä ei suoriteta oletuksena make-komennolla. Sen sijaan on välttämätöntä kutsua sama antamalla komento make clean.

.PHONY: clean
clean:
	rm -f $(OBJ)

Yritä nyt luoda make-tiedostoja omaa koodipohjaasi varten. Voit vapaasti kommentoida täällä epäilyksiäsi.