Introducere în a face

Scop, istorie, opțiuni

Utilitatea de creare este concepută pentru a automatiza asamblarea proiectelor. Dacă fișierele de proiect pot fi generate din alte fișiere, utilitarul vă permite să efectuați procesul de construire în modul cel mai optim, minimizând, dacă este posibil, numărul de fișiere procesate.







Din punct de vedere istoric, utilitarul a fost conceput pentru a construi proiecte în C în sistemul de operare Unix, dar poate fi folosit pentru a lucra cu orice proiecte. Prima versiune a sistemului a fost creată în 1977.

Până în prezent, cele mai frecvente sunt cele trei versiuni ale utilității, unite prin principiile comune ale muncii, dar care diferă în sintaxa și capacitățile limbajului:

GNU make este versiunea cea mai comună și mai funcțională

Producția BSD (pmake) - folosită în proiectele BSD, prin funcționalitate corespunde aproximativ GNU-ului

nmake (Microsoft face) - funcționează sub Windows, nu este funcțional, doar principiile de bază fac.

Lucrăm cu marca GNU. Pe sistemele BSD (în special, FreeBSD, acesta poate fi accesat ca gmake, pe Linux este doar make).

Principii de bază

Utilitatea de fabricație funcționează conform regulilor. scrise într-un fișier de configurare special. Regulile definesc țintele. relația dintre obiective și setul de comenzi pentru a realiza fiecare obiectiv.

Obiectivele pot corespunde anumitor fișiere. În plus, este posibil ca țintele să nu corespundă cu niciun fișier și pot fi utilizate pentru gruparea altor obiective sau a unei anumite secvențe de comenzi. Astfel de obiective sunt numite ținte false.

Fiecare obiectiv poate depinde de îndeplinirea altor obiective. Îndeplinirea obiectivului necesită îndeplinirea preliminară a altor obiective pe care depinde.

În cazul dependențelor dintre obiectivele corespunzătoare fișierelor, țintă este executată numai dacă fișierele pe care depinde sunt mai noi decât fișierul corespunzător destinației. Aceasta vă permite să regenerați numai fișierele care depind de fișierele modificate și nu efectuați un proces potențial lung de reconstrucție a tuturor fișierelor de proiect.

Astfel, makefile definește un grafic de dependență, în care utilitatea de execuție execută un anumit scop, minimizând numărul operațiilor de asamblare, dacă este posibil.

Marcă de alergare

Deși puteți specifica un fișier de reguli arbitrar pentru marca, de obicei utilizați numele standard al Makefile. Mai multe nume alternative sunt de asemenea acceptate în mod implicit, dar este util să folosiți cele mai comune nume.

va folosi fișierul Makefile. localizat în directorul curent.

Când rulați, puteți specifica ținta care va fi executată. Dacă țintă nu este specificată, este utilizată țintă implicită, care este fie specificată explicit în fișierul de reguli, fie prima țintă definită este implicit utilizată.

Indicația explicită a țintei se realizează prin instrucțiunea DEFAULT_GOAL din fișierul Make.

va apela țintă de curățare a fișierului Makefile. localizat în directorul curent.

Puteți specifica mai multe obiective simultan.

Îmbunătățirea obiectivului poate fi configurată utilizând variabile (despre care mai jos). Când rulează faceți, puteți specifica valorile variabilelor:

Valoarea variabilei PREFIX va fi disponibilă în regulile Makefile și poate fi utilizată pentru asamblare.

Comanda suportă și o serie de opțiuni suplimentare, dintre care cele mai importante sunt următoarele:

-f - vă permite să specificați în mod explicit un fișier de reguli

-C - merge la directorul specificat înainte de execuție, poate, de exemplu, folosit pentru a rula face dintr-un director extern în raport cu directorul de proiect

-B - dezactivează verificarea timpului pentru țintele dependente și le impune complet

Sintaxa de bază a mărcii

Construcția principală utilizată în fișierele de creare. este după cum urmează:

Dep.1. dep2 - obiectivele care țintesc

command1. command2 - comenzi executate pentru a atinge ținta

Acest fragment determină că fișierul style.css depinde de fișierul src / less / app.less și trebuie să executați lessc src / less / app.less> style.css pentru ao construi. Regenerarea fișierului style.css va fi efectuată numai dacă fișierul src / less / app.less este mai nou decât fișierul style.css (cu excepția cazului în care opțiunea -B este dată la pornirea producției).

Înainte de fiecare comandă, în interiorul descrierii țintă trebuie să apară un caracter tab. În principiu, este personalizabil, dar este mai bine să se utilizeze acorduri general acceptate. În cazul în care spațiile sunt utilizate în loc de tabulare, marca nu va funcționa.

Comenzile Shell sunt utilizate ca comenzi pentru procesarea țintelor. Textul de comandă este ieșit, astfel încât acesta să nu fie afișat, comanda trebuie să fie pornită cu simbolul @.

Fiecare comandă este rulată într-un interpret de shell separat, astfel încât comenzile nu sunt legate între ele. Cu alte cuvinte, o linie de comandă este o coajă. Acest comportament poate fi înlocuit cu ținta specială .ONESHELL.

Dacă comanda (sau lista de dependență) trebuie să fie scrise pe mai multe rânduri, utilizați despărțirea \.

Obiective PHONY

Obiectivele care nu se potrivesc cu fișierele și care sunt destinate executării unui set de comenzi sau grupări de dependențe sunt declarate după cum urmează:

Declarații .FONY pot fi mai multe, de obicei, definește unul și prescrie acolo toate obiectivele relevante.

În acest exemplu, apelul curat va executa ținta curată. care va efectua cu siguranță eliminarea fișierelor temporare.







În cazul în care ținta falsă are o dependență sub forma unei alte ținte false, atunci dependența este efectuată înainte de ținta. Deci avem un mecanism care seamănă cu o subrutină. De exemplu, putem defini scopul tuturor. care colectează toate fișierele de proiect și obiectivele css individuale. js și php. colectarea de fișiere css separate, fișiere js și procesarea fișierelor php.

În consecință, în Makefile putem scrie:

Ca rezultat, putem folosi toate pentru a reconstrui toate fișierele și, de exemplu, a face css pentru a reconstrui doar fișierele CSS.

variabile

Într-un makefile, puteți utiliza variabile, deși este mai corect să spunem că puteți utiliza macrocomenzi.

Variabilele sunt definite prin alocare în fișierul makefile sau pot fi transmise din exterior.

Variabilele sunt definiții macro și variabila este întotdeauna evaluată în ultimul moment înainte de înlocuire. Macrourile pot fi utilizate oriunde în textul makefile.

Înlocuirea este efectuată de constructul $ (VAR), spre deosebire de shell, unde se utilizează $ VAR.

Dacă comanda shell utilizează o variabilă shell, trebuie să citezi semnul $. duplicarea acesteia, de exemplu:

În plus față de variabilele macro, există mai multe tradiționale, în care valoarea este stabilită imediat. Pentru a lucra cu ele, utilizați operatorul: =. În condițiile noastre, este suficient să se utilizeze variabile obișnuite.

Este adesea necesară definirea unei variabile numai dacă nu a fost încă definită. Pentru a face acest lucru, utilizați operatorul? =.

În consecință, dacă sunăm

Codificarea UTF8 va fi utilizată. și în cazul

CP1251 va fi utilizat.

Dacă variabila conține mai mult de un rând, puteți utiliza sintaxa definită.

Variabile automate

Asigură suport un set de variabile automate care facilitează scrierea regulilor. De exemplu, variabila $ @ corespunde țintei curente (cea din stânga lui.), Și variabila $ ^ - la lista de dependențe (cea din dreapta paginii). Astfel, de exemplu, puteți scrie:

Ca rezultat, www / js / script.js este rezultatul combinarii a trei fisiere js.

O listă completă a acestor variabile este dată în documentație, pentru noi cea mai interesantă:

$<— имя первой зависимости

$? - numele tuturor dependențelor care sunt mai noi decât țintă

$ ^ - numele tuturor dependențelor țintă

Lista completă este disponibilă în documentația: Variabile automate.

Execuție condiționată

Condițiile expresive pot fi utilizate în Makefile. Din nou, vorbim de macrocomenzi, respectiv, afirmațiile condiționale funcționează la nivelul makefile și nu la nivelul de comandă. De obicei, expresiile condiționale sunt folosite pentru a defini anumite obiective în funcție de semnificația variabilelor. De exemplu:

Ca condiții, puteți verifica certitudinea unei variabile, precum și valoarea acesteia:

Complet cu posibilitățile expresiilor condiționale pot fi găsite în documentație: Sintaxă condiționată.

Reguli de șablon

Regulile tipare vă permit să specificați regula pentru conversia unui fișier în altul pe baza dependențelor dintre numele acestora. De exemplu, putem specifica o regulă pentru a obține un fișier obiect dintr-un fișier în C:

Notați utilizarea variabilei%<. которая в таких правилах используется для получения имени исходного файла.

Șabloanele nu trebuie să fie limitate la extensii de fișiere. Dacă fișierele sursă și țintă corespund între ele și există dependență în numele acestora, puteți utiliza regula de model.

Activați alte fișiere de creare

Fișierul de marcă poate include alte fișiere de creare cu o instrucțiune include.

Astfel, este posibil să se construiască un sistem modular din fișiere, de multe ori are sens să se facă includerea într-o declarație condiționată.

Make definește un set mare de funcții care pot fi folosite în variabile (macro-uri). Apelul pentru funcții este executat de construcție:

Funcțiile vă permit să procesați șiruri de caractere, nume de fișiere, să organizați bucle printr-un set de valori, să organizați un apel condiționat al altor funcții.

Câteva exemple din stup. Obțineți ora curentă (rețineți utilizarea: =.

Activarea fișierului container.mk numai dacă există:

Formarea numelui bazei de date MySQL după numele proiectului:

Adăugarea de prefixe și sufixe la numele fișierelor

Funcții personalizate

Puteți crea propriile funcții parametrizate prin definirea variabilelor care conțin variabile speciale $ 1. $ 2. corespunzătoare argumentelor adoptate. Apelarea unei funcții personalizate se face folosind o macrocomandă de apel specială.

Un exemplu foarte prost:

Acum puteți scrie:

Recursive

În plus față de includerea unui alt fișier de creare, Makefile poate executa un alt fișier de creare ca proces separat de a face.

Aceasta este o situație destul de frecventă în cazul proiectelor modulare. De exemplu, pentru fiecare componentă a proiectului (server, client, biblioteci), există un fișier Makefile. în timp ce există un principiu Makefile. Specifică setul de setări generale și apelează fișierul Make pentru fiecare subproiect.

Apelul de la Makefile este adesea numit submake. Apelul utilizează variabila $ (MAKE).

Valoarea acestei variabile corespunde căii spre programul de realizare. procesarea fișierului curent.

Pentru a transfera variabilele în fișierul astfel numit, trebuie să le exportați în mod explicit:

Valoarea variabilei PREFIX va fi disponibilă în subsistemul / Makefile.

Producția paralelă

Execuția poate executa paralel regulile. Pentru aceasta, utilizați opțiunea -j. vă permite să specificați numărul de procese paralele utilizate. În plus față de accelerarea procesului de asamblare, această caracteristică uneori vă permite să implementați pe genunchi scenarii de procesare foarte simple, care implică multitasking. De exemplu, puteți implementa un manager de coadă simplu, dar funcțional pentru a face, utilizând fișierele pentru a stoca lucrări și directoare pentru a stoca fișierele de lucru în diferite etape (așteptare, executare, rezultat).

Execuția paralelă poate fi interzisă utilizând destinația specială .NOTPARALLEL.

Obiective speciale

Asigurați-vă că acceptă un set de obiective care pot fi utilizate ca modificatori în scopuri ulterioare sau ca instrucțiuni de service. Iată câteva din aceste scopuri speciale:

PHONY - definește setul de ținte false;

DEFAULT - specifică ținta care trebuie apelată dacă nu se găsește nici o țintă dependentă care este necesară pentru realizarea unui alt scop;

IGNORE - indică obiectivele pentru care trebuie să ignorați erorile în timpul executării țintei;

SILENT - definește un set de obiective pentru care este necesară suprimarea rezultatelor comenzilor care îndeplinesc obiectivul;

NOTPARALLEL - împiedică executarea paralelă a fișierului makefile;

ONESHELL - efectuează un set de comenzi țintă într-un singur proces.

Utilizați cazuri

Cel mai adesea, face se spune în contextul programelor de construire în C / C ++, la urma urmei, pentru asta a fost inițial destinat. Cu toate acestea, face este un instrument mult mai versatil. Prin scrierea makefile, descriem declarativ starea relației dintre fișierele pe care fiecare dintre ei le va încerca să le suporte. Natura declarativă a definirii statului este foarte convenabilă, în cazul utilizării oricărui limbaj imperativ (de exemplu, un shell), ar trebui să efectuăm un număr mare de controale diferite, obținând un cod complex și confuz.

În plus, folosirea dependențelor între țintele false, care, de fapt, descriu în mod declarativ o mașină de stat finită (finită), poate fi utilă pentru scrierea diverselor scenarii administrative. Folosind face ca un cadru pentru a executa diferite comenzi shell, primim în esență un cadru de bază pentru shell-ul cu o interfață de utilizator gata (a face call + transfer variabil), built-in de urmărire a dependenței, executarea paralelă, macro-uri etc.

Prin urmare, cunoștințele de bază ale mărcii permit, în unele cazuri, rezolvarea problemei, deși nu cea mai frumoasă, dar mai rapidă și mai sigură.







Articole similare

Trimiteți-le prietenilor: