GNU Make er et verktøy som hjelper til med å generere kjørbare programmer fra kildekoden og også behandle andre ikke-kildefiler fra prosjektet. Make får logikken til å bygge kjørbare filer og behandle andre ikke-kildefiler fra en fil som kalles a makefile eller a Makefile.
Hvorfor lage?
-
Make er det de facto verktøyet for å bygge kjørbare programmer fra kildekoden i verden med åpen kildekode.
-
Make gjør det mulig for sluttbrukere å bygge kjørbare programmer uten å vite tekniske detaljer om hvordan de skal bygges.
-
Alle detaljene om hvordan du bygger kjørbare filer og behandler ikke-kildefiler er oppført i makefilen - slik at prosessen blir repeterbar av alle mennesker eller systemer som prøver å bygge et prosjekt.
-
Hvis en kodebase er veldig stor, er det tidkrevende og problematisk å bygge en kjørbar fil fra bunnen av når endringen i kildekoden er veldig liten. Make tar seg av det. Den sporer hvilke filer som endres og løser avhengighet tilsvarende for å bygge gjenoppbygge den spesifikke delen av programmet.
-
Make er programmeringsspråk agnostisk. Det bryr seg ikke hvilket programmeringsspråk eller hvilken dialekt av dem du bruker. Makefile er en tekstfil med skallkommandoer organisert strukturelt med avhengighet og annen logikk for å bygge programmet og administrere andre ikke-kildefiler. Siden det er en haug med skallkommandoer, kan den kjøre hvor som helst shell-kommandokjøring. Windows kjører ikke linux shell-kommandoer som standard, men du kan gjøre det med spesialversjon av det for Windows.
-
Under bygging av kjørbare programmer opprettes mange mellomfiler som ikke trenger å være der når bygningen er ferdig. Gjør sletter disse filene automatisk. Det hjelper med å holde miljøet rent og sparer mye verdifull tid.
Installere Make
Make alone er ikke nok til å bygge programmer. For å bygge programmer fra kilden må du ha kompilatorer og andre verktøy installert på systemet ditt. Så vi trenger hele pakken med utviklingsverktøy for vårt formål.
For å kompilere kilder på Linux er det en pakke som kalles "build-essential" på Debian-baserte systemer (f.eks.g. Ubuntu, Linux Mint, etc) og "Utviklingsverktøy" på Red Hat og CentOS.
Slik installerer du dette på Debian-baserte systemer:
apt-get install build-essential
Slik installerer du dette på CentOS og Red Hat run:
yum groupinstall "Utviklingsverktøy"
Komme i gang med Makefile
La oss komme i gang med å skrive en Hei Verden program med programmeringsspråket C.
Hovedfunksjonen til C-programmet vårt ligger inne helvete.c. Innholdet i filen skal se slik ut:
#inkludereint main () my_fun (); retur 0;
Denne koden inkluderer overskriftsfilen hellofun.h som inneholder erklæringen om en funksjon kalt hello_fun (). Innholdet i hellofun.h er:
ugyldig min_fun ();
Definisjonen av my_fun () lever inne i hellofun.c:
#inkludere#inkludere ugyldig my_fun () printf ("Hello World!\ n "); return;
Dette er et veldig enkelt program, og vi kan kompilere det med gcc med bare en kommandolinje. Men virkelige programmer er ikke så enkle og så små som dette. Ting blir komplekse veldig snart. Nedenfor skal jeg skrive det nødvendige makefile-skriptet for å kompilere dette hei-verdensprogrammet. Jeg vil forklare forskjellige deler av det i påfølgende avsnitt.
hellomain: hellomain.c hellofun.c gcc -o hallo hellomain.c helvete.c -I.
Oppbevar denne koden i en fil som heter makefile (uten filtype). Plasser filen i katalogen der C-filene er. Pek kommandolinjen i denne katalogen. Skriv lage på kommandolinjen og trykk enter. En kjørbar fil kalt hei vil bli generert i gjeldende katalog. Du kan bekrefte resultatet ved å kjøre den kjørbare filen med følgende kommando.
./Hallo
Utganger:
Hei Verden!
Regler, mål og avhengigheter
Et makefile-skript er en samling av regler. Reglene instruerer Lag hvordan du bygger et mål eller output fra kilde eller andre filer. Regelen spesifiserer også avhengigheter av målet. Avhengighetsreglene må utføres først avhengig av om det allerede er behandlet ved å se på tidsstemplene. I vårt eksempel makefile ovenfor har vi en regel med mål navngitt helvete og dens avhengigheter. Målnavnet er atskilt med et kolon fra avhengighetslisten. Skallkommandoene som skal utføres er oppført i følgende linje. Skallkommandoene må starte med et fanetegn.
Hvis du ikke angir noen parameter med kommandoen make, utføres det første målet. I vårt eksempel spesifiserte vi ingen parametere, og vi hadde helvete som det første og eneste målet.
Variabler
Variable er flott måte å skrive verdi en gang på og bruke dem flere ganger uten å gjenta verdien igjen og igjen. Det hjelper oss med å holde koden TØRR (ikke gjenta deg selv). Hvis du noen gang trenger å endre noe over hele skriptet, trenger du bare å endre det på ett sted for å gjenspeile endringen overalt hvis du bruker variabel.
I vårt eksempel brukte vi gcc som kompilatoren, men vi kan trenge å endre kompilatoren til noe annet. Så vi kan beholde kompilatornavnet i en variabel. Vi kan også beholde kompilatorflaggene i en annen variabel for å gjenbruke det. For å sette en verdi til en variabel bruker vi likhetstegn (=) og for å lese den variabelen bruker vi $ (variabelnavn).
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o hallo helvete.c helvete.c $ (CFLAGS)
Rengjøring av miljøet
Vi trenger ofte å rense miljøet. Hvis vi vil at hvert stykke av prosjektet vårt skal bygges opp fra bunnen av, må vi rengjøre det. I vårt enkle eksempel er den eneste filen som genereres Hallo kjørbar. Uten å slette det manuelt, kan vi slette det med merke. Så vi kan opprette en regel for det og kalle målet som ren.
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o hallo helvete.c helvete.c $ (CFLAGS) ren: rm hei
Skallkommandoen i det rene målet er bare den eldgamle skallkommandoen rm. Nå, fra kommandolinjen utfør:
gjør rent
Se på den gjeldende katalogen for å se at Hallo kjørbar fil er borte.
Utvide vårt eksempel for å løse flere problemer
I vårt enkle eksempler på Hello World Compilation har vi et problem som vi ikke har løst ennå. helvete målet ser på hellomian.c og hellofun.c filmernes tidsstempler neste gang du prøver å kompilere den med gjøre eller lage helvete. Så hvis du endrer noen av disse to filene, blir de kompilert på nytt. Men hvis du endrer deg hellofun.h da vil den ikke kompilere på nytt. Det er uventet!
Igjen har vi hoppet over et mellomnivå. Vi genererte ikke objektfilene og genererte direkte den kjørbare filen. Men bak scenen blir objektfilene opprettet i en midlertidig katalog og slettet. Vi vil generere objektfilene før vi bygger den kjørbare filen. Denne gangen kaller vi hovedmålet som alle
alt: helvete.o hellofun.o gcc hellomain.o hellofun.o -o hei helvete.o: helvete.c hellofun.h gcc -I. -c helvete.c hellofun.o: hellofun.c hellofun.h gcc -I. -c hellofun.c ren: rm -rf *.o rm hei
Kjør make-kommandoen igjen for å se om programmet ditt lykkes eller ikke. Kjør hei-kjørbar for å bekrefte resultatet. Se på den nåværende katalogen, og du vil se at objektfiler opprettes. Vi har lagt til en linje til det rene målet for å rydde opp i objektfiler. Dette makefile-skriptet hjelper til med å kompilere Hello World-programmet selv om hellofun.h filen er endret.
Konklusjon
Make er et av de viktigste verktøyene for Linux-brukere og programmerere. Hvis du er sluttbruker, vil kunnskap om merkevare hjelpe deg med å fikse mange ødelagte ting i din Linux-verden. Hvis du er programmerer, kan du bare ikke gå bort ved å skrive koden og la brukerne finne ut hvordan du kan kompilere kildekoden til kjørbare filer. Du må lage et makefile-skript for sluttbrukerne, slik at de ikke spiller noe gjetningsspill for å kompilere kilden din til kjørbare filer.
Referanser
GNUMake-prosjektets hjemmeside
GNU Lag dokumentasjon