Wildcards og Foreach i Makefile

Wildcards Og Foreach I Makefile



En fil består altid af en anden type indhold: hvad enten det er en simpel tekstfil, en programkodefil eller en hvilken som helst make-fil. Indholdstypen for enhver fil gør den unik og adskiller den fra de andre filformater. Lige sådan består makefile af regler, der bruger forskellige elementer til at udføre sit arbejde korrekt. Fra disse elementer er der jokertegnet og foreach, som er nødvendige for at udføre noget unikt og ekstra. I denne guide vil vi diskutere styrken af ​​jokertegn og foreach, mens de bruges i en make-fil.

Jokertegn i Makefile

Generelt er jokertegnet kendt for at være en faktor, der ikke kan forudsiges og kan vende situationen på enhver mulig måde. Jokertegnene i makefilen bruges til at udføre en bonus ved at detektere alle mulige mønstre fra en aktuel arbejdsmappe, uanset om det er en fil eller en hvilken som helst mappe. Disse kildefiler kan være af enhver type.







For at bruge et jokertegn i en make-fil, skal du bruge søgeordet 'wildcard', der følger stjernen '*' eller '?' tegn og filtypenavnet, der er forbundet gennem en prik. Du kan også bruge '?' tegn for at søge efter et enkelt tegn og '*' for at matche et vilkårligt antal tegn. Hele denne struktur skal bruges inden for parenteserne og et '$'-tegn. For eksempel erklærer vi 'SRCS'-variablen, der får sin værdifil via jokertegnet. Dette jokertegn leder efter alle filerne med 'cpp'-mønsteret i slutningen.





Foreach i Makefile

Foreach-funktionen i makefile fungerer nøjagtigt som en foreach-løkke i programmeringssprog - gentag over elementerne på en liste. Foreach-funktionen i makefile udfører en bestemt handling på hvert punkt på en liste. Dette element kan være en variabel eller en hvilken som helst kildefil. For eksempel udarbejder vi syntaksen for hver funktion i makefile via variablen SOURCES, der indeholder en liste med tre kildefiler. Foreach-funktionen bruger denne SOURCES-variabel til at skabe det samme navn for tre objektfiler ved at iterere listen over kildefiler og gemme dem i en anden 'OBJECTS'-variabel. De sidste to linjer viser, hvordan en makefile-regel kan bruges til at oprette en objektfil for hver C-fil efter iteration.





KILDER := fil1.c fil2.c fil3.c
OBJEKTER:= $ ( foreach src,$ ( KILDER ) ,$ ( src:.c=.o ) )
$OBJECTS : % .O: % .c
$ ( CC ) $ ( CFLAGS ) -c $ < -O $ @

Eksempel 1: Brug af jokertegn

For at vise illustrationen og virkemåden af ​​jokertegn og hver funktion introducerer vi en C++ fil. Denne 'salary.cpp'-fil startes med brug af 'iostream'-headeren for at tillade en jævn brug af input- og outputstrømme. Hovedmetoden erklærer en variabel 's' af heltalstypen og 'cout'-sætningen for at bede om en inputværdi ved kørsel. 'cin'-standardinputstrømmen får værdien fra en bruger ved kørsel og gemmer den i variablen 's'. 'cout' viser den indtastede værdi af en bruger på konsolskærmen.

#include
bruger navneområde std;
int main ( ) {
int s;
cout << 'Indtast løn:' ;
spise >> s;
cout << ' \n Løn: ' << s << endl;
Vend tilbage 0 ;
}



Vi starter makefilen med 'CXX'-variablen, som definerer compileren for C++, og CXXFLAGS-variablen indeholder flagene for C++-kompileren. Variablen EXECUTABLE indeholder navnet på en eksekverbar 'hej'-fil, der genereres efter udførelse af en make-fil. SRCS-variablen henter alle C++-filerne fra en aktuel mappe ved hjælp af jokertegnet '*' til at søge i ethvert mønster, der ender med '.cpp'. OBJS-variablen indeholder navnene på objektfiler, der skal oprettes ved hjælp af SRCS-variablen, og erstatter 'cpp'-udvidelsen med 'o'. Standardmålet 'alle' bygger makefilen, og det afhænger af EXECUTABLE-variablen.

Den første regel opretter 'hej'-målfilen, der afhænger af OBJS-variablen (navne på objektfiler) objektfilen ved hjælp af filnavnene, der genereres via 'OBJS'-variablen. Den anden makefile-regel genererer objektfilen med filtypen '.o', der afhænger af C++-filen efter kompilering af C++-kodefilen. Her er '%' et jokertegn til at søge efter filnavnene for ethvert mønster, der ender med 'cpp'. I sidste ende bruger det rene mål sin 'rm'-kommando til kraftigt at rense de nyligt genererede eksekverbare og objektfiler fra en mappe ved hjælp af '-f'-flaget.

CXX = g++
CXXFLAGS = -Væg -std =c++ elleve
KØRBAR = hej
SRCS = $ ( jokertegn * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
alle: $ ( KØRBAR )
$ ( KØRBAR ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
ren:
rm -f $ ( KØRBAR ) $ ( OBJS )

Efter at have kørt 'make'-instruktionen blev både mål- og objektfilerne oprettet. Efter at have udført den eksekverbare 'hej'-fil, bliver brugeren bedt om at indtaste en løn, og vi tilføjer '67000'. Til sidst vises lønnen tilbage.

lave

Eksempel 2: Brug af Foreach

Efter at have brugt jokertegn, er det tid til at gøre brug af foreach-funktionen i makefile. Resten af ​​makefile-koden er den samme. På linje 6 initialiserer vi en anden variabel, som er 'NAVNE' med en liste med tre værdier - Kate, Kim, Tim. Standardmålet 'alle' afhænger af EXECUTABLE-variablen (målfilnavnet 'hej') og hver sætning. Funktionen 'addprefix' gentager variablen 'NAMES' for dynamisk at generere målnavnene ved at sætte præfikset 'run_' i starten af ​​hvert navn på listen 'NAMES'.

Reglen på otte linje angiver, at en output eksekverbar målfil, dvs. hej, er afhængig af 'OBJS'. '-o'-flaget genererer måloutputfilen ved hjælp af OBJS. Reglen på den tiende linje genererer målobjektfilen ved hjælp af kildefilerne med 'cpp'-udvidelsen. For at gøre det bruges '-c' flaget til at kompilere en kildefil og generere den relaterede objektfil, der er nødvendig for målgenereringen. På den trettende linje bruger vi variablen EXECUTABLE til at generere output med forskellige navne, der starter med 'run_' som et præfiks. I sidste ende vil de rene mål og de falske mål fjerne og rense objekt- og målfilerne.

CXX = g++
CXXFLAGS = -Væg -std =c++ elleve
# eksekverbar målfil
KØRBAR = hej
SRCS = $ ( jokertegn * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
# Liste over navne
NAVNE = Kate Kim Tim
# Mål
alle: $ ( KØRBAR ) $ ( addprefix run_, $ ( NAVNE ) )
$ ( KØRBAR ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
# Opret mål for hvert navn
løb_ % : $ ( KØRBAR )
. / $ ( KØRBAR ) $*
ren:
rm -f $ ( KØRBAR ) $ ( OBJS )
# Falske mål
.PHONY: alt rent

Brugen af ​​'make'-instruktionen genererer det eksekverbare 'hello'-mål og kører programmet for hvert navn, der er angivet i 'NAMES'-variablen.

lave

Du kan også ændre dit output ved at bruge navnet fra en liste med præfikset 'run_'.

Lav run_Kim

Konklusion

Denne guide diskuterede brugen af ​​jokertegn og foreach-koncepter i makefilen, mens deres syntaks blev diskuteret separat. Derefter diskuterede vi kodeeksemplerne for at uddybe hvert af deres arbejde med output for at få filerne med de samme udvidelser og gentage værdierne i en variabelliste.