Angielskifrancuskihiszpański

Ad


Ulubiona usługa OnWorks

makepp_functions - Online w chmurze

Uruchom makepp_functions w bezpłatnym dostawcy hostingu OnWorks w systemie Ubuntu Online, Fedora Online, emulatorze online systemu Windows lub emulatorze online systemu MAC OS

Jest to polecenie makepp_functions, które można uruchomić u dostawcy bezpłatnego hostingu OnWorks przy użyciu jednej z naszych wielu bezpłatnych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online systemu Windows lub emulator online systemu MAC OS

PROGRAM:

IMIĘ


makepp_functions — Funkcje w makepp

OPIS


A: nazwa_pliku_absolutnego,
nazwa_pliku_absolutnego_nolink,
Abspath,
dodajprzedrostek,
dodaje przyrostek,
i, B: nazwa bazowa, C: połączenie, D: reż,
dir_noslash, E: błąd, F: subst.plików,
filtr,
odfiltrować,
filtr_katalogi_wyjściowe,
Znajdź plik,
znajdź_pierwszy_w górę,
znajdź_program,
szukany ciąg,
znajdź_w górę,
pierwszy_dostępny,
pierwsze słowo,
dla każdego, I: Jeśli,
Jeśli prawda,
infer_linker,
wnioskować_obiekty,
informacje, J: Przystąp, M: robić,
mapa makijażu,
twórca,
mapa,
"mktemp", N: niedir, O: tylko_wygenerowane,
tylko_nietargety,
only_phony_targets,
tylko_nieaktualny,
tylko_cele,
lub,
pochodzenie, P: patsubst,
perł,
fałszywe,
kompilacja wstępna,
wydrukować, R: realpath,
względna nazwa_pliku,
względny_do, S: muszla,
sortować,
rozebrać się,
substytut,
przyrostek, T: tymczasowy, W: ostrzeżenie,
dzika karta,
słowo,
Lista słów,
słowa, X: xargs

Dowolne wyrażenie w formacie „$(nazwa)”, gdzie „nazwa” nie jest nazwą zmiennej, lub
„$(nazwa arg1 arg2 arg3)” jest interpretowane jako wywołanie funkcji. Imię może zawierać litery,
podkreślenia lub łączniki; aby uniknąć nieporozumień, możesz użyć łączników lub podkreśleń
zamiennie, ponieważ łączniki są wewnętrznie konwertowane na podkreślenia. Oceniając takie
wyrażenie po prostu wywołuje podprogram Perla. Jeśli „nazwa” jest poprzedzona „&”, uruchamia
wbudowane polecenie lub skrypt o tej nazwie w procesie makepp i zwraca standard
wyjście. Wymaga to zbudowania języka Perl dla PerlIO. Jeśli nazwa nie nazywa funkcji
zostaje on przekształcony w wywołanie wywołania.

Podobnie jak w przypadku zmiennych, masz do wyboru „$(nazwa ...)” lub „${nazwa ...}”. Jeśli chcesz
wstaw ten sam nawias, musi być sparowany, drugi nie ma znaczenia: „$(name
...(){..." lub "${name ...{}(...}". (Jednak w przypadku map i Perla pierwszy nawias zamykający kończy się
wyrażenie.) Podwojenie pozwala, aby argumenty obejmowały kilka wierszy. Nowe linie są
następnie traktowane jako spacje, może z wyjątkiem „zdefiniuj”. Istnieje również składnia „$[nazwa ...]”
lub $[[nazwa ...]], który jest oceniany podczas czytania pliku makefile, przed grokowaniem reguł
i inne konstrukcje.

Makepp ma wiele wbudowanych funkcji, które mogą być przydatne. Obsługuje prawie wszystkie
Funkcje tekstowe GNU make (więcej szczegółów znajdziesz w dokumentacji GNU make) i niektóre z nich
własny. Możesz zdefiniować podprogramy Perla, aby robić, co chcesz. Zobacz instrukcję „sub”.
oraz sekcję dotyczącą rozszerzania makepp, aby uzyskać więcej szczegółów.

Warunkowy Funkcje
i warunek1[,warunek2[,warunek3...]]
Funkcja and zapewnia operację „zwierania” AND. Każdy argument jest
rozwinięte, w kolejności. Jeśli argument rozwinie się do pustego ciągu, przetwarzanie zostanie zatrzymane i
wynikiem rozwinięcia jest pusty ciąg. Jeśli wszystkie argumenty rozwiną się do nie-
pusty ciąg, wówczas wynikiem rozwinięcia jest rozwinięcie ostatniego argumentu.

if strunowy, wynik-jeśli-ciąg-nie-pusty [, wynik-jeśli-ciąg-pusty]
Jeśli prawda strunowy, wynik-jeśli-ciąg-prawda[, wynik-jeśli-string-false]
Alternatywa dla instrukcji „ifeq” itp. Jeśli ciąg nie jest pusty (tzn
warunek jest spełniony), zwracany jest drugi argument (klauzula „wtedy”) (po
zmienna ekspansja); jeśli ciąg jest pusty, trzeci argument (klauzula „else”) jest pusty
zwrócony.

Na przykład,

CFLAGS := $(if $(filter gcc egcc, $(CC)), -g -Wall, -g)

definiuje CFLAGS jako „-g -Wall”, jeśli zmienna CC to „gcc” lub „egcc” oraz „-g”
W przeciwnym razie. (To właśnie robią domyślne reguły kompilacji.)

„iftrue” jest podobne do „if”, z tą różnicą, że ciąg 0 jest traktowany jako pusty.

or warunek1[,warunek2[,warunek3...]]
Funkcja or zapewnia operację „zwarcia” OR. Każdy argument jest rozwinięty,
w celu. Jeśli argument rozwinie się do niepustego ciągu, przetwarzanie zostanie zatrzymane i
wynikiem rozwinięcia jest ten ciąg. Jeśli po rozwinięciu wszystkich argumentów, wszystkie
są fałszywe (puste), wówczas wynikiem rozwinięcia jest pusty ciąg.

filet i Nazwa pliku Funkcje
nazwa_pliku_absolutnego pliki
Abspath pliki
Konwertuje względne nazwy plików na wartości bezwzględne bez . or .., Na przykład,
„$(absolute_filename xyz.c)” może zwrócić „/usr/src/our_project/subdir/xyz.c”.

nazwa_pliku_absolutnego_nolink pliki
prawdziwa ścieżka pliki
Podobnie jak nazwa_pliku_absolutnego, ale zapewnia rozwiązywanie dowiązań symbolicznych.

nazwa podstawowa nazwy plików
Nazwa bazowa to cała nazwa pliku (wraz z katalogiem) minus tekst po i
łącznie z ostatnim okresem. Np. „$(nazwa bazowa mójplik/wersja-1.0-moduł.c)” to
„mój plik/moduł wersji 1.0”

reż nazwy plików
Wyodrębnia część katalogową każdego pliku z listy nazw plików, łącznie z końcówką
ciąć. Zwraca „./”, jeśli w nazwie pliku nie ma katalogu.

dir_noslash filename
To samo co „$(dir )” z tą różnicą, że nie zwraca końcowego ukośnika.

plik podst wzór, zastąpić, słowa
Wykonaj podstawienie wzorca w nazwach plików. Różni się to od patsubst pod tym względem
będzie działać poprawnie, gdy zostaną podane alternatywne nazwy katalogów (o ile
poprzedzają znak procentu). Na przykład,

$(filesubst ./src/%.c, %.o, $(wildcard src/*.c))

będzie działać z filesubst, ale nie z patsubst.

filtr_katalogi_wyjściowe nazwy plików
Zwraca wszystkie nazwy plików, które nie odnoszą się do katalogów.

Znajdź plik Nazwa pliku, ścieżka
Znajduje plik w określonej ścieżce lub w zmiennej środowiskowej PATH, jeśli nic tam nie ma
określony. Może to być przydatne do wyszukiwania plików binarnych lub plików dołączanych. Na przykład,

TCL_INCLUDE := -I$(dir_noslash $(znajdźplik tcl.h, \
/usr/local/stow/tcl-8.4.5-nothread/include \
/usr/include/tcl8.4 /usr/include/tcl \
/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

Spowoduje to zlokalizowanie pliku tcl.h przeszukując wszystkie powyższe katalogi. Absolut
zwracana jest ścieżka do pliku. Następnie „$(dir_noslash )” wyodrębnia ten katalog i to
jest umieszczany w ścieżce dołączania.

znajdź_program Nazwa
Zwróć pierwszy program na liście, który można znaleźć w PATH. Jest to przydatne
gdy istnieje wiele równoważnych programów, których można użyć, a Ty po prostu chcesz
wybierz jeden z nich. Na przykład tutaj jest domyślna definicja kilku wspólnych
zmienne, które dostarcza makepp, jeśli nie umieścisz ich w pliku makefile:

CC = $(find_program gcc egcc pgcc c89 cc) # i więcej, w zależności od komputera
F77 = $(znajdź_program f77 g77 fort77)
CXX = $(znajdź_program g++ c++ pg++ cxx CC aCC)

Jeśli żaden z programów nie zostanie znaleziony, „$(find_program )” zwraca ciąg znaków „nie znaleziono” i
rejestruje to, czego nie znaleziono. Zwykle nie skutkuje to funkcjonalnym plikiem makefile, ale tak
będzie zazwyczaj powodować lepsze komunikaty o błędach. Na przykład, jeśli zrobisz coś takiego
to:

%.o: %.c
$(CC) $(wejścia) -o $(wyjścia)

i makepp nie może znaleźć kompilatora C na powyższej liście, zastąpi go not-found.
W przeciwnym razie powłoka podjęłaby próbę wykonania pliku źródłowego, co spowodowałoby błąd
wiadomość może być naprawdę dziwna.

znajdź_w górę filename
Wyszukuje plik o podanej nazwie w katalogu ., .., ../..,../../..Itp.,
do momentu znalezienia pliku lub osiągnięcia katalogu głównego lub zlokalizowania katalogu
w innym systemie plików. (Ten ostatni wymóg ma na celu zapobieganie problemom z
automounters lub zawieszone sieciowe systemy plików.) Jeśli masz plik Plik rootMakepp, to znaczy również
bariera uniemożliwiająca szukanie wyżej.

Na przykład, jeśli masz projekt z wieloma poziomami podkatalogów, możesz
dołącz ten wspólny fragment do wszystkich plików makefile (np. używając opcji „include”
oświadczenie):

TOP_LEVEL_INCLUDE_DIR := $(find_upwards obejmuje)
# Wyszukuje katalog zawierający plik
# zawiera podkatalog.

%.o: %.c
$(CC) $(CFLAGS) -I$(TOP_LEVEL_INCLUDE_DIR) -c $(wejście) -o $(wyjście)

Innym problemem, który może pomóc rozwiązać „find_upwards”, jest zlokalizowanie katalogu najwyższego poziomu
budowy. Często przydatne jest zdefiniowanie zmiennej w następujący sposób:

DO GÓRY := ../../..

jeśli masz jakieś ważne informacje znajdujące się tylko w katalogu najwyższego poziomu. Ale
jest to trudne do utrzymania, ponieważ liczba „..” jest różna dla różnych poziomów
drzewa katalogów. Zamiast tego możesz użyć „find_upwards”, aby zlokalizować plik, który jest
wiadomo, że jest obecny tylko w katalogu najwyższego poziomu. Załóżmy na przykład, że
plik „LICENCJA” znajduje się wyłącznie w katalogu najwyższego poziomu. Następnie możesz zrobić to:

TOP := $(dir_noslash $(find_upwards LICENCJA))

„$(find_upwards LICENSE)” zwraca pełną ścieżkę pliku licencji;
„$(dir_noslash ...)” usuwa nazwę pliku, zwracając jedynie katalog.

(Zauważ, że instrukcja „include” automatycznie wyszukuje pliki w górę, więc tam
nie ma potrzeby robić czegoś takiego:

uwzględnij $(find_upwards top_level_rules.mk)

Zamiast tego możesz po prostu to zrobić

Dołącz plik top_level_rules.mk

i będzie działać równie dobrze.)

Jeśli plik nie zostanie znaleziony, „find_upwards” przerwie kompilację i wyświetli komunikat o błędzie.

Jeśli określisz więcej niż jeden plik, find_upwards wyszuka pierwszy
drugi i tak dalej. Innymi słowy,

$(znajdź_upwards plik1 plik2)

odpowiada

$(znajdź plik w górę1) $(znajdź plik w górę2)

Jeśli chcesz wyszukać którykolwiek z plików, użyj zamiast tego polecenia „find_first_upwards”.

znajdź_pierwszy_w górę file1 file2 ...
Ta funkcja zachowuje się jak „find_upwards”, z tą różnicą, że zwraca pierwszy dowolny plik
pliki na znalezionej liście. W szczególności sprawdza bieżący katalog
dowolny z plików na liście i zwraca pierwszy plik, który istnieje lub można go zbudować.
Jeśli żaden z plików nie istnieje lub nie można go utworzyć w tym katalogu, sprawdza .., następnie
../..itd., aż dotrze do katalogu głównego lub katalogu, który jest
znajduje się w innym systemie plików.

pierwszy_dostępny file1 file2 ...
Zwróć pierwszy plik na liście, który istnieje lub można go zbudować. Może się to przydać
dostosowywanie plików makefile do pracy na kilku różnych maszynach lub sieciach, gdzie
ważne pliki mogą znajdować się w różnych miejscach. Oto na przykład linia z
jeden z moich plików makefile:

TCL_LIB = $(pierwszy_dostępny \
/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so \
/usr/lib/libtcl8.4.so /usr/lib/libtcl.so \
/net/na1/tcl8.4a3/lib/libtcl8.4.a \
/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

Ta linia sprawdzi bibliotekę Tcl we wszystkich powyższych miejscach, zatrzymując się na
pierwszy, jaki znajdzie. Polecenie link następnie zawiera $(TCL_LIB), więc otrzymujemy
odpowiednią bibliotekę Tcl.

infer_linker file1 file2 ...
Mając listę plików obiektowych najpierw je zbuduj jeśli jeszcze ich nie było. Następnie znajdź
niezależnie od tego, czy zależą od źródła Fortran, C++ czy C i zwracają odpowiednie
kompilator (który lepiej wie, jak łączyć niż „ld”).

wnioskować_obiekty file1 file2 ... wzorzec
$(infer_objects obiekt1.o obiekt2.o, *.o)

Jeśli używasz standardowych konwencji dotyczących nazw plików nagłówkowych, makepp jest w stanie to zrobić
zgadywanie, które pliki „.o” lub „.lo” muszą być połączone z twoim programem. Używam tego do
wybierz pliki z katalogu biblioteki, który zawiera moduły używane w wielu różnych
programy. Zamiast tworzyć plik biblioteki „.a” i zlecać linkerowi wybieranie pliku
odpowiednich modułów, makepp może wybrać dla Ciebie odpowiednie moduły. Tylko w ten sposób
odpowiednie moduły zostaną skompilowane.

Algorytm Makeppa służący do wnioskowania o zależnościach obiektów zależy od przyjętej konwencji
implementacja wszystkich klas lub funkcji zdefiniowanych w pliku nagłówkowym „xyz.h”.
skompilowany do pliku obiektowego o nazwie „xyz.o” (lub „xyz.lo”). Zatem algorytm Makeppa dla
wnioskowanie o zależnościach obiektów zaczyna się od jednego lub kilku obiektów, o których wiemy, że muszą być
połączone z programem. Sprawdza, które pliki zostały dołączone z „#include”.
tych źródeł i próbuje znaleźć odpowiednie pliki obiektowe dla każdego z nich
akta.

Na liście zależności programu należy wspomnieć o „$(infer_objects)”, np
to:

mójprog: $(infer_objects main.o inny_obiekt.o, \
**/*.o /inne/library/dirs/**/*.o)
$(CXX) $(wejścia) -o $(wyjścia) $(LIBS)

Funkcja „$(infer_objects)” przyjmuje dwa argumenty (oddzielone przecinkiem, jak pokazano).
Pierwszy to jeden lub kilka plików obiektowych, o których wiadomo, że są wymagane (znaki wieloznaczne to
tu dopuszczalne). Druga to lista możliwych obiektów (zwykle użyłbyś a
symbol wieloznaczny tutaj), do którego można w razie potrzeby dołączyć link. Wartość zwracana z this
funkcja jest listą zawierającą najpierw wszystkie obiekty z pierwszego argumentu, oraz
następnie po nich wszystkie dodatkowe obiekty zawarte w drugim argumencie
które są wymagane przez obiekty w pierwszym argumencie.

Załóżmy na przykład, że „main.o” pochodzi z „main.cpp”, który zawiera „moja_klasa.h”.
„$(infer_objects)” szuka plików o nazwie „my_class.o”. Jeśli dokładnie taki
plik zostanie znaleziony, zostanie dodany do listy. (Jeśli zostaną znalezione dwa pliki obiektowe „my_class.o”.
w różnych katalogach wypisywany jest komunikat ostrzegawczy.) Również „infer_objects”.
sprawdza plik „my_class.cpp”, aby zobaczyć, co zawiera i jakie są dodatkowe pliki obiektowe
ukryty.

mktemp
mktemp prefiks
mktemp prefiksXXX
mktemp /
Zwraca nieprzewidywalną tymczasową nazwę pliku, która obecnie nie istnieje. Bez nazwy
wskazanie tego samego pliku jest zwracane dwukrotnie, nawet z różnymi ścieżkami względnymi,
w jednym przebiegu makepp (z wyjątkiem prawdopodobnie tradycyjnego makeppu rekurencyjnego lub jeśli Perl
kod działający w ramach akcji reguły wywołuje „f_mktemp”). Na koniec makepp uruchom all
pliki zwrócone przez tę funkcję są usuwane, jeśli istnieją (ponownie z wyjątkiem tych
zwracane przez tę funkcję w kodzie Perla działającym w ramach reguły).

Dowolna liczba wielkich liter „X” na końcu argumentu jest zastępowana odpowiednią liczbą
losowe litery i cyfry. Im ich więcej, tym mniejsze prawdopodobieństwo kolizji
z innymi procesami, więc jeśli podasz przedrostek taki jak „/tmp/abc.", powinieneś mieć dość
„X”. Jeżeli jest więcej niż jeden X, pierwszy znak pochodzi z identyfikatora procesu. Jeśli
nie ma ich, to tak, jakby było ich dziesięć, co podobno wystarczy (8.4e17
możliwości lub 3.7e15 w systemie Windows). Jeśli nie ma argumentu, domyślnym prefiksem jest
"tmp." w bieżącym katalogu.

Pamiętaj, że nie chcesz nadawać takiej nazwy jak cele reguł i zależności. The
wynik byłby poprawny, ale zostałby odtworzony za każdym razem, gdy uruchomisz makepp.

Ponadto, ponieważ zawsze jest inaczej, powinieneś używać tego w akcji reguły tylko wtedy, gdy używasz
„:build_check ignorowanie_akcji”:

TMPFILE ;= $(mktemp) wywołanie nr 1; „=” oznaczałoby 3 połączenia: 3 pliki
Liczba A Liczba B: :build_check ignorowanie_akcji
produkuj-jako-i-b >$(plik TMP)
&grep -c /A/ $(TMPFILE) -o Liczba A
&grep -c /B/ $(TMPFILE) -o Liczba B

Lub powinieneś go wyeksportować i pozwolić Shellowi go ocenić:

eksportuj PLIK TMP ;= $(mktemp)
Liczba A Liczba B:
produce-As-and-Bs >$$TMPFILE # makepp nie widzi wartości var
fgrep -c A $$TMPFILE >liczba A
fgrep -c B $$TMPFILE >liczba B

Ostatnia forma powtarza poprzednią wartość zwracaną, więc można jej użyć w regule wzorca:

%.x: %.y
&grep foo $(wejście) -o $(mktemp)
&sed bar $(mktemp /) -o $(wyjście) # Działa na wyjściu &grep

nie reż nazwy plików
Zwraca niekatalogową część nazw plików, tj. wszystko po ostatnim
ukośnik, jeśli istnieje, lub cała nazwa pliku w przeciwnym razie.

tylko_generowane nazwy plików
Zwraca tylko te nazwy plików na liście, które zostały wygenerowane przez makepp, a nie od tego czasu
zmodyfikowany, zgodnie z plikiem informacyjnym kompilacji.

Ta funkcja jest przydatna w czystych regułach docelowych (chociaż oczywiście „makeppclean” to
preferowany wariant):

$(fałszywie czysty):
&rm -f $(tylko_wygenerowane **/*)

only_nontargets nazwy plików
Zwraca tylko te nazwy plików na liście, które nie są celami żadnej reguły (albo
reguły jawne lub wzorcowe). Możesz określić symbol wieloznaczny (zobacz „$(wildcard )”
funkcja, aby uzyskać więcej informacji na temat symboli wieloznacznych makepp). Można to wykorzystać do wygenerowania pliku
cel dystrybucji, na przykład:

.PHONY: dystrybucja

dystrybucja:
&mkdir nasz_produkt-$(WERSJA)
&cp $(odfiltruj%~, $(only_nontargets *)) nasz_produkt-$(WERSJA)
tar cf - nasz_produkt-$(WERSJA) | gzip -9c > nasz_produkt-$(WERSJA).tar.gz

W tym przypadku „$(only_nontargets *)” zwraca każdy plik w bieżącym katalogu
nie jest to celem jakiejś reguły. „$(filter_out %~, ...)” usuwa edytor
kopie zapasowe.

Podobnie do „only_targets” (patrz wyżej), „only_nontargets” wie tylko o celach, które
zostały już zdefiniowane. Jest to problem tylko wtedy, gdy używasz go do definiowania zmiennych
z przypisaniem „:="; jeśli użyjesz go na liście zależności lub w treści pliku
reguła, wszystkie inne reguły będą już widoczne.

tylko_nieaktualny nazwy plików
Zwraca tylko te nazwy plików na liście, które zostały wygenerowane przez makepp, a nie od tego czasu
zmodyfikowane, zgodnie z plikiem informacyjnym kompilacji, ale nie są już celem żadnej reguły.

Ta funkcja jest przydatna, aby upewnić się, że nie ma zależności od takich plików,
bez wymuszania czystej kompilacji wszystkich celów:

$(fałszywe kolor):
&rm -f $(tylko_przestarzałe **/*)

Właściwie prawdopodobnie lepiej będzie napisać skrypt, który wywoła makepp w celu wygenerowania
listę nieaktualnych plików, a następnie poproś skrypt o usunięcie wszystkich wymienionych plików
nie są obecnie pod kontrolą źródła, na wypadek gdyby wygenerowany plik stał się źródłem
plik. Makepp nie ma wbudowanej takiej funkcji, ponieważ makepp jest (i prawdopodobnie
powinien pozostać) agnostykiem w kwestii kontroli źródła.

tylko_cele nazwy plików
Zwraca tylko te nazwy plików z listy, które faktycznie są celami jakiejś reguły
(albo reguły jawne, albo reguły wzorcowe). Możesz określić symbole wieloznaczne (w tym makepp
specjalny symbol wieloznaczny „**”) w nazwach plików. (Więcej informacji znajdziesz w funkcji „$(wildcard )”.
Detale. Można to wykorzystać do czystego celu, na przykład:

.PHONY: czysty

czysty:
&rm -f $(tylko_cele *)

Teraz, jeśli wpiszesz „makepp clean”, usunie wszystko, co umie zbudować. Ale
nie twórz czystego celu, zamiast tego użyj „makeppclean”!

Innym miejscem, w którym może być przydatne, jest unikanie włączania nieaktualnych .o pliki w Twoim
zbudować. Na przykład, jeśli zbudujesz taką bibliotekę:

mylib.a: *.o
&rm -f $(wyjście)
$(AR) cr $(wyjście) $(wejścia)

a następnie usuwasz niektóre pliki źródłowe, ale zapominasz o usunięciu odpowiednich .o plików,
dotychczasowy .o pliki nadal będą dostępne. Oznacza to, że nadal będą one uwzględnione
biblioteki, mimo że nie są już przydatne. Jeśli zmodyfikujesz swój
zasada taka:

mylib.a: $(only_targets *.o)
&rm -f $(wyjście)
$(AR) cr $(wyjście) $(wejścia)

wtedy ten problem nie będzie występował.

Należy pamiętać, że odnosi się to tylko do plików, o których wiadomo, że są celami at dotychczasowy czas ty
odwołać się „tylko cele”. Jeśli w zależnościach lub akcjach pliku a
reguły, wówczas wszystkie możliwe cele będą znane, ponieważ zależności i akcje nie są znane
oceniane do momentu wykonania reguły. Jeśli jednak oceniasz, spróbuj to ocenić
wcześniej w pliku makefile ze zmienną „:=" taką jak ta:

WSZYSTKIE_CELE := $(tylko_cele *)

cel1: zależność1
działania

cel2: zależność2
działania

wtedy „only_targets” nie będzie wiedziało o kolejnych regułach.

Podobnie „only_targets” nie wie o celach utworzonych w plikach makefile
załadowany rekursywnym make. (Ale i tak nie powinieneś używać rekurencyjnego make; użyj
użyj instrukcji „load_makefile” lub zamiast tego użyj ukrytego ładowania pliku makefile.)

nazwa_pliku_względnego file1 file2 plik3[, ciąć]
Zwraca nazwę tych plików względem bieżącego katalogu (tego, w którym znajduje się plik
plik makefile jest obecny). Można tego również użyć do usunięcia niepotrzebnych plików „./” i innych śmieci
ścieżka:

KIERUNEK := .
PODKATALOG := ..
FNAME := $(DIR)/../innykatalog/$(SUBDIR)/pliki
X := $(względna nazwa_pliku $(FNAME))

If ciąć ma wartość true (zwykle 1), zwrócone nazwy plików na pewno będą zawierać ukośnik
w razie potrzeby dodając „./”, aby można było używać go jako nazwy wykonywalnej bez
martwiąc się, że ścieżka wyszukiwania poleceń zastąpi lokalizację katalogu.

Jeśli ścieżka prowadzi przez katalog główny, katalog nadrzędny albo katalogu domowego, albo
„$(ROOT)” systemu kompilacji lub w systemie Windows katalog główny dysku (w zależności od
środowiska, dzieje się tak również w przypadku /cygdrive/c or /c), będzie to ścieżka bezwzględna
zamiast tego wrócił.

względny_do file1 file2 plik3[, informator]
Zwraca nazwę tych plików względem określonego katalogu. To jest
zazwyczaj przydatne, gdy z jakiegokolwiek powodu musisz wykonać polecenie z pliku
inny katalog (domyślny katalog bieżący):

source_backup.tar:
cd .. && tar cf $(względne_do $(wyjście), ..) $(względne_do ., ..)

przyrostek nazwy...
Wyodrębnia przyrostek każdej nazwy pliku w nazwach. Jeśli nazwa pliku zawiera kropkę,
przyrostkiem jest wszystko, zaczynając od ostatniej kropki. W przeciwnym razie przyrostek to
pusta struna. Często oznacza to, że wynik będzie pusty, jeśli nazwy nie są,
a jeśli nazwy zawierają wiele nazw plików, wynik może zawierać mniej nazw plików.

Na przykład,

$(sufiks src/foo.c src-1.0/bar.c hacki)

daje wynik „.c .c”.

tymczasowy słowa
Poinformuj makepp, że określone cele mogą zostać usunięte przez generującą regułę
ich. Podobny do „fałszywego”, z tą różnicą, że makepp oczekuje, że będzie to prawdziwy plik o tej nazwie
reguła może mieć wpływ na wolę. Reguła nie jest wykonywana, jeśli jest tylko tymczasowa
cele są nieaktualne.

wieloznaczny wzorzec
Zwraca posortowane nazwy wszystkich istniejących plików pasujących do podanego wzorca
pliki, które jeszcze nie istnieją, ale można je zbudować w oparciu o reguły znane makeppowi
mniej więcej w momencie, gdy ocenia wyrażenie. W tym ostatnim punkcie jest inaczej
z symboli wieloznacznych wejściowych reguł, które mają zastosowanie nawet do plików utworzonych przez reguły znalezione później.

Makepp obsługuje wszystkie zwykłe symbole wieloznaczne powłoki ("*", "?" i "[]"). Posiada również
symbol wieloznaczny „**”, który pasuje do dowolnej liczby pośrednich katalogów. (Ten pomysł był
skradziony z zsh.) Na przykład „**/*.c” pasuje do wszystkich .c pliki w całym źródle
drzewo. „objects/**/*.o” pasuje do wszystkich .o pliki zawarte gdziekolwiek w pliku
podkatalog obiekty lub którykolwiek z jego podkatalogów lub którykolwiek z ich podkatalogów. The
Symbol wieloznaczny „**” nie będzie podążał za miękkimi linkami do katalogów na żadnym poziomie i tak też nie będzie
spróbuj wejść do katalogów, które istnieją, ale nie można ich odczytać. Również pliki i
katalogi, które istnieją, ale nie mogą zostać odczytane, nie zostaną zwrócone przez „$(wildcard )”.

sznur Funkcje
dodajprzedrostek prefiks, słowa
Dołącza ciąg prefiksu do każdego słowa. Dotyczy to głównie wersji GNU
zgodność; używając rozwinięcia w stylu rc, można to zrobić w bardziej czytelny sposób
lubię to:

MODUŁY := abcd
X_OLD_STYLE := $(addprefix $(OBJDIR)/, $(addsuffix .o, $(MODULES)))
X_NEW_STYLE := $(OBJDIR)/$(MODULES).o # Czy to nie jest łatwiejsze do odczytania?

przyrostek add przyrostek, słowa
Dołącza ciąg sufiksu do każdego słowa. Dotyczy to głównie wersji GNU
zgodność; używając rozwinięcia w stylu rc, można to zrobić w bardziej czytelny sposób
lubię to:

X_OLD_STYLE := $(addsuffix .o, $(MODULES))
X_NEW_STYLE := $(MODUŁY).o

wezwanie zmienny[, słowa]...
Funkcja „call” jest wyjątkowa pod tym względem, że można jej używać do uwzględnienia zmienna jak
funkcja sparametryzowana. Można przypisać złożone wyrażenie do zmienna I użyć
„call”, aby rozszerzyć jego zawartość do różnych wartości sparametryzowanych przez słowa później. W
inne systemy marki, zmienna używana głównie w celu rozbudowy
„zadzwoń” to tzw makro.

Podczas rozwijania makra zmienne tymczasowe $1, $2, „…” odnoszą się do
argumenty podawane do „call” podczas jego wywoływania. Zmienna $0 zostanie rozszerzony do
nazwa makra (tj zmienna) to „zaproszenie” obecnie się rozwija.

Nie ma limitu, z iloma argumentami makro może zostać „wywołane” ani z iloma
parametry, jakich może oczekiwać makro. Jeśli przekażesz więcej argumentów do „call” jako makro
zajdzie taka potrzeba, wszystkie przekraczające argumenty zostaną odrzucone. Jeśli przekażesz mniej argumentów niż a
makro oczekuje, wszystkie przekraczające parametry zwijają się do pustego ciągu.

Najpierw prosty przykład:

reszta = $(lista słów 2, $(słowa $(1)),$(1))
lista = ABCDE
alepierwszy := $(reszta połączenia,$(lista))

Tutaj zmienna „$(butfirst)” będzie zawierać listę „BCDE”.

A teraz bardziej złożony przykład pokazujący, co jest możliwe:

reszta = $(lista słów 2,$(słowa $(1)),${1})
mymap = $(jeśli $2,$(zadzwoń 1 $,$(pierwsze słowo $2)) $(zadzwoń 0 $,1$,$(połącz resztę,2$)))
downcase = ${makeperl lc("$1")}

UCWORDS = WSZYSTKIE TE SŁOWA SĄ WIELKIE
DCWORDS := $(wywołaj moją mapę,małe litery,$(UCWORDS))

Teraz „$(DCWORDS)” zawiera „wszystkie te słowa są pisane wielkimi literami”. Swoją drogą: nie
różnica, czy uzyskujemy dostęp do argumentów poprzez $1, „${1}” or „$(1)” w makrze.

Możesz bezpośrednio użyć zmiennej tak, jakby była funkcją, jeśli jej nie ma
funkcję tego imienia. Jest to wewnętrznie konwertowane na „call”, więc tak jest
równowartość:

dyskusja = 0 $ zamieniło się w 1 $ 2 $.
direct = $(dyskusja,argument)
o nazwie = $(wywołaj dyskusję,argument,argument)

Może wydawać się dyskusyjne, czy „$[call]” powinno również rozszerzać „$[]” makra
wyrażeń lub czy funkcja powinna zawsze robić to samo, niezależnie od sposobu
jest nazywany. Wybrano tę drugą opcję, ponieważ przy normalnej składni make tak by było
niemożliwe jest umieszczenie „$[1], $[2]…” w zmiennej (zostałyby one zastąpione niczym,
zanim w ogóle nastąpi przypisanie.) Zatem, jeśli masz makro do definiowania a
regułę, chcesz, aby wyrażenia takie jak „$(wyjście)” były widoczne podczas analizowania reguły, więc
musisz chronić je przed „wezwaniem”:

zdefiniuj moją regułę
2 dolary: 1 dolar
moje polecenie $$(wejście) -o $$(wyjście)
koniec
$[moja reguła moje wejście, moje wyjście]

filtrować wzory, słowa
Zwraca wszystkie słowa z listy pasujące do wzorców. Wzory mogą być po prostu inne
słowa lub symbole wieloznaczne w nazwach plików (tj. rozpoznawane są „*”, „?” i „[az]”) lub mogą
mieć znak „%”, co oznacza dopasowanie dowolnego ciągu w tym miejscu (tak samo jak „*”).

odfiltrować wzory, słowa
Zwraca wszystkie słowa z listy, które nie pasują do wzorców. Wzory mogą po prostu być
inne słowa lub symbole wieloznaczne w nazwach plików (tj. rozpoznawane są „*”, „?” i „[az]”), lub
mogą mieć znak „%”, co oznacza dopasowanie dowolnego ciągu w tym miejscu (tak samo jak
„*”).

Na przykład:

libproduction.a: $(test_filter_*, $(znak wieloznaczny *.o))

włoży wszystko .o pliki, które istnieją lub które można zbudować, z wyjątkiem tych rozpoczynających się od test_,
najnowszych libproduction.a.

szukany ciąg odnaleźć, in
Powrót odnaleźć, jeśli jest podciągiem in.

pierwsze słowo słowa
Zwróć pierwsze słowo.

mapa słowa, kod perl
makemapa słowa, kod perl
Podobnie jak w przypadku mapy Perla, obowiązuje kod perl do każdego słowa po kolei i zwraca
wyniki. Pierwszy wariant to zwykły kod Perla, podczas gdy drugi wariant najpierw przechodzi
kod Perlcode poprzez rozwinięcie zmiennej w stylu Make. W obu przypadkach słowa są rozwinięte
przypadki.

Słowa znajdują się w $_ i są zwracane, chyba że zdefiniujesz $_. To jest przeznaczone dla
modyfikacje, które nie są łatwo obsługiwane przez „patsubst”. Tylko pierwszy przecinek jest separatorem,
wszelkie inne są uważane za część kod perl.

# Zmień słowa. Podwójne nawiasy, aby umożliwić nawiasy w kodzie Perlcode, lub użyj ${}:
X = $((mapa $(WARTOŚCI), s/(.+)-(.+)/2$-1$/))
# Możesz użyć wyrażeń make, ale wtedy musisz użyć $$ dla Perla $:
Y = $(makemap $(VALUES), tr/$(OLDCHARS)/$(NEWCHARS)/ lub $$_ = 'nie powiodło się')
# Możesz eliminować kandydatów:
Y = $(mapa $(WARTOŚCI), undef $_ jeśli /nie_dobre/)

przystąpić słowa1, słowa2
Wykonaj połączenie parami pierwszych i drugich słów.

subst wzór, zastąpić, słowa
Wykonuje podstawienie każdego słowa na liście słów. Znak „%” pasuje do dowolnego
strunowy. Najlepiej zilustruje to przykład:

OBJS = $(patsubst %.c, katalog_obiektu/%.o, $(C_SOURCES))

pobiera każdy plik w C_SOURCES i zwraca nazwę pliku obiektowego w katalogu_obiektu.
Czasami bardziej zwięzłe jest użycie odniesienia do podstawienia, np. powyższe mogłoby
zostały napisane jako

OBJS = $(C_SOURCES:%.c=katalog_obiektów/%.o)

rodzaj word1 word2 word3 ...
Sortuje słowa w porządku leksykalnym i usuwa duplikaty.

rozebrać się ciąg
Usuwa początkowe i końcowe białe znaki z ciągu i zastępuje każdy element wewnętrzny
sekwencja jednego lub większej liczby białych znaków z pojedynczą spacją. Zatem „$(pasek ab
c)” daje w wyniku „abc”.

rzeczownik od, do, tekstu
Wykonuje zamianę tekstową tekstu tekstowego: każde wystąpienie from jest zastępowane
do. Wynik zastępuje wywołanie funkcji. Na przykład,

$(subst ee,EE,stopy na ulicy)

zastępuje ciąg „stopy na ulicy”.

słowo n, tekst
Zwraca nsłowo XNUMX. Uprawnione wartości n zacznij od 1 na początku
lub wstecz od -1 na końcu. Jeśli n jest większa niż liczba słów w XNUMXThe
wartość jest pusta.

Lista słów lista indeksów, słowa
Lista słów pierwszy indeks, ostatni indeks, słowa
W pierwszym formularzu podajesz listę indeksów (licząc od 1 na początku lub
wstecz od -1 na końcu), aby wybrać żądane słowa. W drugiej formie ty
określ zakres słów, które chcesz zwrócić.

słowa XNUMX
Zwraca liczbę słów w XNUMX.

Różne Funkcje
foreach zmienna, lista, tekst
Pierwsze dwa argumenty, było i podstęp, są rozwijane, zanim zrobi się cokolwiek innego; notatka
że ostatni argument, tekst, nie jest rozwijany w tym samym czasie. Następnie dla każdego słowa
rozwinięta wartość listy, ustawiana jest zmienna nazwana rozwiniętą wartością var
to słowo, a tekst jest rozwinięty. Prawdopodobnie tekst zawiera odniesienia do tej zmiennej,
więc jego ekspansja będzie za każdym razem inna.

Ten prosty przykład ustawia zmienną pliki do listy wszystkich plików w pliku
katalogi na liście dirs:

katalogi := abcd
pliki := $(katalog foreach, $(katalogi), $(znak wieloznaczny $(katalog)/*))

Tutaj tekst to „$(symbol wieloznaczny $(dir)/*)”. Pierwsze powtórzenie powoduje znalezienie wartości „a” dla katalogu,
więc daje taki sam wynik jak "$(symbol wieloznaczny a/*)"; powoduje drugie powtórzenie
wynik "$(symbol wieloznaczny b/*)"; i trzeci, „$(symbol wieloznaczny c/*)”.

Ten przykład ma taki sam wynik (z wyjątkiem ustawienia „katalogów”) jak następujący przykład:

pliki := $(znak wieloznaczny a/* b/* c/* d/*)

Gdy tekst jest skomplikowany, możesz poprawić czytelność, nadając mu nazwę z rozszerzeniem
dodatkowa zmienna:

find_files = $(symbol wieloznaczny $(katalog)/*)
katalogi := abcd
pliki := $(katalog foreach, $(katalogi), $(pliki wyszukiwania))

Tutaj używamy zmiennej find_files w ten sposób. Używamy zwykłego „=” do zdefiniowania a
zmienna rozwijająca się rekurencyjnie, tak że jej wartość zawiera rzeczywiste wywołanie funkcji
zostać ponownie rozszerzony pod kontrolą foreach; po prostu rozwinięta zmienna nie wystarczyłaby,
ponieważ symbol wieloznaczny zostanie wywołany tylko raz w momencie definiowania plików find_files.

Uwaga: nie myl tego ze zmienną specjalną „$(foreach)”.

Informacje XNUMX
ostrzeżenie XNUMX
błąd XNUMX
Tekst wyjściowy zwracający nic. Pierwszy idzie do STDOUT, drugi do STDERR,
trzeci dodatkowo przerywa przetwarzanie.

kompilacja wstępna cele
robić cele
Zwraca dosłownie swój argument, ale najpierw tworzy wszystkie wymienione pliki. Jest to przydatne
kiedy dany plik jest potrzebny podczas oceny wyrażenia make. To zazwyczaj się zdarza
kiedy masz kompilację, w której zestaw zaangażowanych plików jest obliczany przez jakąś powłokę
polecenia. Na przykład,

lista_plików:
# polecenia powłoki do obliczenia listy plików do umieszczenia w programie

mój_program: $(&cat $(lista_plików kompilacji wstępnej))

Jeśli potrzebujesz listy w więcej niż jednej regule, bardziej efektywne byłoby użycie reguły
rozwiń najwyżej raz zmienną:

lista_plików ;= $(&cat $(wstępna kompilacja lista_plików))

mój_program1: ao $(lista_plików)

mój_program2: bo $(lista_plików)

Jeśli zamiast tego podałeś tylko „$(&cat lista_plików)”, makepp nie wymusiłby
lista_plików, aby była aktualna przed wykonaniem polecenia powłoki. Używanie „$(prekompilacja)”
jest najlepszym sposobem na rozwiązanie tego problemu. Możesz ulec pokusie, aby spróbować innych rzeczy, np
to:

mój_program: lista_plików $(lista_plików&cat)

ale to nie zadziała, ponieważ „$(&cat file_list)” jest oceniane przed próbą makepp
zbuduj „listę_plików”.

only_phony_targets Nazwy
Zwraca tylko te nazwy na liście, które są fałszywymi celami jakiejś reguły (albo
reguły jawne lub wzorcowe). Możesz określić symbole wieloznaczne (w tym znak specjalny makepp
symbol wieloznaczny „**”) w nazwach plików. (Więcej szczegółów można znaleźć w funkcji „$(wildcard )”.
Można to wykorzystać do grupowania celów, na przykład:

$(fałszywe testy): $(only_phony_targets */**/testy)

pochodzenie zmienna
Podana nazwa zmiennej informuje, skąd pochodzi jej wartość.

Perl kod perl
makeperl kod perl
Ocenia kod Perlcode w bloku i zwraca wynik. Pierwszy wariant to zwykły Perl
code, podczas gdy drugi wariant najpierw przekazuje kod perlcode przez zmienną Make-style
ekspansja.

Należy pamiętać, że podobnie jak w przypadku wszystkich funkcji, zastosowany ogranicznik funkcji może nie pojawiać się w obrębie
kod perlcode poza ciągami znaków w pojedynczych lub podwójnych cudzysłowach. Ale możesz to podwoić, jak w
ostatni przykład:

ZMIANA = 1
VAR1 = ${perl ($VAR + 1) * 3}
VAR2 = $(perl do { $VAR *= 3; zwróć $VAR + 1 } jeśli $VAR)
VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # jeden Make var i jeden Perl var
VAR = $((perl if( ... ) { ... }))

fałszywy słowa
Wskazuje, że lista słów jest w rzeczywistości fałszywymi celami i zwraca listę
cele. Ma być używany w ten sposób:

$(wszystko fałszywe): mój_program

$(fałszywie czysty):
&rm -f *.o mój_program

Możesz także zadeklarować jeden lub więcej celów jako fałszywych za pomocą takiej linii w dowolnym miejscu
twój plik makefile:

.PHONY: wszystko czyste

XNUMX
Wysyła tekst i zwraca go. Jest to przydatne głównie do debugowania, jeśli tego nie robisz
zrozumieć, dlaczego podstawienie zmiennych daje taki skutek. Na przykład,

XYZ := $(print $(patsubst %.c, %o, $(SOURCE_FILES)))

wydrukuje wynik wywołania „patsubst”.

XYZ := $(patsubst %.c, %o, $(print $(SOURCE_FILES)))

wypisze ostatni argument wywołania „patsubst”.

powłoka polecenie powłoki
Zwraca dane wyjściowe danego polecenia powłoki, przy czym znaki nowej linii są zastępowane spacjami.

Należy pamiętać, że podobnie jak w przypadku wszystkich funkcji, zastosowany ogranicznik funkcji może nie pojawiać się w obrębie
polecenie powłoki poza ciągami znaków w pojedynczych lub podwójnych cudzysłowach. Ale możesz to podwoić
jak w drugim przykładzie:

date = $(data powłoki) # lepiej: $(lokalny czas skalarny Perla)
VAR = ${{powłoka f() { echo cześć; }; F}}

xargs polecenie,argumenty[,przyrostek[,długość]]
Zwraca listę poleceń rozdzielonych znakami nowej linii, z których każde zaczyna się od określonego
polecenie i zakończ jak największą liczbą elementów listy, bez przechodzenia przez nią
długość (domyślnie 1000) znaków.

Ma to na celu uniknięcie przekroczenia limitu długości poleceń w systemie.
Na przykład, jeśli istnieje wiele wygenerowanych plików, prawdopodobnie chciałbyś, aby plik
clean target (którego nie powinieneś mieć, ponieważ „makeppclean” jest bardziej wydajny).
wyglądać mniej więcej tak:

$(fałszywie czysty):
$(xargs $(RM), $(tylko_cele **/*))

Ma to również ten skutek uboczny, że w przypadku listy nie jest generowane żadne polecenie
zdarza się, że jest pusty. Ale w tym przypadku lepiej byłoby użyć wbudowanego &rm,
ponieważ argumenty wbudowanych poleceń są ograniczone jedynie pamięcią Perla:

$(fałszywie czysty):
&rm -f $(tylko_cele **/*)

Jeśli zostanie podany trzeci argument, będzie on używany do dodania każdego polecenia. To jest
przydatne do określania przekierowań, np. (chociaż i tutaj znowu pomogłoby &echo):

oczywisty:
&rm -f $@
&dotknij $@
$(xargs echo, $(only_nontargets **/*), >> $@)

Część tej dokumentacji jest oparta na dokumentacji GNU make.

Należy pamiętać, że jeśli podczas inicjalizacji pliku makefile zostanie wywołana funkcja, np
rozszerzenie zmiennych eksportu, komunikaty o błędach lub ostrzeżeniach zgłoszą wiersz o numerze 0.

Użyj makepp_functions online, korzystając z usług onworks.net


Darmowe serwery i stacje robocze

Pobierz aplikacje Windows i Linux

Komendy systemu Linux

Ad