Symbole wieloznaczne i Foreach w Makefile

Symbole Wieloznaczne I Foreach W Makefile



Plik zawsze składa się z innego rodzaju treści: prostego pliku tekstowego, pliku kodu programu czy dowolnego pliku makefile. Typ zawartości dowolnego pliku czyni go wyjątkowym i odróżnia go od innych formatów plików. Podobnie makefile składa się z reguł, które wykorzystują różne elementy do prawidłowego wykonywania swojej pracy. Z tych elementów jest symbol wieloznaczny i foreach, które są wymagane do wykonania czegoś wyjątkowego i ekstra. W tym przewodniku omówimy siłę symboli wieloznacznych i foreach, gdy są one używane w pliku makefile.

Symbole wieloznaczne w Makefile

Ogólnie wiadomo, że symbol wieloznaczny jest czynnikiem, którego nie można przewidzieć i który może zmienić sytuację w dowolny możliwy sposób. Symbole wieloznaczne w pliku makefile służą do dodatkowego wykrycia wszystkich możliwych wzorców z bieżącego katalogu roboczego, niezależnie od tego, czy jest to plik, czy dowolny folder. Te pliki źródłowe mogą być dowolnego typu.







Aby użyć symbolu wieloznacznego w pliku makefile, należy użyć słowa kluczowego „wildcard” następującego po gwiazdce „*” lub „?” znak i rozszerzenie pliku połączone kropką. Możesz także użyć znaku „?” znak, aby wyszukać pojedynczy znak i „*”, aby dopasować dowolną liczbę znaków. Całą tę konstrukcję należy ująć w nawiasach i znaku „$”. Na przykład deklarujemy zmienną „SRCS”, która pobiera plik wartości poprzez symbol wieloznaczny. Ten symbol wieloznaczny wyszukuje wszystkie pliki ze wzorcem „cpp” na końcu.





Foreach w Makefile

Funkcja foreach pliku makefile działa dokładnie tak, jak pętla foreach w językach programowania — iteruj po elementach na liście. Funkcja foreach w pliku makefile wykonuje określoną akcję na każdym elemencie listy. Elementem tym może być zmienna lub dowolny plik źródłowy. Na przykład opracowujemy składnię funkcji foreach w pliku makefile za pomocą zmiennej SOURCES, która zawiera listę trzech plików źródłowych. Funkcja foreach używa tej zmiennej SOURCES do utworzenia tej samej nazwy dla trzech plików obiektowych poprzez iterację listy plików źródłowych i zapisanie ich w innej zmiennej „OBJECTS”. Ostatnie dwie linie pokazują, jak można użyć reguły makefile do utworzenia pliku obiektowego dla każdego pliku C po iteracji.





ŹRÓDŁA := plik1.c plik2.c plik3.c
OBIEKTÓW := $ ( foreach src, $ ( ŹRÓDŁA ) , $ ( src:.c=.o ) )
$OBIEKTÓW : % .O: % .C
$ ( CC ) $ ( CFLAGI ) -C $ < -O $ @

Przykład 1: Używanie symboli wieloznacznych

Aby wyświetlić ilustrację i działanie symboli wieloznacznych i funkcji foreach, wprowadzamy plik C++. Ten plik „salary.cpp” jest uruchamiany przy użyciu nagłówka „iostream”, aby umożliwić płynne wykorzystanie strumieni wejściowych i wyjściowych. Główna metoda deklaruje zmienną „s” typu całkowitego i instrukcję „cout”, aby zapytać o wartość wejściową w czasie wykonywania. Standardowy strumień wejściowy „cin” pobiera wartość od użytkownika w czasie wykonywania i zapisuje ją w zmiennej „s”. „cout” wyświetla wartość wprowadzoną przez użytkownika na ekranie konsoli.

#include
używając przestrzeni nazw std;
int główny ( ) {
int s;
cout << „Wpisz wynagrodzenie:” ;
jedzenie >> S;
cout << ' \N Wynagrodzenie: ' << S << koniec;
powrót 0 ;
}



Plik makefile rozpoczynamy od zmiennej „CXX”, która definiuje kompilator dla C++, a zmienna CXXFLAGS przechowuje flagi dla kompilatora C++. Zmienna EXECUTABLE przechowuje nazwę wykonywalnego pliku „hello”, który jest generowany po wykonaniu pliku makefile. Zmienna SRCS pobiera wszystkie pliki C++ z bieżącego katalogu przy użyciu symbolu wieloznacznego „*” w celu przeszukania dowolnego wzorca kończącego się na „.cpp”. Zmienna OBJS przechowuje nazwy plików obiektowych, które mają zostać utworzone przy użyciu zmiennej SRCS, zastępując rozszerzenie „cpp” przez „o”. Domyślny cel „all” buduje plik makefile i zależy to od zmiennej EXECUTABLE.

Pierwsza reguła tworzy docelowy plik „hello”, który jest zależny od pliku obiektowego zmiennej OBJS (nazwy plików obiektowych) przy użyciu nazw plików generowanych przez zmienną „OBJS”. Druga reguła makefile generuje plik obiektowy z rozszerzeniem „.o”, który zależy od pliku C++ po skompilowaniu pliku z kodem C++. Tutaj „%” jest symbolem wieloznacznym służącym do wyszukiwania nazw plików według dowolnego wzorca kończącego się na „cpp”. Na koniec czysty cel używa polecenia „rm”, aby wymusić czyszczenie nowo wygenerowanych plików wykonywalnych i obiektowych z katalogu przy użyciu flagi „-f”.

CXX = g++
CXXFLAG = -Ściana -std =c++ jedenaście
WYKONAWCZY = cześć
SRC = $ ( dzika karta * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
wszyscy: $ ( WYKONAWCZY )
$ ( WYKONAWCZY ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAG ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAG ) -C $ < -O $ @
czysty:
rm -F $ ( WYKONAWCZY ) $ ( OBJS )

Po uruchomieniu instrukcji „make” zostały utworzone zarówno pliki docelowe, jak i obiektowe. Po uruchomieniu pliku wykonywalnego „hello” użytkownik proszony jest o podanie wynagrodzenia i dopisujemy „67000”. Na koniec wyświetli się wynagrodzenie.

robić

Przykład 2: Korzystanie z Foreach

Po użyciu symboli wieloznacznych czas skorzystać z funkcji foreach w pliku makefile. Reszta kodu makefile jest taka sama. W linii 6 inicjujemy kolejną zmienną „NAZWY” listą trzech wartości – Kate, Kim, Tim. Domyślny cel „all” zależy od zmiennej EXECUTABLE (nazwa pliku docelowego „hello”) i instrukcji foreach. Funkcja „addprefix” iteruje zmienną „NAMES”, aby dynamicznie generować nazwy docelowe poprzez dodanie przedrostka „run_” na początku każdej nazwy na liście „NAMES”.

Reguła w ósmej linii wskazuje, że docelowy plik wykonywalny wyjściowy, tj. hello, jest zależny od „OBJS”. Flaga „-o” generuje docelowy plik wyjściowy przy użyciu OBJS. Reguła w dziesiątej linii generuje docelowy plik obiektowy przy użyciu plików źródłowych z rozszerzeniem „cpp”. W tym celu używana jest flaga „-c” do kompilowania pliku źródłowego i generowania powiązanego pliku obiektowego, który jest niezbędny do generacji docelowej. W trzynastym wierszu używamy zmiennej EXECUTABLE, aby wygenerować dane wyjściowe o różnych nazwach, zaczynając od „run_” jako przedrostka. Na koniec czyste cele i fałszywe cele usuną i wyczyszczą pliki obiektów i celów.

CXX = g++
CXXFLAG = -Ściana -std =c++ jedenaście
# wykonywalny plik docelowy
WYKONAWCZY = cześć
SRC = $ ( dzika karta * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
# Lista nazwisk
IMIONA = Kate Kim Tim
# Cele
wszyscy: $ ( WYKONAWCZY ) $ ( dodajprzedrostek run_, $ ( NAZWY ) )
$ ( WYKONAWCZY ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAG ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAG ) -C $ < -O $ @
# Utwórz cele dla każdej nazwy
uruchomić_ % : $ ( WYKONAWCZY )
. / $ ( WYKONAWCZY ) $*
czysty:
rm -F $ ( WYKONAWCZY ) $ ( OBJS )
# Fałszywe cele
.PHONY: wszystko czyste

Użycie instrukcji „make” generuje wykonywalny cel „hello” i uruchamia program dla każdej nazwy określonej w zmiennej „NAMES”.

robić

Możesz także modyfikować swoje dane wyjściowe, używając nazwy z listy z przedrostkiem „run_”.

Zrób run_Kim

Wniosek

W tym przewodniku omówiono użycie symboli wieloznacznych i koncepcji foreach w pliku makefile, omawiając osobno ich składnię. Następnie omówiliśmy przykłady kodu, aby szczegółowo opisać pracę z wynikami w celu uzyskania plików z tymi samymi rozszerzeniami i iteracji wartości na liście zmiennych.