Wildcards și Foreach în Makefile

Wildcards Si Foreach In Makefile



Un fișier este întotdeauna alcătuit dintr-un tip diferit de conținut: fie că este un simplu fișier text, un fișier de cod de program sau orice makefile. Tipul de conținut al oricărui fișier îl face unic și îl diferențiază de celălalt format de fișiere. La fel, makefile constă din reguli care folosesc diferite elemente pentru a-și desfășura activitatea corect. Din aceste elemente, există wildcard și foreach care sunt necesare pentru a realiza ceva unic și în plus. În cadrul acestui ghid, vom discuta despre puterea wildcard-urilor și foreach în timp ce sunt utilizate într-un makefile.

Wildcards în Makefile

În general, wildcard-ul este cunoscut a fi un factor care nu poate fi prezis și poate transforma situația în orice mod posibil. Caracterele metalice din makefile sunt folosite pentru a realiza un bonus de detectare a tuturor tiparelor posibile dintr-un director de lucru curent, fie că este un fișier sau orice folder. Aceste fișiere sursă pot fi de orice tip.







Pentru a utiliza un wildcard într-un makefile, ar trebui să utilizați cuvântul cheie „wildcard” care urmează asteriscul „*” sau „?” semnul și extensia de fișier care este conectată printr-un punct. Puteți utiliza, de asemenea, „?” semnează pentru a căuta un singur caracter și „*” pentru a se potrivi cu orice număr de caractere. Întreaga structură ar trebui utilizată între paranteze și semnul „$”. De exemplu, declarăm variabila „SRCS” care își primește fișierul de valoare prin wildcard. Acest wildcard caută toate fișierele cu modelul „cpp” la sfârșitul lor.





Foreach în Makefile

Funcția foreach a makefile funcționează exact ca o buclă foreach în limbajele de programare – repetă peste elementele dintr-o listă. Funcția foreach din makefile efectuează o anumită acțiune asupra fiecărui element dintr-o listă. Acest element poate fi o variabilă sau orice fișier sursă. De exemplu, elaborăm sintaxa funcției foreach în makefile prin variabila SOURCES care conține o listă de trei fișiere sursă. Funcția foreach folosește această variabilă SOURCES pentru a crea același nume pentru trei fișiere obiect, repetând lista de fișiere sursă și salvându-le într-o altă variabilă „OBJECTS”. Ultimele două rânduri arată cum o regulă makefile poate fi utilizată pentru a crea un fișier obiect pentru fiecare fișier C după iterare.





SURSE := fisier1.c fisier2.c fisier3.c
OBIECTE := $ ( foreach src,$ ( SURSE ) ,$ ( src:.c=.o ) )
$OBIECTE : % .O: % .c
$ ( CC ) $ ( CFLAGS ) -c $ < -O $ @

Exemplul 1: Utilizarea caracterelor joker

Pentru a afișa ilustrarea și funcționarea metacaracterilor și a funcțiilor pentru fiecare, introducem un fișier C++. Acest fișier „salary.cpp” este pornit cu utilizarea antetului „iostream” pentru a permite o utilizare fără probleme a fluxurilor de intrare și de ieșire. Metoda principală declară o variabilă „s” de tip întreg și instrucțiunea „cout” pentru a cere o valoare de intrare în timpul execuției. Fluxul de intrare standard „cin” primește valoarea de la un utilizator în timpul execuției și o salvează în variabila „s”. „Cout” afișează valoarea introdusă de un utilizator pe ecranul consolei.

#include
folosind namespace std;
int principal ( ) {
int s;
cout << „Introduceți salariul:” ;
mâncând >> s;
cout << ' \n Salariu: ' << s << endl;
întoarcere 0 ;
}



Începem makefile-ul cu variabila „CXX” care definește compilatorul pentru C++, iar variabila CXXFLAGS deține steagurile pentru compilatorul C++. Variabila EXECUTABLE deține numele unui fișier executabil „hello” care este generat după executarea unui makefile. Variabila SRCS primește toate fișierele C++ dintr-un director curent folosind caracterul metalic „*” pentru a căuta orice model care se termină cu „.cpp”. Variabila OBJS deține numele fișierelor obiect care urmează să fie create folosind variabila SRCS, înlocuind extensia „cpp” cu „o”. Ținta implicită „toate” construiește makefile și depinde de variabila EXECUTABLE.

Prima regulă creează fișierul țintă „bună ziua” care depinde de fișierul obiect al variabilei OBJS (numele fișierelor obiect) folosind numele fișierelor care sunt generate prin variabila „OBJS”. A doua regulă makefile generează fișierul obiect cu extensia „.o” care depinde de fișierul C++ după compilarea fișierului de cod C++. Aici, „%” este un wildcard pentru a căuta numele de fișiere ale oricărui model care se termină cu „cpp”. În cele din urmă, ținta curată își folosește comanda „rm” pentru a curăța forțat fișierele executabile și obiect nou generate dintr-un director, utilizând indicatorul „-f”.

CXX = g++
CXXFLAGS = -Perete -std =c++ unsprezece
EXECUTABLE = salut
SRCS = $ ( wildcard * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
toate: $ ( EXECUTABILE )
$ ( EXECUTABILE ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
curat:
rm -f $ ( EXECUTABILE ) $ ( OBJS )

La rularea instrucțiunii „make”, au fost create atât fișierele țintă, cât și fișierele obiect. După executarea fișierului executabil „bună ziua”, utilizatorului i se cere să introducă un salariu și adăugăm „67000”. La final, salariul este afișat înapoi.

face

Exemplul 2: Utilizarea Foreach

După ce ați folosit metacaracterele, este timpul să folosiți funcția foreach din makefile. Restul codului makefile este același. Pe linia 6, inițializam o altă variabilă care este „NAMES” cu o listă de trei valori – Kate, Kim, Tim. Ținta implicită „toate” depinde de variabila EXECUTABLE (numele fișierului țintă „hello”) și de instrucțiunea pentru fiecare. Funcția „addprefix” repetă variabila „NAMES” pentru a genera dinamic numele țintei prin prefixarea „run_” la începutul fiecărui nume din lista „NAMES”.

Regula de la rândul opt indică faptul că un fișier țintă executabil de ieșire, adică salut, depinde de „OBJS”. Indicatorul „-o” generează fișierul de ieșire țintă folosind OBJS. Regula de la a zecea linie generează fișierul obiect țintă folosind fișierele sursă cu extensia „cpp”. Pentru a face acest lucru, indicatorul „-c” este utilizat pentru a compila un fișier sursă și pentru a genera fișierul obiect aferent care este necesar pentru generarea țintă. La a treisprezecea linie, folosim variabila EXECUTABLE pentru a genera ieșirea cu nume diferite, începând cu „run_” ca prefix. În cele din urmă, ținta curată și țintele false vor elimina și curăța obiectele și fișierele țintă.

CXX = g++
CXXFLAGS = -Perete -std =c++ unsprezece
# fișier țintă executabil
EXECUTABLE = salut
SRCS = $ ( wildcard * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
# Lista de nume
NUME = Kate Kim Tim
# Ținte
toate: $ ( EXECUTABILE ) $ ( addprefix run_, $ ( NUME ) )
$ ( EXECUTABILE ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
# Creați ținte pentru fiecare nume
alerga_ % : $ ( EXECUTABILE )
. / $ ( EXECUTABILE ) $*
curat:
rm -f $ ( EXECUTABILE ) $ ( OBJS )
# Ținte false
.FONICE: toate curate

Utilizarea instrucțiunii „make” generează ținta executabilă „hello” și rulează programul pentru fiecare nume care este specificat în variabila „NAMES”.

face

De asemenea, puteți modifica rezultatul utilizând numele dintr-o listă cu prefixul „run_”.

Fă să fugă_Kim

Concluzie

Acest ghid a discutat despre utilizarea metacaracterilor și a conceptelor foreach în fișierul make, în timp ce a discutat separat despre sintaxa acestora. După aceea, am discutat exemplele de cod pentru a detalia lucrul lor cu ieșiri pentru obținerea fișierelor cu aceleași extensii și iterarea valorilor într-o listă de variabile.