Asigurați-vă, programe și utilități

make este un utilitar care automatizează procesul de conversie a fișierelor dintr-o formă în alta. Cel mai adesea este compilarea codului sursă în fișiere obiect și legarea ulterioară la fișiere sau biblioteci executabile.

Utilitarul folosește fișiere special create, care arată dependențele fișierelor unele de celelalte și regulile de satisfacere a acestora. Pe baza informațiilor despre momentul ultimei modificări a fiecărui fișier, determinați și executați programele necesare.

Înainte de a crea marca, sistemul de construire (compilație) a software-ului Unix a constat, de obicei, din script-uri de construire shell care au însoțit codul sursă al programelor.

make a fost creat de Stuart Feldman în 1977 la Bell Labs.

În prezent, există multe utilitare pentru urmărirea dependențelor, dar este unul dintre cele mai răspândite, în primul rând pentru că este inclus în Unix, începând cu versiunea PWB / UNIX (English Programmer's Workbench), care conținea instrumente de dezvoltare software software-ul.

Există câteva versiuni ale mărcii. bazate pe mărci originale sau scrise de la zero, folosind aceleași formate de fișiere și principii de bază și algoritmi, precum și unele îmbunătățiri și extensii. De exemplu:

  • BSD face. bazat pe munca lui Adam de Boor asupra versiunii de make. cu posibilitatea de asamblare paralelă; într-o formă sau alta, sa mutat la FreeBSD, NetBSD și OpenBSD.
  • GNU make face parte din majoritatea distribuțiilor Linux și este adesea folosit împreună cu sistemul GNU build.

POSIX include standardul capabilităților de bază ale utilitarului de creare. cu un anumit grad de compatibilitate implementat în diferite versiuni de produs. Ca regulă, fișierele simple de marcă pot fi utilizate cu succes de diferite versiuni ale mărcii.

Dacă opțiunea -f nu este specificată, numele implicit pentru makefile este Makefile (cu toate acestea, în alte implementări ale mărcii pot fi verificate și alte fișiere, de exemplu GNUmakefile).

face deschide un makefile, citește regulile și execută comenzile necesare pentru a crea ținta specificată.

Obiectivele standard pentru construirea distribuțiilor GNU sunt:

În procesul de asamblare a aplicațiilor, BSD este adesea utilizat:

  • depinde - executa dependențe de compilare / construire
Asigurați-fișier

Programul de execuție execută comenzi în conformitate cu regulile specificate în fișierul special. Acest fișier este numit un makefile (makefile, makefile). De obicei, un makefile descrie modul de compilare și construire a unui program.

Setul de configurare constă în reguli și variabile. Regulile au următoarea sintaxă:

O regulă este un set de comenzi, execuția cărora va duce la asamblarea fișierelor țintă din fișierele de recuzită.

Regula spune povestea. că fișierele primite ca urmare a activității comenzilor (scopurilor) depind de fișierele de recuză corespunzătoare. face nu verifică și utilizează conținutul fișierelor de recuzită, cu toate acestea, specificând lista fișierelor de recuzită este necesară numai pentru a vă asigura că aceste fișiere sunt prezente înainte de a executa comenzile și pentru a urmări dependențele dintre fișiere.

De obicei, țintă este numele fișierului care este generat ca urmare a funcționării comenzilor specificate. Scopul poate fi și numele unei acțiuni care va fi executată ca urmare a executării comenzilor (de exemplu, ținta curată din fișierele de marcă pentru compilarea programelor șterge de obicei toate fișierele create în timpul procesului de compilare).

Liniile în care sunt scrise comenzile. trebuie să înceapă cu un caracter tab.

Luați în considerare un program necomplicat în C. Lăsați programul programului să fie alcătuit dintr-o pereche de fișiere de cod - main.c și lib.c, precum și dintr-un fișier antet - defines.h, care este atașat la ambele fișiere de cod. Prin urmare, pentru a crea programul, este necesar să creați fișiere obiect main.o și lib.o din perechi (main.c defines.h) și (lib.c defines.h) și apoi să le compilați în program. La asamblarea manuală, trebuie să dați următoarele comenzi:

Dacă modificați fișierul definines.h în timpul procesului de dezvoltare, va trebui să recompilați ambele fișiere și să le conectați, iar dacă schimbați lib.c, atunci nu puteți efectua recompilarea main.o.

Astfel, pentru fiecare fișier pe care trebuie să-l primim în timpul procesului de compilare, trebuie să specificăm ce fișiere sunt folosite și cu ce comandă este creată. Programul de realizare pe baza acestor date face următoarele:

  • colectează de la această informație secvența corectă de comenzi pentru a obține fișierele cu rezultate dorite;
  • și inițiază crearea fișierului necesar numai dacă un astfel de fișier nu există sau este mai vechi decât fișierele pe care depinde.

Dacă în mod explicit nu reușiți să specificați o țintă atunci când rulați marcaje, prima țintă din fișierul makefile al cărui nume nu începe cu simbolul "." Va fi procesat.

Pentru programul de program, trebuie doar să scrieți următorul set makefile:

Este demn de remarcat o serie de caracteristici. În numele celui de-al doilea scop, există două fișiere și, în același scop, comanda de compilare nu este specificată. În plus, nicăieri nu există dependența fișierelor obiect în fișierele "* .c" specificate explicit. Faptul este că programul face are reguli predefinite pentru obținerea de fișiere cu anumite extensii. Astfel, pentru fișierul obiect țintă (extensie ".o"), dacă se găsește un fișier corespunzător cu extensia ".c", va fi apelat compilatorul "cc -s" cu parametrii acestui fișier ".c" și toate fișierele de dependență.

Sintaxa pentru definirea variabilelor este:

Valoarea poate fi o secvență arbitrară de caractere, inclusiv spații și acces la valorile altor variabile. Având în vedere acest lucru, puteți modifica fișierul nostru ca acesta:

Trebuie notat faptul că calculul valorii variabilelor are loc numai la momentul utilizării (se utilizează așa-numitul calcul leneș). De exemplu, dacă asamblați obiectivul toate din fișierul de mai jos, linia "Huh?" Va fi afișată.

Să presupunem că a fost adăugat al doilea fișier header lib.h la proiect, care este inclus numai în lib.c. Apoi, makefile va crește cu încă o linie:

Astfel, un fișier țintă poate fi specificat pentru mai multe scopuri. În acest caz, lista completă a dependențelor pentru fișier va fi compilată din listele de dependență ale tuturor destinațiilor în care participă, fișierul va fi creat o singură dată.

Articole similare