Göra | |
---|---|
Språkklass | byggautomationsverktyg [d] , UNIX-verktyg [d] ,skriptspråk,programmeringsspråkoch indraget språk [d] |
Framträdde i | april 1976 |
Författare | Stuart Feldman |
Dialekter | BSD-fabrikat, GNU-fabrikat, Microsoft nmake |
påverkas | Ant , Rake , MSBuild och andra |
OS | Unix-liknande |
make ( IPA [ me ɪ k ] ; från engelska - "make", "make") är ett verktyg som automatiserar processen att konvertera filer från en form till en annan. Oftast är detta att kompilera källkod till objektfiler och sedan länka dem till körbara filer eller bibliotek .
Verktyget använder speciella make -filer som anger filernas beroenden av varandra och reglerna för att uppfylla dem. Baserat på informationen om den senaste ändringstiden för varje fil, bestämmer och kör de nödvändiga programmen.
Innan skapandet av make build-systemet (kompilering) bestod Unix -mjukvaran vanligtvis av skalbyggnadsskript som åtföljde källkoden för programmen.
make skapades av Stuart Feldman i april 1976 på Bell Labs .
Det finns för närvarande många verktyg för att spåra beroenden, men make är ett av de mest använda, främst på grund av att det ingår i Unix , med början i PWB/UNIX-versionen (Eng. Programmer's Workbench ), som innehöll verktyg för att utveckla mjukvarusäkerhet .
Det finns flera versioner av make , baserat på originalmärket eller skrivet från början, med samma filformat och grundläggande principer och algoritmer, samt vissa förbättringar och tillägg. Till exempel:
POSIX inkluderar en standard för de grundläggande funktionerna i märket , implementerad med varierande grad av kompatibilitet i olika versioner av märket . Generellt sett kan enkla makefiler framgångsrikt bearbetas av olika versioner av make .
Filen söks i den aktuella katalogen. Om -f-växeln inte är specificerad, används standardmakefilens namn, Makefile , (dock kan olika implementeringar av make kontrollera andra filer utöver detta, såsom GNUmakefile ).
make öppnar makefilen, läser reglerna och kör de kommandon som behövs för att bygga det angivna målet .
Standardmål för att bygga GNU- distributioner :
Som standard använder make det allra första målet i makefilen.
Byggprocessen för BSD-applikationer använder ofta:
Make - programmet kör kommandon enligt reglerna som anges i en speciell fil. Denna fil kallas en makefile. Vanligtvis beskriver en makefil hur man kompilerar och länkar ett program.
makefilen består av regler och variabler. Regler har följande syntax:
mål1 mål2 ... : prop1 prop2 ... lag1 lag2 ...Regeln är en uppsättning kommandon, vars exekvering kommer att leda till sammansättning av målfiler från attributfiler .
Regeln talar om för make att filerna som skapas av kommandona ( targets ) är beroende av motsvarande prop-filer. make kontrollerar eller använder inte innehållet i prop-filerna på något sätt, men att specificera listan med prop-filer krävs bara för make för att säkerställa att filerna finns innan den börjar köra kommandon och för att hålla reda på filberoenden.
Vanligtvis är målet namnet på filen som genereras som ett resultat av de angivna kommandona. Målet kan också vara namnet på någon åtgärd som kommer att utföras som ett resultat av att köra kommandon (till exempel tar det rena målet i makefiler för kompilering av program vanligtvis bort alla filer som skapats under kompileringsprocessen ).
Kommandorader måste börja med ett tabbtecken .
Tänk på ett enkelt C-program. Låt programprogrammet bestå av ett par kodfiler - main.c och lib.c, samt en huvudfil - defines.h , som ingår i båda kodfilerna . Därför, för att skapa ett program, är det nödvändigt att skapa objektfiler main.o och lib.o från par (main.c defines.h) och (lib.c defines.h), och sedan länka dem till program. När du bygger manuellt måste du utföra följande kommandon:
cc -c main.c cc -c lib.c cc -o program main.o lib.oOm ändringar görs i filen defines.h under utvecklingen av programmet kommer omkompilering av både filer och länkning att krävas , och om vi ändrar lib.c kan omkompilering av main.c utelämnas.
För varje fil som vi behöver hämta under kompileringsprocessen måste vi alltså specificera utifrån vilka filer och med vilket kommando den skapas. Make -programmet gör följande baserat på denna information:
Om du inte uttryckligen anger ett mål när du kör make , kommer det första målet i makefilen som inte börjar med ett '.' att behandlas.
För programprogrammet räcker det att skriva följande makefile:
program : huvud . om lib . o cc -o program main.o lib.o main.o lib.o : definierar . hDet är värt att notera ett antal funktioner. Namnet på det andra målet anger två filer och inget kompileringskommando anges för samma mål. Dessutom är beroendet av objektfiler på "*.c"-filer inte explicit specificerat någonstans. Detta beror på att make -programmet har fördefinierade regler för att hämta filer med vissa . Så för målobjektfilen ( tillägget ".o"), när en motsvarande fil med filtillägget ".c" hittas, kommer kompilatorn "cc -c" att anropas och specificerar denna ".c"-fil och alla beroendefiler i parametrarna.
Syntax för att definiera variabler :
variabel = värdeVärdet kan vara vilken sekvens av tecken som helst , inklusive mellanslag och referenser till värden för andra variabler . Med det sagt kan vi ändra vår makefile enligt följande:
OBJ = main.o lib.o program : $( OBJ ) cc -o program $( OBJ ) $(OBJ) : definierar . hDet bör noteras att beräkningen av variablernas värden endast sker vid användningstillfället (den så kallade lata utvärderingen används ). Om du till exempel bygger allt-målet från följande makefil kommer strängen "Va?" att skrivas ut.
foo = $( bar ) bar = $( ugh ) ugh = Va ? alla : echo $( foo )Anta att en andra header-fil, lib.h, läggs till i projektet och bara ingår i lib.c. Sedan kommer makefilen att öka med en rad till:
lib.o : lib . hSåledes kan en målfil specificeras för flera ändamål. I det här fallet kommer den fullständiga listan med beroenden för filen att kompileras från listorna över beroenden för alla mål som den deltar i, filen kommer bara att skapas en gång.
För att snabba på långvariga uppgifter används parallellisering av beräkningar inom make-programmet. Parallellisering görs automatiskt av make-tolken. För att köra makefilen i flertrådsläge måste du klara av alternativet -j <antal trådar>.
göra [ -j <antal trådar> ] [ mål ]Monteringsautomationssystem | |
---|---|
Unix-kommandon | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
|