Structura make-fișiere
a face utilitate. determină în mod automat care piesele unui program de mare trebuie să fie recompilat, și efectuează acțiunile necesare.
Înainte de a face uz. aveți nevoie pentru a crea așa-numitul Makefile (Makefile), care va descrie dependențele dintre fișierele de program compilate, și conțin instrucțiuni pentru a actualiza aceste fișiere. De obicei, fișierul executabil depinde fișierele obiect care, la rândul lor, sunt rezultatul compilarea fișierelor sursă relevante.
După make-fișierul dorit este creat, o simplă comandă:
Acesta va fi suficient pentru a efectua toate recompilations necesare în cazul în care oricare dintre fișierele sursă ale programului au fost modificate. Cu ajutorul informațiilor de make-fișier, și știind timpul ori ultima modificare a fișierelor, face de utilitate decide care dintre fișierele trebuie să fie actualizate. Pentru fiecare dintre aceste fișiere vor fi făcute în echipa specificate make-fișier.
Când apelați face. parametri pot fi specificate în linia de comandă, specificând care trebuie să fie reconstruite fișiere, și cum să o facă.
Simplu make-fișier
Simplu make-fișier constă din „reguli“ (reguli) formularul de mai jos:
De obicei, obiectivul (țintă) este numele fișierului care este generată în timpul funcționării face utilitate. Un exemplu este obiectul și fișierele executabile colectate de program. Scopul poate fi, de asemenea, numele unei acțiuni care urmează să fie realizată (de exemplu, curat - curat).
Preconditii (condiție) - un fișier care este utilizat ca date iskhoddnye pentru a crea ținta. Foarte des obiectivul depinde de mai multe fișiere.
Echipa - este acțiunea de a lua marca de utilitate. Regula poate conține mai multe echipe - fiecare pe o linie proprie. Notă importantă: rândurile care conțin comenzi trebuie să înceapă cu o filă! Ignorarea tabtslyatsii este cea mai frecventă greșeală făcută de mulți utilizatori novice.
De obicei, echipele sunt regulile pentru a servi ca premise și pentru a crea un fișier de țintă, în cazul în care oricare dintre condițiile prealabile a fost modefitsirovan. Cu toate acestea, o regulă care are echipa nu are nevoie să aibă condiții prealabile. De exemplu, în mod tipic în scopul curat ( „curățare“) care conține o comandă de ștergere nu poate fi premise.
Regula (regula) descrie când și cum să actualizați fișierele listate în ea ca obiectiv. Pentru a crea sau actualiza țintă, face execută comenzile regulii folosind premisele ca intrare. Regula poate, de asemenea, descrie modul în care ar trebui să fie executat o acțiune.
În plus față de normele, make-fișier poate conține alte structuri, cu toate acestea, un simplu make-fișier poate consta dintr-o simpla reguli. Regulile pot părea mai complicat decât modelul, dar ele sunt mai mult sau mai puțin corespund cu el de structura prezentată mai sus.
Mai jos este un exemplu de simplu make-fișier, care descrie faptul că modificarea fișier executabil depinde de opt fișiere obiect care, la rândul lor, depind de opt fișierele sursă relevante și trei fișiere antet.
În acest exemplu, fișierul defs.h antet este inclusă în toate fișierele sursă. fișier antet Command.h este inclus doar în fișierele sursă care se referă la comenzi de editare, și fișierul buffer.h - numai „low-level“ fișiere funcționează direct pe tamponul de editare.
Pentru a îmbunătăți lizibilitatea, linii lungi au fost împărțite în două părți printr-un backslash urmat de o linie nouă.
Pentru a utiliza acest make-fișier pentru a crea un fișier executabil de editare. trebuie să instruiască
Pentru a elimina executabil și fișierele obiect din directorul de proiect, emite următoarea comandă:
În acest exemplu, obiective, în special, sunt fișierele obiect și kbd.o. main.o și editați un fișier executabil. Cerințe preliminare Pentru a include fișiere, cum ar fi main.c și defs.h. Fiecare fișier obiect, de fapt, este atât o țintă și o condiție prealabilă. Exemple de comenzi pot fi cc -c main.c și cc -c kbd.c.
Dacă ținta este un fișier, aceasta trebuie să fie recompilate sau reconectat ori de câte ori a fost modificat oricare dintre condiții prealabile sale. În plus, orice condiții prealabile, care sunt ele însele generate automat ar trebui să fie actualizate mai întâi. În exemplul nostru, editarea fișier executabil depinde de opt fișiere obiect; fișier main.o obiect depinde de main.c fișierul sursă și fișierul antet defs.h.
Pentru fiecare linie care conține o țintă și condiții prealabile, urmate de o linie cu echipa. Aceste comenzi arată modul în care este necesar să se actualizeze fișierul țintă. La începutul fiecărei linii care conține mustul de comandă este un caracter tab. Prezența unui caracter filă este o caracteristică care distinge liniile de comandă fac din alte rânduri make-fișier. Rețineți că nu face nici cea mai mică idee de modul în care funcționează aceste comenzi. Prin urmare, responsabilitatea pentru faptul că echipa de actualizare efectuată după cum este necesar fișierul țintă este în întregime până la tine. face utilitar pur și simplu ia comanda specificată în regulă în cazul în care obiectivul trebuie să fie actualizat.
Scopul nu este de a curăța fișierul și numele acțiunii. Deoarece, în timpul programului normal de asamblare nu este necesară această acțiune, scopul curat nu este o condiție prealabilă a oricărei reguli. Prin urmare, nu se va face „atinge“ regula până când nu sunt în mod specific a spus să facă acest lucru. Rețineți că această regulă nu este nu numai o condiție necesară, dar nu conține în sine orice condiții prealabile. Astfel, singurul scop al acestei reguli - punerea în aplicare a acestor comenzi în ea. Obiectivele care nu sunt fișiere și acțiuni poartă numele de nume de obiective abstracte (ținte false). Scopul Rezumat sunt discutate în detaliu în secțiunea de obiectiv abstract. În comanda nu a reușit să descrie modul în care cauza face pentru a ignora erorile care pot apărea atunci când executați comanda rm și orice alte comenzi.
Utilizarea variabilelor
În exemplul de mai sus, în regula pentru editare, am avut de două ori pentru a enumera o listă de fișiere obiect:
O astfel de duplicare este plină de erori. La adăugarea unui obiect nou la fișierul de proiect, îl puteți adăuga la o listă și să uitați de altă parte. Pentru a elimina probabilitatea acestui risc și pentru a simplifica make-fișier, se utilizează variabile. Variabilele (variabile) permit, o dată identificarea șir de text, și apoi l utilizați în mod repetat în locurile relevante).
Este o practică comună în construcția de make-fișiere este de a utiliza o variabilă de obiecte numite. OBIECTE. objs. OBJS. obj. sau OBJ. care conține o listă cu toate fișierele obiect. De exemplu:
Mai mult, de fiecare dată când este nevoie de lista de fișiere obiect, puteți utiliza această variabilă folosind inregistrari $ (obiecte):
obiective suplimentare construi
De multe ori în make-fișier inclus și alte obiective, în plus față de compilare:
reguli de sufixe
Normele sufix - acesta este un alt domeniu în care trebuie să decidă dacă să scrie -files standard de a face sau de a folosi extensiile GNU. Normele standard de sufixe este mult mai limitată decât regulile șablon GNU, dar în multe situații regulile standard de sufixe pot fi utile. În plus, regulile de model nu sunt acceptate în toate versiunile de marca. Normele sufixul sunt după cum urmează:
SD:
$ (CC) -c $ (CFLAGS) $ (CPPFLAGS) o- $ @ $<
.Sufixe. cu .o
Această regulă prevede (în cazul în care nu atinge componentele inutile) care fac ar trebui, în cazul în care nu au existat alte indicații clare, rândul său ca fișier în AO prin rularea linia de comandă închisă. Fiecare fișier .c va fi tratat ca în cazul în care este în mod clar listat ca o dependență a fișierului .o corespunzător în contul dvs. de make-fișiere.
Această regulă sufix demonstrează o altă oportunitate de a face - variabile automate. Este clar că necesitatea de a găsi o modalitate de a înlocui dependența și obiectul țintă în linia de comandă. Automată variabilă $ @ acționează ca o țintă, $<выступает в качестве первой зависимости, а $^ представляет все зависимости.
Există și alte variabile automate, care sunt discutate în ghidul pentru a face. Toate variabilele automate pot fi utilizate în normele obișnuite, precum și în normele de sufixe și de model. Ultima linie este un exemplu de o altă directivă .SUFFIXES spune că face .c și .Inelele sufixe urmează să fie folosite pentru a face găsirea unui mod de a transforma fișierele sursă existente în țintele corespunzătoare.
Normele de model sunt mai puternice și, prin urmare, un pic mai complicat decât regulile de sufixe. Mai jos este o probă echivalentă cu regula de model pentru regulile de sufixe de mai sus.
% .o:% .c
$ (CC) -c $ (CFLAGS) $ (CPPFLAGS) o- $ @ $<
Cele mai multe proiecte la scară largă cu instrumente open source folosesc Automake, Autoconf și libtool. Aceste instrumente sunt o colecție de cunoștințe despre caracteristicile diferitelor sisteme și standarde ale comunității care pot ajuta în proiecte de construcții. Astfel, necesitatea de a scrie un pic de cod, specifice proiectului. Instanță, Automake scris pe obiective instalare și dezinstalare. Autoconf detectează automat capacitățile sistemului și configurează software-ul pentru sistemul său de conformitate, un libtool monitorizează diferențele în gestionarea bibliotecilor partajate între diferite sisteme.