GNU Make er et værktøj, der hjælper med at generere eksekverbare programmer fra kildekoden og også behandle andre ikke-kildefiler fra projektet. Make får logikken i at oprette eksekverbare filer og behandle andre ikke-kildefiler fra en fil kaldet a makefile eller a Makefile.
Hvorfor lave?
-
Make er de-facto-værktøjet til at oprette eksekverbare programmer fra kildekoden i open source-verdenen.
-
Make gør det muligt for slutbrugere at oprette eksekverbare programmer uden at vide tekniske detaljer om, hvordan man bygger dem.
-
Alle detaljer om, hvordan man bygger eksekverbare filer og behandler ikke-kildefiler, er anført i makefilen - så processen bliver gentaget af alle mennesker eller systemer, der prøver at opbygge et projekt.
-
Hvis en codebase er meget stor, er det tidskrævende og problematisk at opbygge en eksekverbar fil fra bunden, når ændringen i kildekoden er meget lille. Make tager sig af det. Det sporer hvilke filer der ændres og løser afhængighed i overensstemmelse hermed for at bygge genopbygge den specifikke del af programmet.
-
Make er programmeringssprog agnostisk. Det er ligeglad med, hvilket programmeringssprog eller hvilken dialekt af dem du bruger. Makefile er en tekstfil med shell-kommandoer organiseret strukturelt med afhængighed og anden logik til opbygning af programmet og styring af andre ikke-kildefiler. Da det er en masse shell-kommandoer, kan den køre hvor som helst shell-kommandokørsler. Windows kører ikke linux shell-kommandoer som standard, men du kan gøre det med en specialversion af det til Windows.
-
Under opbygning af eksekverbare programmer oprettes mange mellemfiler, der ikke behøver at være der, når bygningen er færdig. Foretag sletter disse filer automatisk. Det hjælper med at holde miljøet rent og sparer meget værdifuld tid.
Installation af mærke
Make alone er ikke nok til at opbygge programmer. For at oprette programmer fra kilden skal du have installeret kompilatorer og andre værktøjer på dit system. Så vi har brug for den fulde serie af udviklingsværktøjer til vores formål.
For at kompilere kilder på Linux er der en pakke kaldet "build-essential" på Debian-baserede systemer (f.eks.g. Ubuntu, Linux Mint osv.) Og "Udviklingsværktøjer" på Red Hat og CentOS.
Sådan installeres dette på Debian-baserede systemer:
apt-get install build-essential
Sådan installeres dette på CentOS og Red Hat-kørsel:
yum groupinstall "Udviklingsværktøjer"
Kom godt i gang med Makefile
Lad os komme i gang med at skrive en Hej Verden program med programmeringssprog C.
Hovedfunktionen i vores C-program ligger indeni helvedes hoved.c. Indholdet af filen skal se sådan ud:
#omfatteint main () my_fun (); returnere 0;
Denne kode inkluderer headerfilen hellofun.h, der indeholder erklæringen om en funktion kaldet hello_fun (). Indholdet af hellofun.h er:
ugyldig min_funktion ();
Definitionen af my_fun () lever inde i hellofun.c:
#omfatte#omfatte ugyldig my_fun () printf ("Hello World!\ n "); returner;
Dette er et meget simpelt program, og vi kunne kompilere det med gcc med kun en kommandolinje. Men virkelige livsprogrammer er ikke så enkle og så små som dette. Ting bliver komplekse virkelig snart. Nedenfor skal jeg skrive det nødvendige makefile-script til kompilering af dette hej verdensprogram. Jeg vil forklare forskellige dele af det i de efterfølgende afsnit.
hellomain: hellomain.c hellofun.c gcc -o hej helvede.c helvede.c-jeg.
Gem denne kode i en fil kaldet makefile (uden filtypenavn). Sæt filen i det bibliotek, hvor C-filerne er. Peg din kommandolinje i denne mappe. Skriv make på kommandolinjen og tryk på enter. En eksekverbar fil kaldet hej genereres i den aktuelle mappe. Du kan bekræfte resultatet ved at køre den eksekverbare med følgende kommando.
./Hej
Udgange:
Hej Verden!
Regler, mål og afhængigheder
Et makefile-script er en samling af regler. Reglerne instruerer Make, hvordan man bygger et mål eller output fra kilde eller andre filer. Reglen specificerer også afhængigheder af målet. Afhængighedsreglerne skal udføres først afhængigt af om det allerede er behandlet ved at se på tidsstemplerne. I vores eksempel makefile ovenfor har vi en regel med navnet navngivet helvedes hoved og dens afhængigheder. Målnavnet er adskilt af et kolon fra afhængighedslisten. De shell-kommandoer, der udføres, vises i den følgende linje. Skalkommandoer skal starte med et tabulatortegn.
Hvis du ikke angiver nogen parameter med kommandoen make, udføres det første mål. I vores eksempel specificerede vi ikke nogen parameter, og vi havde helvedes hoved som det første og eneste mål.
Variabler
Variable er en fantastisk måde at skrive værdi en gang på og bruge dem adskillige gange uden at gentage værdien igen og igen. Det hjælper os med at holde vores kode TØR (gentag ikke dig selv). Hvis du nogensinde har brug for at ændre en værdi overalt i scriptet, skal du bare ændre det ét sted for at afspejle ændringen overalt, hvis du bruger variabel.
I vores eksempel brugte vi gcc som kompilatoren, men vi skal muligvis ændre compileren til noget andet. Så vi kan holde kompilatorens navn i en variabel. Vi kan også holde kompilatorflagene i en anden variabel for at genbruge det. For at indstille en værdi til en variabel bruger vi lige tegn (=) og for at læse den variabel bruger vi $ (variabel_navn).
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o hej helvede.c helvede.c $ (CFLAGS)
Rengøring af miljøet
Vi har ofte brug for at rense vores miljø. Hvis vi ønsker, at hvert stykke af vores projekt skal genopbygges fra bunden, er vi nødt til at rense det. I vores enkle eksempel er den eneste fil, der genereres, den Hej eksekverbar. Uden at slette det manuelt kan vi slette det med mærke. Så vi kan oprette en regel for det og navngive målet som ren.
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o hej helvede.c helvede.c $ (CFLAGS) ren: rm hej
Shell-kommandoen i det rene mål er bare den ældgamle shell-kommando rm. Udfør nu fra kommandolinjen:
gøre rent
Se på den aktuelle mappe for at se, at Hej eksekverbar fil er væk.
Udvidelse af vores eksempel for at løse flere problemer
I vores enkle eksempler på Hello World Compilation har vi et problem, som vi endnu ikke har løst. helvedes hoved målet ser på hellomian.c og helvede.c filernes tidsstempler, næste gang du prøver at kompilere det igen lave eller lav helvede. Så hvis du ændrer nogen af disse to filer, kompileres de igen. Men hvis du ændrer dig hellofun.h så kompileres det ikke igen. Det er uventet!
Igen har vi sprunget over et mellemniveau. Vi genererede ikke objektfilerne og genererede direkte den eksekverbare. Men bag scenen oprettes objektfilerne i en midlertidig mappe og slettes. Vi vil generere objektfiler, før vi bygger den eksekverbare fil. Denne gang navngiver vi hovedmålet som alle
alle: helvede.o helvede.o gcc helvede.o helvede.o -o hej helvede.o: helvede.c hellofun.h gcc -I. -c helvede.c hellofun.o: hellofun.c hellofun.h gcc -I. -c hellofun.c ren: rm -rf *.o rm hej
Kør make-kommandoen igen for at se, om dit program bygger med succes eller ej. Kør hej eksekverbar for at bekræfte resultatet. Se på den aktuelle mappe, og du vil se, at der oprettes objektsfiler. Vi har tilføjet endnu en linje til det rene mål for at rydde op på objektfiler. Dette makefile-script hjælper med at kompilere Hello World-programmet, selvom hellofun.h filen er ændret.
Konklusion
Make er et af de mest vigtige værktøjer til linux-brugere og programmører. Hvis du er en slutbruger, vil viden om mærke hjælpe dig med at løse mange ødelagte ting i din verden af linux. Hvis du er programmør, kan du bare ikke gå væk ved at skrive koden og lade dine brugere finde ud af, hvordan de kompilerer kildekoden til eksekverbare filer. Du skal oprette et makefile-script til slutbrugerne, så de ikke spiller noget gættespil for at kompilere din kilde til eksekverbare filer.
Referencer
GNUMake-projektets hjemmeside
GNU Lav dokumentation