GNU Make är ett verktyg som hjälper till att generera körbara program från källkoden och även bearbeta andra icke-källfiler från projektet. Make får logiken att bygga körbara filer och bearbeta andra icke-källfiler från en fil som kallas a makefile eller a Makefile.
Varför göra?
-
Make är det de facto-verktyget för att bygga körbara program från källkoden i världen med öppen källkod.
-
Make gör det möjligt för slutanvändare att bygga körbara program utan att veta tekniska detaljer om hur man bygger dem.
-
Alla detaljer om hur man bygger körbara filer och bearbetar icke-källfiler listas i makefilen - så processen blir repeterbar av alla människor eller system som försöker bygga ett projekt.
-
Om en kodbas är mycket stor är det tidskrävande och problematiskt att bygga en körbar från grunden när förändringen i källkoden är mycket liten. Make tar hand om det. Det spårar vilka filer som ändras och löser beroende beroende för att bygga om den specifika delen av programmet.
-
Make är programmeringsspråk agnostiskt. Det bryr sig inte vilket programmeringsspråk eller vilken dialekt av dem du använder. Makefile är en textfil med skalkommandon organiserade strukturellt med beroende och annan logik för att bygga programmet och hantera andra icke-källfiler. Eftersom det är en massa skalkommandon kan den köras var som helst shell-kommandokörningar. Windows kör inte linux-skalkommandon som standard, men du kan göra det med specialversion av det för Windows.
-
Under byggbara körbara program skapas många mellanfiler som inte behöver finnas där när byggnaden är klar. Gör raderar dessa filer automatiskt. Det hjälper till att hålla miljön ren och sparar mycket värdefull tid.
Installerar Make
Att göra ensam räcker inte för att bygga program. För att bygga program från källan måste du ha kompilatorer och andra verktyg installerade på ditt system. Så vi behöver hela uppsättningen utvecklingsverktyg för vårt syfte.
För att sammanställa källor på Linux finns det ett paket som kallas ”build-essential” på Debian-baserade system (t.ex.g. Ubuntu, Linux Mint, etc) och "Utvecklingsverktyg" på Red Hat och CentOS.
För att installera detta på Debian-baserade system:
apt-get install build-essential
För att installera detta på CentOS och Red Hat-körning:
yum gruppinstallera "Utvecklingsverktyg"
Komma igång med Makefile
Låt oss komma igång genom att skriva a Hej världen program med C-programmeringsspråk.
Huvudfunktionen för vårt C-program kommer att ligga inom helvete.c. Innehållet i filen ska se ut så här:
#omfattaint main () my_fun (); returnera 0;
Den här koden innehåller rubrikfilen hellofun.h som innehåller deklarationen för en funktion som heter hello_fun (). Innehållet i hellofun.h är:
ogiltig my_fun ();
Definitionen av my_fun () bor i hellofun.c:
#omfatta#omfatta ogiltig my_fun () printf ("Hello World!\ n "); return;
Detta är ett mycket enkelt program och vi kan kompilera det med gcc med bara en kommandorad. Men verkliga program är inte så enkla och så små som detta. Saker blir komplexa snart. Nedan ska jag skriva det nödvändiga makefile-skriptet för att sammanställa detta hejvärldsprogram. Jag kommer att förklara olika delar av det i efterföljande avsnitt.
hellomain: hellomain.c hellofun.c gcc -o hej helvete.c helvete.c -I.
Förvara den här koden i en fil som heter makefile (utan något filtillägg). Lägg filen i katalogen där C-filerna finns. Rikta din kommandorad i den här katalogen. Skriv make på kommandoraden och tryck på enter. En körbar fil som heter Hello skapas i den aktuella katalogen. Du kan verifiera resultatet genom att köra den körbara med följande kommando.
./Hej
Utgångar:
Hej världen!
Regler, mål och beroende
Ett makefile-skript är en samling regler. Reglerna instruerar Make hur man bygger ett mål eller en output från källan eller andra filer. Regeln anger också beroenden för målet. Beroendets regler måste utföras först beroende på om det redan har bearbetats genom att titta på tidsstämplarna. I vårt exempel makefile ovan har vi en regel med mål som heter helvete och dess beroende. Målnamnet separeras av ett kolon från beroendelistan. Skalkommandon som kommer att köras listas i följande rad. Skalkommandona måste börja med ett tabbtecken.
Om du inte anger någon parameter med kommandot make körs det första målet. I vårt exempel specificerade vi ingen parameter och det hade vi helvete som det första och enda målet.
Variabler
Variabla är bra sätt att skriva värde en gång och använda dem flera gånger utan att upprepa värdet om och om igen. Det hjälper oss att hålla vår kod TORR (upprepa inte dig själv). Om du någonsin behöver ändra något värde över hela skriptet, behöver du bara ändra det på ett ställe för att återspegla förändringen överallt om du använder variabel.
I vårt exempel använde vi gcc som kompilatorn, men vi kan behöva ändra kompilatorn till något annat. Så vi kan behålla kompilatorns namn i en variabel. Vi kan också hålla kompilatorflaggorna i en annan variabel för att återanvända det. För att ställa in ett värde på en variabel använder vi lika tecken (=) och för att läsa den variabeln använder vi $ (variabel_namn).
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o hej helvete.c helvete.c $ (CFLAGS)
Rengöring av miljön
Vi kan ofta behöva rengöra vår miljö. Om vi vill att varje del av vårt projekt ska byggas om från grunden måste vi rengöra det. I vårt enkla exempel är den enda filen som genereras Hej körbar. Utan att radera det manuellt kan vi ta bort det med make. Så vi kan skapa en regel för det och namnge målet som rena.
CC = gcc CFLAGS = -I. hellomain: hellomain.c hellofun.c $ (CC) -o hej helvete.c helvete.c $ (CFLAGS) ren: rm hej
Skalkommandot i det rena målet är bara det gamla skalkommandot rm. Kör nu från kommandoraden:
gör rent
Titta på den aktuella katalogen för att se att Hej körbar fil är borta.
Utöka vårt exempel för att lösa fler problem
I vårt enkla sammanställningsexempel med hejvärld har vi ett problem som vi inte har löst än. helvete målet ser på hellomian.c och hellofun.c filernas tidsstämplar nästa gång du försöker kompilera den igen göra eller gör helvete. Så om du ändrar någon av dessa två filer kommer de att kompileras om. Men om du ändrar dig hellofun.h då kommer det inte att kompileras om. Det är oväntat!
Återigen har vi hoppat över en mellannivå. Vi genererade inte objektfilerna och genererade direkt den körbara filen. Men bakom scenen skapas objektfilerna i en tillfällig katalog och tas bort. Vi vill generera objektfilerna innan vi bygger den körbara filen. Den här gången heter vi huvudmålet som Allt
alla: helvete.o helvete.o gcc helvete.o helvete.o-o hej 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 hej
Kör kommandot make igen för att se om ditt program bygger framgångsrikt eller inte. Kör hej körbar för att verifiera resultatet. Titta på den aktuella katalogen så ser du att objektfiler skapas. Vi har lagt till en rad till det rena målet för att rensa objektfiler. Detta makefile-skript hjälper till att kompilera om Hello-världsprogrammet även om hellofun.h filen ändras.
Slutsats
Make är ett av de viktigaste verktygen för Linux-användare och programmerare. Om du är slutanvändare kan kunskap om märke hjälpa dig att fixa många trasiga saker i din Linux-värld. Om du är programmerare kan du bara inte gå bort genom att skriva koden och låta dina användare ta reda på hur man sammanställer källkoden till körbara filer. Du måste skapa ett makefilskript för slutanvändarna så att de inte spelar något gissningsspel för att kompilera din källa till körbara filer.
Referenser
GNUMake-projektets hemsida
GNU Gör dokumentation