Face | |
---|---|
Clasa de limba | instrument de automatizare a construirii [d] , utilitar UNIX [d] ,scripting , limbajdeprogramareși limbaj indentat [d] |
Aparut in | aprilie 1976 |
Autor | Stuart Feldman |
Dialectele | BSD make, GNU make, Microsoft nmake |
influențat | Ant , Rake , MSBuild și altele |
OS | asemănător Unix-ului |
make ( IPA [ me ɪ k ] ; din engleză - „make”, „make”) este un utilitar care automatizează procesul de conversie a fișierelor dintr-o formă în alta. Cel mai adesea, aceasta este compilarea codului sursă în fișiere obiect și apoi conectarea acestora în fișiere executabile sau biblioteci .
Utilitarul folosește makefile -uri speciale care specifică dependențele fișierelor unul față de celălalt și regulile pentru satisfacerea acestora. Pe baza informațiilor despre ultima oră de modificare a fiecărui fișier, make determină și rulează programele necesare.
Înainte de crearea sistemului make build (compilare) , software-ul Unix consta de obicei din scripturi shell build care însoțeau codul sursă al programelor.
make a fost creat de Stuart Feldman în aprilie 1976 la Bell Labs .
În prezent există multe utilitare pentru urmărirea dependențelor, dar make este una dintre cele mai utilizate, în primul rând datorită faptului că este inclusă în Unix , începând cu versiunea PWB / UNIX (Eng. Programmer's Workbench ), care conținea instrumente de dezvoltare securitatea software-ului .
Există mai multe versiuni de make , bazate pe marca originală sau scrise de la zero, folosind aceleași formate de fișiere și principii și algoritmi de bază, precum și unele îmbunătățiri și extensii. De exemplu:
POSIX include un standard pentru caracteristicile de bază ale make , implementate cu diferite grade de compatibilitate în diferite versiuni de make . În general, fișierele make simple pot fi procesate cu succes de diferite versiuni de make .
Fișierul este căutat în directorul curent. Dacă comutatorul -f nu este specificat, este folosit numele implicit makefile, Makefile (cu toate acestea, diferite implementări ale make pot verifica alte fișiere în plus față de acesta, cum ar fi GNUmakefile ).
make deschide fișierul make, citește regulile și execută comenzile necesare pentru a construi ținta specificată .
Ținte standard pentru construirea distribuțiilor GNU :
În mod implicit, make folosește prima țintă din makefile.
Procesul de construire a aplicației BSD utilizează adesea:
Programul make execută comenzi conform regulilor specificate într-un fișier special. Acest fișier se numește makefile. De obicei, un makefile descrie cum se compila și se leagă un program.
makefile constă din reguli și variabile. Regulile au următoarea sintaxă:
target1 target2 ... : prop1 prop2 ... echipa1 echipa 2 ...Regula este un set de comenzi, a căror execuție va duce la asamblarea fișierelor țintă din fișierele cu atribute .
Regula spune că fișierele produse de comenzi ( ținte ) depind de fișierele prop corespunzătoare. make nu verifică sau folosește în niciun fel conținutul fișierelor prop, dar specificarea listei de fișiere prop este necesară doar pentru a se asigura că fișierele sunt prezente înainte de a începe executarea comenzilor și pentru a ține evidența dependențelor fișierelor.
De obicei, ținta este numele fișierului care este generat ca rezultat al comenzilor specificate. Ținta poate fi, de asemenea, numele unei acțiuni care va fi efectuată ca urmare a executării comenzilor (de exemplu, ținta curată din fișierele make pentru compilarea programelor elimină de obicei toate fișierele create în timpul procesului de compilare ).
Liniile de comandă trebuie să înceapă cu un caracter tabulator .
Luați în considerare un program C simplu. Lăsați programul programului să fie format dintr-o pereche de fișiere de cod - main.c și lib.c, precum și un fișier antet - defines.h, care este inclus în ambele fișiere de cod . Prin urmare, pentru a crea un program, este necesar să creați fișiere obiect main.o și lib.o din perechi (main.c defines.h) și (lib.c defines.h), apoi să le legați în program. Când construiți manual, trebuie să executați următoarele comenzi:
cc -c main.c cc -c lib.c cc -o program main.o lib.oDacă se fac modificări la fișierul defines.h în timpul dezvoltării programului, va fi necesară recompilarea ambelor fișiere și a legăturii , iar dacă schimbăm lib.c, atunci recompilarea main.c poate fi omisă.
Astfel, pentru fiecare fișier pe care trebuie să îl obținem în timpul procesului de compilare , trebuie să specificăm pe baza căror fișiere și cu ce comandă este creat. Programul make face următoarele pe baza acestor informații:
Dacă nu specificați în mod explicit o țintă când rulați make , atunci prima țintă din fișierul make care nu începe cu „.” va fi procesată.
Pentru programul de program, este suficient să scrieți următorul makefile:
program : principal . despre lib . o cc -o program main.o lib.o main.o lib.o : defineste . hEste demn de remarcat o serie de caracteristici. Numele celei de-a doua ținte specifică două fișiere și nu este specificată nicio comandă de compilare pentru aceeași țintă. În plus, dependența fișierelor obiect de fișierele „*.c” nu este specificată în mod explicit nicăieri. Acest lucru se datorează faptului că programul make are reguli predefinite pentru obținerea fișierelor cu anumite . Deci, pentru fișierul obiect -țintă (extensia „.o”), atunci când este găsit un fișier corespunzător cu extensia „.c”, va fi apelat compilatorul „cc -c”, specificând acest fișier „.c” și toate fișiere de dependență în parametri.
Sintaxa pentru definirea variabilelor :
variabilă = valoareValoarea poate fi orice succesiune de caractere , inclusiv spații și referințe la valorile altor variabile . Acestea fiind spuse, putem modifica makefile-ul nostru după cum urmează:
OBJ = program main.o lib.o : $( OBJ ) cc -o program $( OBJ ) $(OBJ) : defineste . hTrebuie remarcat faptul că calculul valorilor variabilelor are loc numai în momentul utilizării (se folosește așa-numita evaluare leneșă ). De exemplu, construirea tuturor țintei din următorul fișier make va tipări șirul „Huh?”.
foo = $( bar ) bar = $( ugh ) ugh = Huh? toate : echo $( foo )Să presupunem că un al doilea fișier antet, lib.h, este adăugat la proiect și este inclus doar în lib.c. Apoi makefile-ul va crește cu încă o linie:
lib.o : lib . hAstfel, un fișier țintă poate fi specificat pentru mai multe scopuri. În acest caz, lista completă de dependențe pentru fișier va fi compilată din listele de dependențe ale tuturor țintelor la care acesta participă, fișierul urmând să fie creat o singură dată.
Pentru a accelera sarcinile de lungă durată, se utilizează paralelizarea calculelor în cadrul programului make. Paralelizarea se face automat de către interpretul make. Pentru a rula fișierul make în modul cu mai multe fire, trebuie să treceți opțiunea -j <număr de fire>.
make [ -j <număr de fire> ] [ țintă ]Asamblare sisteme de automatizare | |
---|---|
Comenzi Unix | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
|