Face

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 11 ianuarie 2016; verificările necesită 35 de modificări .

Face
Clasa de limba instrument de automatizare a construirii [d] , utilitar UNIX [d] ,scripting , limbajdeprogramareși limbaj indentat [d]
Aparut in aprilie 1976  ( 1976-04 )
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.

Origine

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

Versiuni moderne

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 .

Utilizare

make [ -f makefile ] [ target ] ...

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 :

  • all - construiți pachetul;
  • instalare - instalați un pachet din distribuție (copiază fișierele executabile, bibliotecile și documentația în directoarele de sistem);
  • dezinstalare - eliminați pachetul (șterge fișierele executabile și bibliotecile din directoarele de sistem);
  • curatare - curata distributia (elimina din distributie obiectele si fisierele executabile create in timpul procesului de compilare);
  • distclean — curățați toate fișierele create în timpul compilării și toate fișierele auxiliare create de utilitarul ./configure în timpul procesului de configurare a opțiunilor de compilare ale distribuției.

În mod implicit, make folosește prima țintă din makefile.

Procesul de construire a aplicației BSD utilizează adesea:

  • dependent - compilați / construiți dependențe.

Makefile

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

Dacă 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:

  • colectează din aceste informații succesiunea corectă de comenzi pentru a obține fișierele rezultate necesare;
  • și inițiază crearea fișierului necesar numai dacă un astfel de fișier nu există sau este mai vechi decât fișierele de care depinde.

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

Este 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ă = valoare

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

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

Astfel, 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ă.

Execuție cu mai multe fire

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ă ]

Vezi și

Literatură

Link -uri