Platzhalter und Foreach in Makefile

Platzhalter Und Foreach In Makefile



Eine Datei besteht immer aus einer anderen Art von Inhalt: sei es eine einfache Textdatei, eine Programmcodedatei oder ein beliebiges Makefile. Der Inhaltstyp jeder Datei macht sie einzigartig und unterscheidet sie von anderen Dateiformaten. Genauso besteht Makefile aus Regeln, die verschiedene Elemente verwenden, um ihre Arbeit ordnungsgemäß auszuführen. Von diesen Elementen gibt es den Platzhalter und foreach, die erforderlich sind, um etwas Einzigartiges und Besonderes zu leisten. In diesem Leitfaden besprechen wir die Leistungsfähigkeit von Platzhaltern und foreach, wenn sie in einem Makefile verwendet werden.

Platzhalter in Makefile

Im Allgemeinen ist die Wildcard bekanntermaßen ein nicht vorhersehbarer Faktor, der die Situation auf jede erdenkliche Weise verändern kann. Die Platzhalter im Makefile werden verwendet, um als Bonus alle möglichen Muster aus einem aktuellen Arbeitsverzeichnis zu erkennen, unabhängig davon, ob es sich um eine Datei oder einen beliebigen Ordner handelt. Diese Quelldateien können von beliebigem Typ sein.







Um einen Platzhalter in einem Makefile zu verwenden, sollten Sie das Schlüsselwort „wildcard“ verwenden, das auf das Sternchen „*“ oder „?“ folgt. Zeichen und die Dateierweiterung, die durch einen Punkt verbunden ist. Sie können auch das „?“ verwenden. sign, um nach einem einzelnen Zeichen zu suchen, und „*“, um eine beliebige Anzahl von Zeichen zu finden. Diese gesamte Struktur sollte innerhalb der Klammern und eines „$“-Zeichens verwendet werden. Beispielsweise deklarieren wir die Variable „SRCS“, die ihre Wertedatei über den Platzhalter erhält. Dieser Platzhalter sucht nach allen Dateien mit dem „cpp“-Muster am Ende.





Foreach im Makefile

Die foreach-Funktion von Makefile funktioniert genau wie eine foreach-Schleife in Programmiersprachen – sie iteriert über die Elemente in einer Liste. Die foreach-Funktion im Makefile führt eine bestimmte Aktion für jedes Element einer Liste aus. Dieses Element kann eine Variable oder eine beliebige Quelldatei sein. Beispielsweise erarbeiten wir die Syntax der Funktion foreach im Makefile über die Variable SOURCES, die eine Liste von drei Quelldateien enthält. Die foreach-Funktion verwendet diese SOURCES-Variable, um denselben Namen für drei Objektdateien zu erstellen, indem sie die Liste der Quelldateien iteriert und sie in einer anderen „OBJECTS“-Variablen speichert. Die letzten beiden Zeilen zeigen, wie eine Makefile-Regel verwendet werden kann, um nach der Iteration für jede C-Datei eine Objektdatei zu erstellen.





QUELLEN := Datei1.c Datei2.c Datei3.c
OBJEKTE := $ ( foreach src,$ ( QUELLEN ) ,$ ( src:.c=.o ) )
$OBJEKTE : % .Ö: % .C
$ ( CC ) $ ( CFLAGS ) -C $ < $ @

Beispiel 1: Verwendung von Platzhaltern

Um die Veranschaulichung und Funktionsweise von Platzhaltern und foreach-Funktionen anzuzeigen, führen wir eine C++-Datei ein. Diese „salary.cpp“-Datei wird mit dem „iostream“-Header gestartet, um eine reibungslose Nutzung von Ein- und Ausgabeströmen zu ermöglichen. Die Hauptmethode deklariert eine Variable „s“ vom Typ „Ganzzahl“ und die Anweisung „cout“, um zur Laufzeit nach einem Eingabewert zu fragen. Der Standardeingabestream „cin“ ruft den Wert zur Laufzeit von einem Benutzer ab und speichert ihn in der Variablen „s“. Der „cout“ zeigt den von einem Benutzer eingegebenen Wert auf dem Konsolenbildschirm an.

#include
Verwenden des Namensraums std;
int main ( ) {
int s;
cout << „Gehalt eingeben:“ ;
Essen >> S;
cout << ' \N Gehalt: ' << S << endl;
zurückkehren 0 ;
}



Wir starten das Makefile mit der Variablen „CXX“, die den Compiler für C++ definiert, und die Variable CXXFLAGS enthält die Flags für den C++-Compiler. Die Variable EXECUTABLE enthält den Namen einer ausführbaren „Hallo“-Datei, die nach der Ausführung eines Makefiles generiert wird. Die SRCS-Variable ruft alle C++-Dateien aus einem aktuellen Verzeichnis ab, indem sie den Platzhalter „*“ verwendet, um nach Mustern zu suchen, die mit „.cpp“ enden. Die OBJS-Variable enthält die Namen der Objektdateien, die mithilfe der SRCS-Variablen erstellt werden sollen, wobei die Erweiterung „cpp“ durch „o“ ersetzt wird. Das Standardziel „all“ erstellt das Makefile und hängt von der EXECUTABLE-Variablen ab.

Die erste Regel erstellt die Zieldatei „Hallo“, die von der Objektdatei der OBJS-Variablen (Namen der Objektdateien) abhängt, und zwar unter Verwendung der Dateinamen, die über die Variable „OBJS“ generiert werden. Die zweite Makefile-Regel generiert die Objektdatei mit der Erweiterung „.o“, die von der C++-Datei abhängt, nachdem die C++-Codedatei kompiliert wurde. Hier ist „%“ ein Platzhalter für die Suche nach Dateinamen aller Muster, die mit „cpp“ enden. Am Ende verwendet das Bereinigungsziel seinen Befehl „rm“, um die neu generierten ausführbaren Dateien und Objektdateien mithilfe des Flags „-f“ zwangsweise aus einem Verzeichnis zu bereinigen.

CXX = g++
CXXFLAGS = -Wand -std =c++ elf
EXECUTABLE = Hallo
SRCS = $ ( Platzhalter * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
alle: $ ( AUSFÜHRBAR )
$ ( AUSFÜHRBAR ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) $ @ $ ( OBJS )
% .Ö: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -C $ < $ @
sauber:
rm -F $ ( AUSFÜHRBAR ) $ ( OBJS )

Beim Ausführen der „make“-Anweisung wurden sowohl die Ziel- als auch die Objektdatei erstellt. Nach dem Ausführen der ausführbaren „Hallo“-Datei wird der Benutzer aufgefordert, ein Gehalt einzugeben, und wir fügen „67000“ hinzu. Am Ende wird das Gehalt wieder angezeigt.

machen

Beispiel 2: Verwendung von Foreach

Nachdem Sie Platzhalter verwendet haben, ist es an der Zeit, die Funktion foreach im Makefile zu verwenden. Der Rest des Makefile-Codes ist derselbe. In Zeile 6 initialisieren wir eine weitere Variable, nämlich „NAMES“, mit einer Liste von drei Werten – Kate, Kim, Tim. Das Standardziel „all“ hängt von der Variable EXECUTABLE (Name der Zieldatei „hello“) und der foreach-Anweisung ab. Die Funktion „addprefix“ iteriert die Variable „NAMES“, um die Zielnamen dynamisch zu generieren, indem sie „run_“ am Anfang jedes Namens in der Liste „NAMES“ voranstellt.

Die Regel in der achten Zeile gibt an, dass eine ausführbare Ausgabezieldatei, d. h. „Hallo“, von „OBJS“ abhängig ist. Das Flag „-o“ generiert die Zielausgabedatei mithilfe von OBJS. Die Regel in der zehnten Zeile generiert die Zielobjektdatei unter Verwendung der Quelldateien mit der Erweiterung „cpp“. Dazu wird das Flag „-c“ verwendet, um eine Quelldatei zu kompilieren und die zugehörige Objektdatei zu generieren, die für die Zielgenerierung erforderlich ist. In der dreizehnten Zeile verwenden wir die Variable EXECUTABLE, um die Ausgabe mit unterschiedlichen Namen zu generieren, beginnend mit „run_“ als Präfix. Am Ende entfernen und bereinigen das Clean Target und die Phony Targets die Objekt- und Zieldateien.

CXX = g++
CXXFLAGS = -Wand -std =c++ elf
# ausführbare Zieldatei
EXECUTABLE = Hallo
SRCS = $ ( Platzhalter * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
# Namensliste
NAMEN = Kate Kim Tim
# Ziele
alle: $ ( AUSFÜHRBAR ) $ ( addprefix run_, $ ( NAMEN ) )
$ ( AUSFÜHRBAR ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) $ @ $ ( OBJS )
% .Ö: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -C $ < $ @
# Erstellen Sie Ziele für jeden Namen
laufen_ % : $ ( AUSFÜHRBAR )
. / $ ( AUSFÜHRBAR ) $*
sauber:
rm -F $ ( AUSFÜHRBAR ) $ ( OBJS )
# Falsche Ziele
.PHONY: alles sauber

Die Verwendung der „make“-Anweisung generiert das ausführbare „hello“-Ziel und führt das Programm für jeden Namen aus, der in der Variablen „NAMES“ angegeben ist.

machen

Sie können Ihre Ausgabe auch ändern, indem Sie den Namen aus einer Liste mit dem Präfix „run_“ verwenden.

Machen Sie run_Kim

Abschluss

In diesem Handbuch wird die Verwendung von Platzhaltern und foreach-Konzepten im Makefile erläutert, wobei deren Syntax separat erläutert wird. Danach haben wir die Codebeispiele besprochen, um die jeweilige Arbeit mit den Ausgaben zum Abrufen der Dateien mit denselben Erweiterungen und zum Iterieren der Werte in einer Variablenliste näher zu erläutern.