Göra

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 11 januari 2016; kontroller kräver 35 redigeringar .

Göra
Språkklass byggautomationsverktyg [d] , UNIX-verktyg [d] ,skriptspråk,programmeringsspråkoch indraget språk [d]
Framträdde i april 1976  ( 1976-04 )
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.

Ursprung

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 1976Bell 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 .

Moderna versioner

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 .

Användning

göra [ -f makefile ] [ mål ] ...

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 :

  • alla - bygg paketet;
  • installera - installera ett paket från distributionen (kopierar körbara filer, bibliotek och dokumentation till systemkataloger);
  • avinstallera - ta bort paketet (tar bort körbara filer och bibliotek från systemkataloger);
  • clean - rensa upp distributionen (ta bort objektet och de körbara filerna som skapades under kompileringsprocessen från distributionen);
  • distclean — rensa upp alla filer som skapats under kompileringen och alla hjälpfiler som skapats av verktyget ./configure under processen att konfigurera distributionens kompileringsalternativ.

Som standard använder make det allra första målet i makefilen.

Byggprocessen för BSD-applikationer använder ofta:

  • depend - kompilera / bygg beroenden.

Makefile

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.o

Om ä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:

  • samlar in den korrekta sekvensen av kommandon från denna information för att erhålla de nödvändiga resulterande filerna;
  • och initierar skapandet av den nödvändiga filen endast om en sådan fil inte finns eller är äldre än de filer som den beror på.

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 . h

Det ä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ärde

Vä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 . h

Det 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 . h

Så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.

Multitrådad körning

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 ]

Se även

Litteratur

Länkar