EnglezăFrancezăSpaniolă

Ad


Favicon OnWorks

makepp_functions - Online în cloud

Rulați makepp_functions în furnizorul de găzduire gratuit OnWorks prin Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

Aceasta este comanda makepp_functions care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS

PROGRAM:

NUME


makepp_functions -- Funcții în makepp

DESCRIERE


A: nume_fișier_absolut,
absolute_filename_nolink,
abspat,
addprefix,
adaugă sufix,
și, B: nume de bază, C: apel, D: este,
dir_noslash, E: eroare, F: filesubst,
filtru,
filtra,
filter_out_dirs,
Gaseste fisier,
find_first_upwards,
find_program,
găsește șirul,
găsi_în sus,
first_available,
primul cuvânt,
pentru fiecare, I: dacă,
daca e adevarat,
infer_linker,
infer_objects,
informații, J: a te alatura, M: face,
makemap,
Makeperl,
Hartă,
"mktemp", N: notdir, O: only_generated,
only_nontargets,
only_phony_targets,
only_stale,
only_targets,
sau,
origine, P: patsubst,
perl,
fals,
preconstruire,
imprimare, R: cale reală,
nume_fișier_relativ,
relativ_la, S: coajă,
fel,
bandă,
subst,
sufix, T: temporar, W: avertizare,
wildcard,
cuvânt,
listă de cuvinte,
cuvinte, X: xargs

Orice expresie de format „$(nume)”, unde „nume” nu este numele unei variabile, sau
„$(nume arg1 arg2 arg3)” este interpretat ca un apel de funcție. Numele poate conține litere,
subliniere sau cratime; pentru a evita confuzia, puteți folosi cratime sau liniuțe de subliniere
interschimbabil, deoarece cratimele interne sunt convertite în liniuțe de subliniere. Evaluând astfel
o expresie pur și simplu invocă o subrutină Perl. Dacă „nume” este precedat de „&”, rulează
comandă încorporată sau script-ul acelui nume în cadrul procesului makepp și returnează standardul
ieșire. Acest lucru necesită ca perl să fie construit pentru PerlIO. Dacă numele nu denumește o funcție
se transformă într-o invocare a chemării.

Ca și în cazul variabilelor, aveți posibilitatea de a alege „$(name ...)” sau „${name ...}”. Dacă doriți să
încorporați aceeași paranteză, trebuie împerecheat, celălalt nu contează: „$(nume
...(){..." sau "${name ...{}(...}". (Totuși, pentru map și perl, primul parante de închidere se termină
expresia.) Dublarea permite argumentelor să se întinde pe mai multe rânduri. Noile linii sunt
apoi tratate ca spații, cu excepția poate în „definire”. Există, de asemenea, sintaxa „$[nume ...]”
sau $[[name ...]], care este evaluat în timpul citirii fișierului make, înainte de a aplica regulile
si alte constructe.

Makepp are o serie de funcții încorporate care pot fi utile. Susține aproape toate
Funcțiile textuale ale GNU make (a se vedea documentația GNU make pentru detalii) și unele dintre ele
proprii. Puteți defini subrutinele Perl pentru a face orice doriți. Vezi declarația „sub”.
și secțiunea despre extinderea makepp pentru mai multe detalii.

Condiţional funcţii
și condiția1[,condiția2[,condiția3...]]
Funcția și oferă o funcționare și „scurtcircuit”. Fiecare argument este
extins, în ordine. Dacă un argument se extinde la un șir gol, procesarea se oprește și
rezultatul expansiunii este șirul gol. Dacă toate argumentele se extind la un non-
șir gol, atunci rezultatul expansiunii este extinderea ultimului argument.

if şir, rezultat-dacă-șir-nu-gol[, rezultat-dacă-șir-gol]
daca e adevarat şir, rezultat-dacă-șir-adevărat[, rezultat-dacă-șir-fals]
O alternativă la afirmațiile „ifeq”, etc. Dacă șirul nu este gol (adică,
condiția este adevărată), al doilea argument (clauza „atunci”) este returnat (după
expansiune variabilă); dacă șirul este gol, al treilea argument (clauza „else”) este
întors.

De exemplu,

CFLAGS := $(dacă $(filtru gcc egcc, $(CC)), -g -Wall, -g)

definește CFLAGS ca fiind „-g -Wall” dacă variabila CC este fie „gcc”, fie „egcc”, iar „-g”
in caz contrar. (Asta fac regulile implicite de construire.)

„dacă adevărat” este similar cu „dacă”, cu excepția faptului că șirul 0 este tratat ca gol.

or condiția1[,condiția2[,condiția3...]]
Funcția sau oferă o operațiune SAU de „scurtcircuit”. Fiecare argument este extins,
în ordine. Dacă un argument se extinde la un șir nevid, procesarea se oprește și
rezultatul expansiunii este acel șir. Dacă, după ce toate argumentele sunt extinse, toate
sunt false (vide), atunci rezultatul expansiunii este șirul gol.

Fișier și Filename funcţii
nume_fișier_absolut fișiere
abspath fișiere
Convertește nume de fișiere relative în absolute fără . or ... De exemplu,
„$(absolute_filename xyz.c)” ar putea returna „/usr/src/our_project/subdir/xyz.c”.

absolute_filename_nolink fișiere
cale reală fișiere
La fel ca absolute_filename, dar se asigură că legăturile simbolice sunt rezolvate.

nume de bază nume de fișiere
Numele de bază este numele întregului fișier (cu directorul), minus textul de după și
inclusiv ultima perioadă. De exemplu, „$(basename myfile/version-1.0-module.c)” este
„fișierul meu/versiunea-1.0-modul”

dir nume de fișiere
Extrage partea de director a fiecărui fișier din lista de nume de fișiere, inclusiv finalul
bară oblică. Returnează „./” dacă nu există niciun director în numele fișierului.

dir_noslash nume de fișier
La fel ca „$(dir )”, cu excepția faptului că nu returnează slash-ul final.

filesubst model, substitui, cuvinte
Efectuați o înlocuire de model pe numele fișierelor. Acest lucru diferă de patsubst prin aceea că
va funcționa corect atunci când sunt date nume alternative pentru directoare (atâta timp cât
ele preced semnul procentului). De exemplu,

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

va funcționa cu filesubst, dar nu cu patsubst.

filter_out_dirs nume de fișiere
Returnează toate numele de fișiere care nu se referă la directoare.

Gaseste fisier nume de fișier, cale
Găsește un fișier în calea specificată sau în variabila de mediu PATH dacă nu există nimic
specificat. Acest lucru poate fi util pentru a găsi fișiere binare sau include fișiere. De exemplu,

TCL_INCLUDE := -I$(dir_noslash $(găsește fișierul 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))

Acesta localizează fișierul tcl.h căutând în toate directoarele de mai sus. Absolutul
este returnată calea către fișier. Apoi „$(dir_noslash )” extrage acel director și acesta
este pus în calea include.

find_program nume
Returnează primul program din listă care poate fi găsit în PATH. Acest lucru este util
atunci când există mai multe programe echivalente care pot fi utilizate și doar doriți
alege una dintre ele. De exemplu, aici este definiția implicită a mai multor comune
variabilele pe care makepp le furnizează dacă nu puneți una în makefile:

CC = $(find_program gcc egcc pgcc c89 cc) # și mai mult, în funcție de mașină
F77 = $(find_program f77 g77 fort77)
CXX = $(find_program g++ c++ pg++ cxx CC aCC)

Dacă niciunul dintre programe nu este găsit, „$(find_program )” returnează șirul negăsit și
înregistrează ceea ce nu a fost găsit. Acest lucru de obicei nu va avea ca rezultat un makefile funcțional, dar acesta
va avea tendința de a genera mesaje de eroare mai bune. De exemplu, dacă faci ceva de genul
acest:

%.o : %.c
$(CC) $(intrări) -o $(ieșiri)

și makepp nu poate găsi un compilator C în lista de mai sus, acesta va înlocui negăsit.
În caz contrar, shell-ul ar încerca să execute fișierul sursă și eroarea rezultată
mesajul ar putea fi cu adevărat ciudat.

găsi_în sus nume de fișier
Caută un fișier cu numele dat în directorul ., .., ../ .., ../../.., Etc,
până când fișierul este găsit sau se ajunge la directorul rădăcină sau se află directorul
pe un alt sistem de fișiere. (Această ultimă cerință este prevenirea problemelor cu
automounters sau hang network filesystems.) Dacă aveți un RootMakeppfile, adica si
o barieră care împiedică căutarea mai sus.

De exemplu, dacă aveți un proiect cu mai multe niveluri de subdirectoare, ați putea
includeți acest fragment comun în toate fișierele make (de ex., folosind „include”
afirmație):

TOP_LEVEL_INCLUDE_DIR := $(find_upwards includes)
# Caută un director care conține
# include subdirectorul.

%.o : %.c
$(CC) $(CFLAGS) -I$(TOP_LEVEL_INCLUDE_DIR) -c $(intrare) -o $(ieșire)

O altă problemă pe care „find_upwards” o poate ajuta la rezolvarea este localizarea directorului de nivel superior
a unei constructii. Adesea este util să definiți o variabilă astfel:

SUS := ../../..

dacă aveți câteva informații importante aflate doar în directorul de nivel superior. Dar
acest lucru este greu de întreținut, deoarece numărul de „..” este diferit pentru diferite niveluri
a arborelui de directoare. În schimb, puteți folosi „find_upwards” pentru a localiza un fișier care este
cunoscut a fi prezent doar în directorul de nivel superior. Să presupunem, de exemplu, că
fișierul „LICENȚĂ” se află numai în directorul de nivel superior. Atunci ai putea face asta:

TOP := $(dir_noslash $(găsește_în sus LICENȚĂ))

„$(find_upwards LICENSE)” returnează calea completă a fișierului de licență;
„$(dir_noslash ...)” elimină numele fișierului, returnând doar directorul.

(Rețineți că declarația „include” caută automat fișiere în sus, deci acolo
nu este nevoie sa faci asa ceva:

include $(find_upwards top_level_rules.mk)

În schimb, poți doar să faci

include top_level_rules.mk

și va funcționa la fel de bine.)

Dacă fișierul nu este găsit, „find_upwards” va anula construirea cu un mesaj de eroare.

Dacă specificați mai mult de un fișier, find_upwards îl va căuta pe primul
al doilea, și așa mai departe. Cu alte cuvinte,

$(find_upwards file1 file2)

este echivalent cu

$(găsește fișierul în sus1) $(găsește fișierul în sus2)

Dacă doriți să căutați oricare dintre fișiere, atunci folosiți „find_first_upwards” în schimb.

găsiți_întâi_în sus file1 file2 ...
Această funcție se comportă ca „find_upwards”, cu excepția faptului că returnează primul fișier din oricare
fișierele din lista pe care o găsește. Mai exact, verifică directorul curent pentru
oricare dintre fișierele din listă și returnează primul fișier care există sau poate fi construit.
Dacă niciunul dintre fișiere nu există sau nu poate fi construit în acel director, se verifică .., Apoi
../ .., etc., până când ajunge fie la directorul rădăcină, fie la un director care este
situat pe un sistem de fișiere diferit.

primul_disponibil file1 file2 ...
Returnează primul fișier dintr-o listă care există sau poate fi construită. Acest lucru poate fi util pentru
adaptarea makefile-urilor pentru a funcționa pe mai multe mașini sau rețele diferite, unde
fișierele importante pot fi localizate în locuri diferite. De exemplu, iată o linie de la
unul dintre makefile-urile mele:

TCL_LIB = $(first_available \
/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)

Această linie va verifica biblioteca Tcl în toate locurile de mai sus, oprindu-se la
primul pe care îl găsește. Comanda link include apoi $(TCL_LIB), așa că obținem
bibliotecă Tcl corespunzătoare.

infer_linker file1 file2 ...
Având o listă de fișiere obiect, construiți-le mai întâi dacă nu au fost încă. Atunci găsește
indiferent dacă depind de o sursă Fortran, C++ sau C și returnează sursa corespunzătoare
compilator (care știe mai bine cum să legă decât „ld”).

infer_obiecte file1 file2 ..., model
$(infer_objects object1.o object2.o, *.o)

Dacă utilizați convenții standard cu privire la numele fișierelor antet, makepp este capabil
ghicind ce fișiere „.o” sau „.lo” trebuie să fie conectate cu programul tău. Folosesc asta pentru
alegeți fișierele dintr-un director de bibliotecă care conține module utilizate în multe diferite
programe. În loc să creeze un fișier „.a” de bibliotecă și ca linkerul să aleagă fișierul
module relevante, makepp poate alege modulele relevante pentru dvs. Numai așa
modulele relevante sunt compilate.

Algoritmul lui Makepp pentru deducerea dependențelor obiectelor depinde de convenția conform căreia
implementarea tuturor claselor sau funcțiilor definite într-un fișier antet „xyz.h” sunt
compilat într-un fișier obiect numit „xyz.o” (sau „xyz.lo”). Deci algoritmul lui makepp pentru
deducerea dependențelor obiectelor începe cu unul sau câteva obiecte despre care știm că trebuie să fie
legate în program. Se uită la ce fișiere au fost incluse cu „#include” în
acele surse și încearcă să găsească fișierele obiect corespunzătoare pentru fiecare include
fișiere.

„$(infer_objects )” trebuie menționat în lista de dependențe a unui program, cum ar fi
acest:

myprog: $(infer_objects main.o another_object.o, \
**/*.o /other/library/dirs/**/*.o)
$(CXX) $(intrări) -o $(ieșire) $(LIBS)

Funcția „$(infer_objects)” preia două argumente (separate prin virgulă, după cum se arată).
Primul este unul sau câteva fișiere obiect despre care se știe că sunt necesare (caracterele metalice sunt
permis aici). Al doilea este o listă de obiecte posibile (în mod normal, ați folosi un
wildcard aici) care ar putea fi conectat dacă este necesar. Valoarea de returnare din aceasta
funcția este o listă care conține mai întâi toate obiectele din primul argument și
apoi, după acestea, toate obiectele suplimentare care au fost conținute în al doilea argument
care sunt cerute de obiectele din primul argument.

De exemplu, să presupunem că „main.o” provine de la „main.cpp”, care include „my_class.h”.
„$(infer_objects)” caută fișiere cu numele „my_class.o”. Dacă exact unul ca acesta
fișierul este găsit, acesta este adăugat la listă. (Dacă sunt găsite două fișiere obiect „my_class.o”.
în diferite directoare, este tipărit un mesaj de avertizare.) „infer_objects” de asemenea
examinează „my_class.cpp” pentru a vedea ce include și ce fișiere obiect suplimentare sunt
subînțeles.

mktemp
mktemp prefix
mktemp prefixXXX
mktemp /
Returnează un nume de fișier temporar imprevizibil, care nu există în prezent. Fara nume
care indică același fișier este returnat de două ori, chiar și cu căi relative diferite,
într-o singură rulare makepp (cu excepția posibilului cu make recursiv tradițional sau dacă Perl
codul care rulează într-o acțiune de regulă numită „f_mktemp”). La sfârșitul makepp-ului rulați toate
fișierele returnate de această funcție sunt șterse, dacă există (din nou, cu excepția celor
returnat de această funcție în codul Perl care rulează într-o regulă).

Orice număr de „X” majuscule de la sfârșitul argumentului este înlocuit cu atât de multe
litere și cifre aleatorii. Cu cât sunt mai multe, cu atât este mai puțin probabil să se ciocnească
cu alte procese, deci dacă dați un prefix ca "/tmp/abc.„, ar trebui să ai destul
„X”-urile. Dacă există mai multe X, primul caracter provine din id-ul procesului. Dacă
nu există, este ca și cum ar fi zece, ceea ce se presupune că este suficient (8.4e17
posibilități sau 3.7e15 pe Windows). Dacă nu există niciun argument, prefixul este implicit
"tmp." în directorul curent.

Rețineți că nu doriți să dați un nume ca ținte și dependențe ale regulilor. The
rezultatul ar fi corect, dar ar fi recreat de fiecare dată când rulați makepp.

De asemenea, deoarece este întotdeauna diferit, ar trebui să utilizați acest lucru într-o acțiune de regulă numai dacă utilizați
„:build_check ignore_action”:

TMPFILE ;= $(mktemp) # 1 apel; „=" ar însemna 3 apeluri: 3 fișiere
A-count B-count: :build_check ignore_action
produce-As-and-Bs >$(TMPFILE)
&grep -c /A/ $(TMPFILE) -o A-count
&grep -c /B/ $(TMPFILE) -o B-count

Sau ar trebui să-l exportați și să lăsați Shell să-l evalueze:

export TMPFILE ;= $(mktemp)
A-count B-count:
produce-As-and-Bs >$$TMPFILE # makepp nu vede valoarea var
fgrep -c A $$TMPFILE >A-count
fgrep -c B $$TMPFILE >B-count

Ultima formă repetă valoarea returnată anterioară, astfel încât să o puteți utiliza într-o regulă de tipar:

%.X y
&grep foo $(input) -o $(mktemp)
&sed bar $(mktemp /) -o $(ieșire) # Funcționează pe ieșirea lui &grep

notdir nume de fișiere
Returnează porțiunea non-director a numelui(lor) fișierului, adică totul după ultimul
bară oblică dacă există unul, sau întreg numele fișierului în caz contrar.

only_generated nume de fișiere
Returnează numai acele nume de fișiere din listă care au fost generate de makepp și nu de atunci
modificat, conform fișierului de informații de construcție.

Această funcție este utilă în regulile țintă curate (deși, desigur, „makeppclean” este
varianta preferata):

$(curat fals):
&rm -f $(numai_generat **/*)

only_nontargets nume de fișiere
Returnează numai acele nume de fișiere din listă care nu sunt ținte pentru nicio regulă (fie
reguli explicite sau tipare). Puteți specifica un wildcard (vezi „$(wildcard )”
funcția pentru mai multe detalii despre metacaracterele makepp). Acesta poate fi folosit pentru generarea unui
ținta de distribuție, de exemplu:

.FONICE: distribuţie

distribuție:
&mkdir our_product-$(VERSION)
&cp $(filtrare %~, $(only_nontargets *)) our_product-$(VERSION)
tar cf - produsul_nostru-$(VERSIUNEA) | gzip -9c > our_product-$(VERSION).tar.gz

În acest caz, „$(only_nontargets *)” returnează fiecare fișier din directorul curent
asta nu este ținta vreunei reguli. „$(filter_out %~, ...)” elimină editorul
backup-uri.

Similar cu „only_targets” (vezi mai sus), „only_nontargets” știe doar despre ținte care
au fost deja definite. Aceasta este o problemă numai dacă o utilizați pentru a defini variabile
cu atribuirea „:="; dacă îl folosiți în lista de dependențe sau în corpul unui
regula, toate celelalte reguli vor fi deja văzute.

only_stale nume de fișiere
Returnează numai acele nume de fișiere din listă care au fost generate de makepp și nu de atunci
modificate, conform fișierului de informații de construcție, dar nu mai sunt ținte ale vreunei reguli.

Această funcție este utilă pentru a vă asigura că nu există dependențe de astfel de fișiere,
fără a forța o construcție curată a tuturor țintelor:

$(schizătură falsă):
&rm -f $(numai_stale **/*)

De fapt, probabil că este mai bine să scrieți un script care apelează makepp pentru a genera
lista de fișiere învechite și apoi solicitați acelui script să elimine toate fișierele enumerate care
nu sunt momentan sub controlul sursei, doar în cazul în care un fișier generat devine sursă
fişier. Makepp nu are o astfel de funcție încorporată deoarece makepp este (și probabil
ar trebui să rămână) agnostic cu privire la controlul sursei.

only_targets nume de fișiere
Returnează numai acele nume de fișiere din listă care sunt de fapt ținta unei anumite reguli
(fie reguli explicite sau model). Puteți specifica wildcards (inclusiv makepps
wildcard special, „**”) în numele fișierelor. (Consultați funcția „$(wildcard )” pentru mai multe
Detalii. Aceasta poate fi folosită pentru o țintă curată, de exemplu:

.FONICE: curat

curat:
&rm -f $(numai_ținte *)

Acum, dacă tastați „makepp clean”, va șterge tot ce știe să construiască. Dar
nu creați o țintă curată, folosiți „makeppclean” în schimb!

Un alt loc unde poate fi util este evitarea includerii învechite .o fișierele din dvs
construi. De exemplu, dacă construiți o bibliotecă astfel:

mylib.a: *.o
&rm -f $(ieșire)
$(AR) cr $(ieșire) $(intriri)

și apoi ștergeți unele fișiere sursă, dar uitați să ștergeți fișierele corespunzătoare .o fișiere,
il .o fișierele vor mai exista. Aceasta înseamnă că vor fi în continuare încorporate în
biblioteca în ciuda faptului că nu mai sunt utile. Dacă vă modificați
regula asa:

mylib.a: $(only_targets *.o)
&rm -f $(ieșire)
$(AR) cr $(ieșire) $(intriri)

atunci această problemă nu va apărea.

Rețineți că aceasta se referă numai la fișierele despre care se știe că sunt ținte at il timp tu
invoca „numai-ținte”. Dacă „only_targets” apare în dependențele sau acțiunile unui
regula, atunci toate țintele posibile vor fi cunoscute deoarece dependențele și acțiunile nu sunt
evaluat până la executarea regulii. Totuși, dacă evaluezi, încearcă să-l evaluezi
mai devreme în makefile cu o variabilă „:=" ca aceasta:

ALL_TARGETS := $(only_targets *)

target1: dependency1
acțiuni

target2: dependency2
acțiuni

atunci „only_targets” nu va ști despre regulile ulterioare.

În mod similar, „only_targets” nu știe despre ținte produse în makefiles care sunt
încărcat cu make recursiv. (Dar oricum nu ar trebui să utilizați recursive make; use
utilizați instrucțiunea „load_makefile” sau încărcarea implicită makefile.)

nume_fișier_relativ file1 file2 fisier3[, bară oblică]
Returnează numele acelor fișiere în raport cu directorul curent (cel
makefile este în). Acest lucru poate fi folosit și pentru a curăța „./” inutil și alte nedorite din
calea:

DIR := .
SUBDIR := ..
FNAME := $(DIR)/../otherdir/$(SUBDIR)/fișiere
X := $(nume_fișier_relativ $(FNAME))

If slash este adevărat (de obicei 1), numele fișierelor returnate este garantat să conțină o bară oblică
adăugând „./” dacă este necesar, astfel încât să îl puteți folosi ca nume executabil fără
îngrijorarea căii de căutare a comenzii suprascrie locația directorului.

Dacă calea trece de directorul rădăcină, părintele fie directorul dvs. de acasă, fie
„$(ROOT)” al sistemului dvs. de construcție sau pe Windows rădăcina unei unități (în funcție de
mediu, acest lucru se întâmplă și pentru /cygdrive/c or /c), o cale absolută va fi
intors in schimb.

relativ_la file1 file2 fisier3[, director]
Returnează numele acelor fișiere în raport cu directorul specificat. Aceasta este
de obicei util atunci când din orice motiv trebuie să executați o comandă de la a
director diferit (director curent implicit):

source_backup.tar:
cd .. && tar cf $(relativ_la $(ieșire), ..) $(relativ_la ., ..)

sufix nume...
Extrage sufixul fiecărui nume de fișier în nume. Dacă numele fișierului conține un punct,
sufixul este totul începând cu ultima punct. În caz contrar, sufixul este
Șir gol. Acest lucru înseamnă frecvent că rezultatul va fi gol atunci când numele nu este,
iar dacă numele conține mai multe nume de fișiere, rezultatul poate conține mai puține nume de fișiere.

De exemplu,

$(sufix src/foo.c src-1.0/bar.c hacks)

produce rezultatul „.c .c”.

temporar cuvinte
Anunțați makepp că țintele specificate pot fi eliminate de regula care generează
lor. Similar cu „fals”, cu excepția faptului că makepp se așteaptă la un fișier real cu acest nume
va putea fi afectată de regulă. O regulă nu este executată dacă este doar temporară
obiectivele sunt depășite.

wildcard model
Returnează numele sortate ale tuturor fișierelor care se potrivesc cu modelul dat care există sau acelea
fișiere care nu există încă, dar care pot fi construite pe baza regulilor pe care le cunoaște makepp
cam în momentul în care evaluează expresia. În acest ultim punct diferă
din caracterele joker de introducere a regulilor, care se aplică chiar și fișierelor create de regulile găsite mai târziu.

Makepp acceptă toate metacaracterele obișnuite de shell ("*", "?" și "[]"). Are si o
wildcard „**” care se potrivește cu orice număr de directoare intervenite. (Această idee a fost
furat de la zsh.) De exemplu, „**/*.c” se potrivește cu toate .c fișiere în întreaga sursă
copac. „obiecte/**/*.o” se potrivește cu toate .o fișierele conținute oriunde în
subdirector obiecte sau oricare dintre subdirectoarele sale sau oricare dintre subdirectoarele acestora. The
Caracterul metalic „**” nu va urma link-uri soft către directoare la niciun nivel și nici nu va urma
încercați să introduceți directoare care există, dar care nu pot fi citite. De asemenea, fișierele și
directoarele care există dar care nu pot fi citite nu vor fi returnate de „$(wildcard )”.

Şir funcţii
addprefix prefix, cuvinte
Afișează șirul de prefix la fiecare dintre cuvinte. Acest lucru este în mare parte pentru GNU
compatibilitate; folosind expansiunea în stil rc, acest lucru se poate face într-un mod mai lizibil
asa:

MODULE := abcd
X_OLD_STYLE := $(addprefix $(OBJDIR)/, $(addsufix .o, $(MODULES)))
X_NEW_STYLE := $(OBJDIR)/$(MODULES).o # Nu e mai ușor de citit?

adaugă sufix sufix, cuvinte
Adaugă șirul sufix la fiecare dintre cuvinte. Acest lucru este în mare parte pentru GNU make
compatibilitate; folosind expansiunea în stil rc, acest lucru se poate face într-un mod mai lizibil
asa:

X_OLD_STYLE := $(adăugați sufix .o, $(MODULE))
X_NEW_STYLE := $(MODULE).o

apel variabil[, cuvinte]...
Funcția „apel” este unică prin faptul că poate fi folosită pentru a privi variabil ca o
functie parametrizata. Puteți atribui o expresie complexă variabil Și utilizarea
„call” pentru a-și extinde conținutul la diferite valori parametrizate de cuvinte mai târziu. În
alte sisteme de fabricație, o variabilă care este utilizată în principal pentru a fi extins prin
„chemare”, se numește a macro.

În timpul extinderii macro-ului, variabilele temporare $1, $2, "..." vezi
argumente date „apelului” în timpul invocării acestuia. Variabila $0 va fi extins la
numele macrocomenzii (de ex variabil) acel „apel” se extinde în prezent.

Nu există limită, cu câte argumente poate fi „apelată” o macrocomandă sau cu câte
parametrii pe care îi poate aștepta o macrocomandă. Dacă dați mai multe argumente pentru „apel” ca macrocomandă
nevoie, toate argumentele depășitoare vor fi eliminate. Dacă dați mai puține argumente decât a
macro aștept, toți parametrii care depășesc se prăbușesc în șirul gol.

Mai întâi un exemplu simplu:

rest = $(lista de cuvinte 2, $(cuvinte $(1)),$(1))
lista = ABCDE
dar mai întâi := $(apel rest,$(listă))

Aici, variabila „$(butfirst)” va conține lista „BCDE”.

Și acum pentru un exemplu mai complex pentru a arăta ce este posibil:

rest = $(lista de cuvinte 2,$(cuvinte $(1)),${1})
harta mea = $(dacă $2,$(apelați $1,$(primul cuvânt $2)) $(apelați $0,$1,$(apelați rest,$2)))
minuscule = ${makeperl lc("$1")}

UCWORDS = TOATE ACESTE CUVINTE SUNT MAJUSCULE
DCWORDS := $(apelați harta mea,minuscule,$(UCWORDS))

Acum „$(DCWORDS)” conține „toate aceste cuvinte sunt majuscule”. Apropo: face ca nu
diferență, dacă accesăm argumentele prin $1, „${1}” or „$(1)” în cadrul unui macro.

Puteți utiliza direct variabila ca și cum ar fi o funcție, dacă nu există
funcția acelui nume. Acesta este convertit intern în „apel”, așa că acestea sunt
echivalent:

discuție = $0 transformat în $1 $2.
direct = $(discuție și,argument)
numit = $(apelați discuție,un,argument)

Ar putea părea discutabil dacă „$[call]” ar trebui să extindă și macro-ul „$[]”
expresii sau dacă o funcție ar trebui să facă întotdeauna același lucru, indiferent cum ar fi
se numește. S-a ales cel din urmă, pentru că cu sintaxa normală make ar fi
imposibil de a obține „$[1], $[2]...” într-o variabilă (ar fi înlocuite cu nimic,
înainte ca atribuirea să aibă loc.) Prin urmare, dacă aveți o macrocomandă pentru definirea a
regula, doriți ca expresii precum „$(output)” să fie văzute atunci când regula este analizată, deci
trebuie să-i protejezi de „apel”:

definește myrule
2 dolari: 1 dolari
comanda mea $$(intrare) -o $$(ieșire)
endef
$[myrule myinput,myoutput]

filtru modele, cuvinte
Returnează toate cuvintele din listă care se potrivesc cu modelele. Modelele pot fi pur și simplu altele
cuvintele sau metacaracterele de nume de fișier (de exemplu, „*”, „?” și „[az]” sunt recunoscute), sau pot
au un caracter „%”, ceea ce înseamnă să se potrivească cu orice șir în acel moment (la fel ca „*”).

filtra modele, cuvinte
Returnează toate cuvintele din listă care nu se potrivesc cu modelele. Modelele pot fi pur și simplu
alte cuvinte sau metacaracterele de nume de fișier (de exemplu, „*”, „?” și „[az]” sunt recunoscute), sau
ele pot avea un caracter „%”, ceea ce înseamnă să se potrivească cu orice șir în acel moment (la fel ca
„*”).

De exemplu:

libproduction.a: $(filter_out test_*, $(wildcard *.o))

va pune toate .o fișiere care există sau pot fi construite, cu excepția celor care încep cu test_,
în libproduction.a.

găsește șirul găsi, in
Retur găsi, dacă este un subșir de in.

primul cuvânt cuvinte
Întoarce primul cuvânt.

Hartă cuvinte, perlcode
makemap cuvinte, perlcode
Similar hărții lui Perl, se aplică perlcode la fiecare cuvânt pe rând și returnează
rezultate. Prima variantă este codul Perl simplu, în timp ce a doua variantă trece prima
codul perl prin extinderea variabilă în stil Make. Cuvintele sunt extinse în ambele
cazuri.

Cuvintele sunt în $_ și sunt returnate, cu excepția cazului în care undef $_. Aceasta este destinată
modificări care nu sunt ușor de gestionat de „patsubst”. Doar prima virgulă este un separator,
orice alții sunt considerați parte a perlcode.

# Schimbați cuvintele. Părintele duble, pentru a permite părinții în perlcode sau utilizați ${}:
X = $((hartă $(VALORI), s/(.+)-(.+)/$2-$1/))
# Puteți folosi expresii make, dar apoi trebuie să utilizați $$ pentru Perl $:
Y = $(makemap $(VALUES), tr/$(OLDCHARS)/$(NEWCHARS)/ sau $$_ = „eșuat”)
# Puteți elimina candidați:
Y = $(hartă $(VALORI), undef $_ dacă /no_good/)

alătura cuvintele 1, cuvinte2
Faceți o îmbinare în perechi a primelor cuvinte și a celui de-al doilea.

patsubst model, substitui, cuvinte
Efectuează o înlocuire pentru fiecare cuvânt din lista de cuvinte. Un caracter „%” se potrivește cu oricare
şir. Acest lucru este cel mai bine ilustrat printr-un exemplu:

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

preia fiecare fișier din C_SOURCES și returnează numele unui fișier obiect în object_dir.
Uneori este mai concis să folosiți o referință de substituție, de exemplu, cea de mai sus ar putea
au fost scrise ca

OBJS = $(C_SOURCES:%.c=object_dir/%.o)

fel cuvânt1 cuvânt2 cuvânt3 ...
Sortează cuvintele în ordine lexicală și elimină duplicatele.

strip şir
Elimină spațiul alb de început și de final din șir și înlocuiește fiecare intern
secvență de unul sau mai multe caractere cu spații albe cu un singur spațiu. Astfel, „$(fâșia ab
c )" rezultă în "abc".

subst de la,la,text
Efectuează o înlocuire textuală pe textul textului: fiecare apariție a lui de la este înlocuită
de către to. Rezultatul este înlocuit cu apelul de funcție. De exemplu,

$(subst ee,EE,picioare pe stradă)

înlocuiește șirul „fEEt on the STREEt”.

cuvânt n, text
Returnează ncuvantul al a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. . Valorile legitime ale n începe de la 1 la început
sau invers de la -1 la sfârșit. Dacă n este mai mare decât numărul de cuvinte din a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. ,
valoarea este goală.

listă de cuvinte lista index, cuvinte
listă de cuvinte primul indice, ultimul index, cuvinte
În prima formă furnizați o listă de indici (numărând de la 1 la început sau
înapoi de la -1 la sfârșit) pentru a selecta cuvintele dorite. În a doua formă tu
specificați intervalul de cuvinte pe care doriți să îl returnați.

cuvinte a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
Returnează numărul de cuvinte din a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. .

Diverse funcţii
pentru fiecare var,listă,text
Primele două argumente, a fost și listă, sunt extinse înainte de a se face orice altceva; Notă
că ultimul argument, textul, nu este extins în același timp. Apoi pentru fiecare cuvânt de
valoarea extinsă a listei, variabila numită de valoarea extinsă a var este setată la
acel cuvânt, iar textul este extins. Se presupune că textul conține referințe la acea variabilă,
deci expansiunea sa va fi diferită de fiecare dată.

Acest exemplu simplu setează variabila fișiere la lista tuturor fișierelor din
directoarele din listă dirs:

dirs := abcd
fișiere := $(foreach dir,$(dirs),$(wildcard $(dir)/*))

Aici textul este „$(wildcard $(dir)/*)”. Prima repetare găsește valoarea „a” pentru dir,
deci produce același rezultat ca „$(wildcard a/*)”; a doua repetare produce
rezultatul „$(wildcard b/*)”; iar al treilea, cel al „$(wildcard c/*)”.

Acest exemplu are același rezultat (cu excepția setării „dirs”) ca următorul exemplu:

fișiere := $(caracterul metalic a/* b/* c/* d/*)

Când textul este complicat, puteți îmbunătăți lizibilitatea dându-i un nume, cu un
variabila suplimentara:

find_files = $(caracterul metalic $(dir)/*)
dirs := abcd
fișiere := $(foreach dir,$(dirs),$(find_files))

Aici folosim variabila find_files în acest fel. Folosim simplu „=" pentru a defini a
variabilă care se extinde recursiv, astfel încât valoarea sa să conțină un apel de funcție real la
să fie reextins sub controlul foreach; o variabilă pur și simplu extinsă nu ar funcționa,
deoarece wildcard ar fi apelat o singură dată la momentul definirii find_files.

Notă: nu confundați acest lucru cu variabila specială „$(foreach)”.

info a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
de avertizare a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
eroare a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
Textul de ieșire returnând nimic. Primul merge la STDOUT, al doilea la STDERR,
al treilea întrerupe suplimentar procesarea.

preconstruire obiective
face obiective
Returnează argumentul său text, dar mai întâi construiește toate fișierele listate. Acest lucru este util
atunci când este necesar un fișier dat atunci când se evaluează o expresie make. Acest lucru se întâmplă de obicei
când aveți o versiune în care setul de fișiere implicat este calculat de un shell
comenzi. De exemplu,

lista_fișiere :
# comenzi shell pentru a calcula o listă de fișiere de pus în program

my_program : $(&cat $(listă_fișiere preconstruită))

Dacă aveți nevoie de listă în mai multe reguli, ar fi mai eficient să utilizați un
extinde cel mult o dată variabila:

lista_fișiere ;= $(&cat $(listă_fișiere preconstruită))

programul_meu1 : ao $(lista_fișiere)

my_program2 : bo $(listă_fișiere)

Dacă în schimb ați specificat doar „$(&cat file_list)”, atunci makepp nu ar forța
file_list să fie actualizată înainte de a executa comanda shell. Folosind „$(prebuild )”
este cel mai bun mod de a rezolva această problemă. Ai putea fi tentat să încerci și alte lucruri, de exemplu
acest:

programul_meu : lista_fișiere $(&cat lista_fișierelor)

dar acest lucru nu va funcționa deoarece „$(&cat file_list)” este evaluat înainte ca makepp să încerce
construiți „file_list”.

only_phony_targets nume
Returnează numai acele nume din listă care sunt ținte false ale unei anumite reguli (fie
reguli explicite sau tipare). Puteți specifica metacaractere (inclusiv caracterele speciale pentru makepp
wildcard, „**”) în numele fișierelor. (Consultați funcția „$(wildcard )” pentru mai multe detalii.
Aceasta poate fi folosită pentru gruparea țintelor, de exemplu:

$(teste false): $(numai_ținte_fonate */**/teste)

origine variabil
Având în vedere numele unei variabile, vă spune de unde provine valoarea acesteia.

perl perlcode
makeperl perlcode
Evaluează codul perl într-un bloc și returnează rezultatul. Prima variantă este Perl simplu
cod, în timp ce a doua variantă trece mai întâi codul perl prin variabila Make-style
expansiune.

Rețineți că, la fel ca în cazul tuturor funcțiilor, delimitatorul de funcție utilizat poate să nu apară în interior
codul perl în afara șirurilor ghilimele simple sau duble. Dar o poți dubla ca în
ultimul exemplu:

VAR = 1
VAR1 = ${perl ($VAR + 1) * 3}
VAR2 = $(perl do { $VAR *= 3; returnează $VAR + 1 } dacă $VAR)
VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # o var de marcare și una var de Perl
VAR = $((perl dacă( ... ) { ... }))

fals cuvinte
Indică faptul că lista de cuvinte sunt de fapt ținte false și returnează lista de
tinte. Este destinat să fie folosit astfel:

$(folosesc toate): programul_meu

$(curat fals):
&rm -f *.o programul_meu

De asemenea, puteți declara una sau mai multe ținte ca fiind false cu o linie ca aceasta oriunde în
fișierul tău make:

.FONICE: toate curate

imprima a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
Afișează textul și îl returnează. Acest lucru este util mai ales pentru depanare, când nu o faceți
înțelegeți de ce substituția variabilă are ca rezultat. De exemplu,

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

va tipări rezultatul apelului „patsubst”.

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

va tipări ultimul argument la apelul „patsubst”.

coajă comandă-shell
Returnează rezultatul de la comanda shell dată, cu linii noi înlocuite cu spații.

Rețineți că, la fel ca în cazul tuturor funcțiilor, delimitatorul de funcție utilizat poate să nu apară în interior
comanda shell în afara șirurilor de caractere simple sau duble. Dar o poți dubla
ca in al doilea exemplu:

data = $(data shell) # mai bine: $(ora locală scalară perl)
VAR = ${{shell f() { echo salut; }; f}}

xargs comanda,argumente[,sufix[,lungime]]
Returnează o listă de comenzi separate de linii noi, fiecare încep cu cea specificată
comandă și încheiați cu cât mai multe elemente ale listei fără a trece peste
lungime (implicit 1000) caractere.

Scopul acestui lucru este de a evita depășirea limitei de lungime a comenzii pe sistemul dumneavoastră.
De exemplu, dacă există o mulțime de fișiere generate, atunci probabil că ați dori dvs
țintă curată (pe care nu ar trebui să o aveți, pentru că „makeppclean” este mai eficient) să
arata cam asa:

$(curat fals):
$(xargs $(RM), $(only_targets **/*))

Acest lucru are, de asemenea, efectul secundar că nu este generată nicio comandă dacă lista
se întâmplă să fie goală. Dar în acest caz, ar fi mai bine să utilizați &rm încorporat,
deoarece argumentele comenzilor încorporate sunt limitate doar de memoria lui Perl:

$(curat fals):
&rm -f $(numai_ținte **/*)

Dacă este specificat un al treilea argument, atunci acesta este folosit pentru a postfix fiecare comandă. Aceasta este
util pentru specificarea redirectoarelor, de exemplu (deși aici din nou &echo ar ajuta):

manifesta:
&rm -f $@
&atinge $@
$(xargs echo, $(numai_nontargets **/*), >> $@)

O parte din această documentație se bazează pe documentația GNU make.

Vă rugăm să rețineți că, dacă o funcție este apelată în timpul inițializării makefile, de exemplu
extinderea variabilelor de export, mesajele de eroare sau de avertizare vor raporta numărul de linie 0.

Utilizați makepp_functions online folosind serviciile onworks.net


Servere și stații de lucru gratuite

Descărcați aplicații Windows și Linux

Comenzi Linux

Ad