| RPM-MACROS(7) | Miscellaneous Information Manual | RPM-MACROS(7) |
NUME¶
rpm-macros - procesor macrocomenzi RPM
SINOPSIS¶
Definirea¶
%NUME CORP
%NUME([OPȚIUNI]) CORP
Expandarea¶
%NUME
%NUME [OPȚIUNI] [ARGUMENTE]
%{NUME}
%{NUME [OPȚIUNI] ARGUMENTE}
%{NUME:ARGUMENT}
%{?NUME}
%{?NUME:VALOARE-DACĂ-DEFINITĂ}
%{!?NUME:VALOARE-DACĂ-NU_ ESTE-DEFINITĂ}
%(COMANDĂ-SHELL)
%[EXPRESIE]
%[EXPRESIE ? VALOARE-DACĂ-ADEVĂRAT : VALOARE-DACĂ-FALS]
%{lua:COD-LUA}
DESCRIERE¶
RPM are un procesor de macrocomenzi încorporat puternic. Utilizările principale ale macrocomenzilor sunt configurarea și alte funcții utilitare pentru RPM în sine, precum și ca ajutor pentru împachetare în fișierele spec.
Pe lângă simpla substituire a textului, procesorul de macrocomenzi acceptă următoarele funcții:
- funcție de tip MACROCOMENZI PARAMETRICE cu opțiuni și procesare de argumente și macrocomenzi definite de utilizator și automate cu domeniu de aplicare local
- Expansiune shell
- Expansiune expresie
- Expansiune Lua pentru procesarea Lua încorporată
- diverse MACROCOMENZI INTEGRATE pentru procesarea șirurilor de caractere și interacțiunea cu sistemul de operare
Sintaxa pentru definirea macrocomenzilor simple este:
Toate spațiile albe din jurul CORPULUI sunt eliminate. NUME poate fi compus din caractere alfanumerice și din caracterul de subliniere (_) și trebuie să aibă cel puțin două caractere. Corpul este (re)extins la fiecare invocare a macrocomenzii. Numele macrocomenzilor și opțiunile sunt sensibile la majuscule și minuscule.
Consultați MACROCOMENZI PARAMETRICE pentru varianta mai avansată de macrocomenzi cu procesarea opțiunilor și argumentelor.
Macrocomenzile pot fi definite prin fișiere rpm-macrofile(5) și gestionate integral cu ajutorul macrocomenzilor primitive %define, %global și %undefine, linia de comandă RPM descrisă în rpm-common(8) și API (C, Python, Lua).
Cu excepția celor definite în macrocomenzile parametrice, macrocomenzile au întotdeauna domeniu global.
Macrocomenzile RPM sunt stivuite, adică atunci când se redefinește o macrocomandă deja existentă, aceasta acoperă definiția anterioară în loc să o înlocuiască, iar anularea definiției unei macrocomenzi elimină doar definiția de sus, activând astfel definiția macrocomenzii anterioare.
Rețineți că acest manual descrie doar motorul procesorului de microcomenzi în sine. Într-un sistem normal bazat pe RPM, există un număr mare de alte microcomenzi definite prin fișiere rpm-macrofile(5) care nu vor fi abordate aici.
EXPANDARE¶
Pentru a extinde o macrocomandă, plasați % în fața acesteia. Sunt acceptate mai multe forme:
%NUME
%{NUME}
%NUME [OPȚIUNI] [ARGUMENTE]
-- poate fi utilizat pentru a separa opțiunile de argumente.
%{NUME [OPȚIUNI] [ARGUMENTE]}
%{NUME:ARGUMENT}
Notă: Sintaxele pentru apelarea macrocomenzilor parametrice și încorporate sunt în general interschimbabile în prezent, dar înainte de versiunea 4.18, sintaxa %{NUME:ARGUMENT} era exclusivă pentru macrocomenzile încorporate.
Extinderea macrocomenzii poate fi evitată prin plasarea unui al doilea % în fața macrocomenzii, de exemplu %%{nume} ar fi extins la %{nume}.
Încercarea de a extinde o macrocomandă nedefinită se extinde la invocarea literală, de exemplu %_undefined se extinde la %_undefined. Dacă acest lucru nu este dorit, utilizați condiționale.
Expansiunile macrocomenzii pot recurge până la 64 de niveluri.
Expansiune shell¶
Extinderea shell-ului poate fi efectuată folosind %(comanda shell). comanda_shell este extinsă înainte de a fi executată cu /bin/sh, a cărei ieșire devine extinderea macrocomenzii. Caracterul de linie nouă de la sfârșit este șters.
Exemplu:
%(echo aa-bb-cc | tr '-' '.')
Extindere condițională¶
Procesorul de macrocomenzi acceptă testarea dacă o macrocomandă este definită sau nu.
%{?NUME:VALOARE}
%{!?NUME:VALOARE}
%{?NUME}
Pentru teste mai complexe, utilizați Expansiune expresie sau Expansiune Lua. Rețineți că %if, %ifarch și altele similare nu sunt macrocomenzi, ci directive spec și pot fi utilizate numai în acel context.
Rețineți că în RPM >= 4.17, condițiile din macrocomenzile încorporate verifică pur și simplu existența acelei macrocomenzi încorporate, la fel ca în cazul oricărei alte macrocomenzi. În versiunile mai vechi, comportamentul condițiilor din macrocomenzile încorporate este nedefinit.
Expansiune expresie¶
Extinderea expresiei poate fi efectuată utilizând %[EXPRESIE]. O expresie este formată din termeni care pot fi combinați utilizând operatori.
RPM acceptă trei tipuri de termeni:
- numere formate din cifre
- șiruri de caractere între ghilimele duble (de exemplu, "vreun -șir")
- versiuni între ghilimele duble precedate de v (de exemplu, v"3:1.2-1")
RPM va extinde macrocomenzile atunci când evaluează termenii.
Puteți utiliza operatorii standard pentru a combina termenii:
- operatori logici &&, ||, !
- operatori relaționali !=, ==, <, >, <=, >=
- operatori aritmetici +, -, /, *,
- operatorul ternar ? :
- paranteze
De exemplu, %[ 3 + 4 * (1 + %two) ] se va extinde la 15 dacă %two se extinde la 2. Termenii versiunii sunt comparați folosind algoritmul de comparare a versiunii RPM ([epoch:]version[-release]), și nu prin compararea obișnuită a șirurilor de caractere.
Rețineți că expansiunea %[EXPRESIE] este diferită de macrocomanda %{expr:EXPRESIE}. În cazul celei din urmă, macrocomenzile din expresie sunt mai întâi expandate, iar apoi expresia este evaluată (fără a reexpanda termenii). Astfel
rpm --define 'foo 1 + 2' --eval '%{expr:%foo}'
va afișa 3. Utilizarea %[%foo] va genera eroarea "1 + 2" nu este un număr.
Efectuarea expansiunii macrocomenzii în timpul evaluării termenilor are două avantaje. În primul rând, permite RPM să efectueze o procesare corectă a scurtcircuitelor în timpul evaluării operatorilor logici. În al doilea rând, rezultatul expansiunii nu influențează analizarea expresiei, de exemplu %[„%file”] va funcționa chiar și dacă macrocomanda %file se extinde la un șir care conține ghilimele duble.
Adăugată: 4.16.0
Expansiune Lua¶
Cea mai puternică dintre metodele de expansiune a macrocomenzilor este utilizarea interpretului Lua încorporat în RPM:
%{lua:COD-LUA}
Pentru detalii, consultați rpm-lua(7).
MACROCOMENZI PARAMETRICE¶
Macrocomenzile parametrice sunt un mecanism puternic care permite crearea de macrocomenzi utilitare similare funcțiilor, cu procesare opțională și acceptarea unui număr variabil de argumente, similar instrumentelor shell obișnuite.
Sintaxa pentru definirea macrocomenzilor parametrice este:
Dacă sunt prezente, OPȚIUNILE (adică șirul dintre paranteze) sunt transmise exact așa cum sunt către getopt(3) pentru procesarea argc/argv la începutul invocării macrocomenzii. Sunt acceptate numai opțiunile scurte.
- ca singurul câmp OPȚIUNI dezactivează procesarea opțiunilor RPM. Acest lucru permite macrocomenzilor să decidă în totalitate modul de gestionare a intrărilor lor, de exemplu, dacă argumentele macrocomenzii constau numai/în mare parte din elemente care încep cu -, procesarea implicită nu face decât să încurce.
Macrocomenzi automate¶
În timpul extinderii unei macrocomenzi parametrizate, sunt disponibile următoarele macrocomenzi automate de tip shell:
| Macrocomanda | Descriere |
| %0 | numele macrocomenzii care este invocată |
| %* | toate argumentele (spre deosebire de shell, fără a include niciun fanion procesat) |
| %** | toate argumentele (inclusiv orice fanioane procesate) |
| %# | numărul de argumente |
| %{-f} | dacă este prezent la invocare, ultima apariție a fanionului f (fanion și argument) |
| %{-f*} | dacă este prezent la invocare, argumentul pentru ultima apariție a fanionului f |
| %1, %2, ... | argumentele în sine (după procesarea getopt(3)) |
Dacă procesarea opțiunilor încorporate a fost dezactivată cu - ca câmp OPȚIUNI , sunt disponibile numai următoarele macrocomenzi automate:
| Macrocomanda | Descriere |
| %0 | numele macrocomenzii care este invocată |
| %*, %** | toate argumentele |
| %# | numărul de argumente |
| %1, %2, ... | argumentele în sine |
Macrocomenzile automate sunt definite și redefinite automat la intrarea și ieșirea din macrocomanda parametrică.
Accesarea opțiunilor¶
În cadrul unei macrocomenzi parametrice, există mai multe construcții care permit testarea prezenței parametrilor opționali. Cea mai simplă construcție este %{-f} care se extinde (literalmente) la -f dacă -f a fost menționat atunci când macrocomanda a fost invocată. Există, de asemenea, prevederi pentru includerea textului dacă era prezent un fanion folosind %{-f:X}. Această macrocomandă se extinde la (extinderea lui) X dacă fanionul era prezent. Forma negativă, %{!-f:Y}, care se extinde la (extinderea lui) Y dacă -f nu era prezent, este de asemenea acceptată.
Domeniul de aplicare și vizibilitatea¶
În general, macrocomenzile au o aplicabilitate globală, indiferent de locul și modul în care au fost definite. Cu toate acestea, macrocomenzile definite în cadrul macrocomenzilor parametrice au o aplicabilitate non-globală, după cum urmează:
- macrocomenzile automate au domeniu de aplicare local, adică sunt vizibile numai la nivelul apelului macrocomenzii respective
- macrocomenzile locale definite de utilizator au un domeniu de aplicare imbricat, adică sunt vizibile la nivelul apelului macrocomenzii în sine și la niveluri mai profunde.
Adică, o macrocomandă parametrică nu poate vedea opțiunile sau argumentele altei macrocomenzi, dar o macrocomandă locală definită de utilizator într-o macrocomandă de apel poate fi accesată în macrocomanda (macrocomenzile) apelată (apelate).
Pentru a defini o macrocomandă globală în interiorul unei macrocomenzi parametrice, trebuie să utilizați %global în loc de %define. De asemenea, rețineți că, deoarece o astfel de macrocomandă poate face referire la alte macrocomenzi vizibile numai în domeniul curent, %global extinde corpul macrocomenzii o singură dată în momentul definirii.
Convenția de apelare¶
Când o macrocomandă parametrică este extinsă, se utilizează următoarea convenție de apelare:
- 1.
- orice argumente ale macrocomenzii sunt extinse la nivelul apelului destinatarului apelului
- 2.
- orice opțiuni pentru macrocomandă sunt procesate
- 3.
- macrocomenzile automate sunt configurate pentru opțiuni și argumente
- 4.
- corpul macrocomenzii este extins recursiv
- 5.
- toate macrocomenzile definite la acest nivel de apel sunt eliminate
MACROCOMENZI INTEGRATE¶
RPM acceptă următoarele macrocomenzi încorporate pentru diverse operațiuni. Macrocomenzile încorporate nu pot fi redefinite sau suprascrise.
Notă: Stilul %{name:arg} este utilizat aici deoarece este cel mai compatibil cu versiunile anterioare și nu necesită citarea spațiilor albe, dar poate fi în general înlocuit și cu alte forme de expansiune. Funcțiile încorporate care acceptă mai multe argumente trebuie să utilizeze alte stiluri, după cum se indică mai jos.
Manipularea macrocomenzilor¶
Macrocomenzile primitive sunt utilizate pentru manipularea macrocomenzilor în fișierele spec și în alte macrocomenzi. Rețineți că toate acestea funcționează pe numele macrocomenzii fără caracterul % precedent.
%define NUME[([OPȚIUNI])] CORP
Exemplu:
%define ruta-mea /usr/bin/mine
%global NUME[([OPȚIUNI])] CORP
A doua diferență este că CORPUL este extins o singură dată în momentul definirii, iar extinderea devine corpul macrocomenzii propriu-zis. Astfel, atunci când se utilizează %global, pot apărea execuții de cod arbitrar și efecte secundare, în funcție de conținutul și de celelalte macrocomenzi utilizate în CORP. Cea din urmă poate fi utilă pentru a evita extinderile macrocomenzii redundante și posibil costisitoare dacă valoarea nu se modifică, dar trebuie să fiți conștienți de efectele secundare.
Rețineți că, deși %global acceptă din punct de vedere tehnic un câmp OPȚIUNI, aceasta nu este potrivită pentru definirea macrocomenzilor parametrice din cauza comportamentului de expansiune al CORPULUI.
Exemplu:
%global snapver 0-0.48.20240616git
%undefine NUME
Exemplu:
%undefine ruta-mea
%{load:FIȘIER}
Extinderea macrocomenzii¶
%{expand:CORP}
Exemplu:
%{expand:%{foo_prefix}%{foo_suffix}}
%{expr:EXPRESIE}
Exemplu:
%{expr:5*1024}
%{lua:COD-LUA}
Exemplu:
%{lua:for i=65,90 do print(șir.char(i)) end}
%{macrobody:NUME}
Exemplu:
%{macrobody:_libdir}
Operații cu șiruri de caractere¶
%dnl
Exemplu:
%dnl Acesta este un comentariu privind comportamentul %{mymacro}
%{gsub ȘIR, MODEL, ÎNLOCUIRE [,N]}
Adăugată în versiunea: 4.19.0
Exemplu:
%{gsub aabbaacc aa dd 1}
%{len:ȘIR}
Exemplu:
%{len:9bf7da058a7c582878310e75be3d56a5a8b67f95}
%{lower:ȘIR}
Exemplu:
%{lower:CamelCase}'
%{quote:Șir}
Exemplu:
%myzip -x %{quote:empty spaces.zip}
%{rep ȘIR, N [,SEP]}
Adăugată în versiunea: 4.19.0
Exemplu:
%{rep a 5}
%{reverse:ȘIR}
Exemplu:
%{reverse:tac}
%{shescape:ȘIR}
Exemplu:
%{shescape:foo's}
%{shrink:ȘIR}
Exemplu:
%{shrink:aa bb ccc }
%{span:ȘIR}
Exemplu:
%{span:
%un lucru
%un alt lucru
}
%{sub ȘIR, I, [,J]}
Adăugată în versiunea: 4.19.0
Exemplu:
*%{sub fișierul-meu.zip 3 6}*
%{upper:ȘIR}
Exemplu:
%{upper:CamelCase}'
Operații cu fișiere și rute¶
%{basename:RUTA}
%{dirname:RUTA}
%{exists:RUTA}
Exemplu:
%{exists:%{builddir}/myflag.txt}
%{suffix:RUTA}
Exemplu:
%{suffix:fișierul-meu.zip}
%{url2path:URL}
Exemplu:
%{uncompress:RUTA}
Exemplu:
%{uncompress /sursa/mea.tar.gz}
%{xdg:TIP}
- cache: date neesențiale specifice utilizatorului (stocate în cache)
- config: fișiere de configurare specifice utilizatorului
- data: fișiere de date specifice utilizatorului
- state: date de stare specifice utilizatorului
Adăugată: 6.0.0
Exemplu:
%{xdg config}
Informații despre mediu¶
%getncpus
%{getncpus:TIP}
- total: numărul total de CPU-uri disponibile (la fel ca %getncpus)
- proc: numărul de CPU-uri disponibile pentru procese
- thread: numărul de CPU-uri disponibile pentru fire de execuție
proc și thread contabilizează memoria disponibilă, inclusiv limitările spațiului de adrese pentru firele de execuție.
Adăugată: 4.19.0.
Exemplu:
%{getncpus proc}
%getconfdir
%{getenv:NUME}
Exemplu:
%{getenv:HOME}
%rpmversion
Ieșire¶
%{echo:ȘIR}
Exemplu:
%{echo:Construirea cu foo}
%{warn:ȘIR}
Exemplu:
%{warning:Foo este depreciat}
%{error:ȘIR}
Exemplu:
%{error:Argument nevalid}
%verbose
%{verbose:ȘIR}
Exemplu:
%{verbose:-x}
Macrocomenzi specifice spec¶
%{S:NUMĂR}
%{P:NUMĂR}
Diagnosticare¶
%trace
%dump
%__nume_fișier
%__fișier_nr.linie
EXEMPLE¶
Exemplul 1. Definiți o macrocomandă simplă¶
Definiți macrocomanda mylib ca o rută relativă la macrocomanda %{_libdir} într-un fișier spec:
%define mylib %{_libdir}/mine
Exemplul 2. Definiți o macrocomandă parametrică¶
Definiți macrocomanda parametrică myhelper care execută programul specificat de %myprog cu primul argument al acestuia și trecând întotdeauna opțiunea --some-opt către acesta, precum și opțiunea --xtra dacă a primit opțiunea -x:
%define myhelper(x) %{myprog} --vreo-opțiune %{?-x:--xtra} %{1}
Exemplul 3. Definiți o macrocomandă utilizând expansiunea shell-ului¶
Definiți macrocomanda %today care se extinde la data curentă în formatul AALLZZ apelând ustensila shell date(1). Rețineți că este necesară a doua macrocomandă % pentru a eluda argumentele către date(1):
%define today %(date +%%y%%m%%d)
Exemplul 4. Definiți o macrocomandă condițională¶
Definiți macrocomanda mypath dacă nu a fost definită anterior:
%{!?mypath: %define mypath /vreun/loc}
Exemplul 5. Expansiune conditională¶
Expandează la 1 dacă use_foo este definit și 0 în caz contrar:
%{?use_foo:1}%{!?use_foo:0}
Exemplul 6. Expresii¶
Calculează 5 * 1024:
%[5 * 1024]
Extinde la literalul true sau false în funcție de o condiție:
%[1 < 2 ? "true" : "false"]
Compară versiunile, extinzând la 1 sau 0 pentru true/false:
%[ v"3.1.0-1" < v"1.0~alpha-2" ? 1 : 0]
Expandează la 1 dacă %aa se extinde la 5, altfel se extinde la 2:
%[ "%{aa}" == "5" ? 1 : 2]
DEPANAREA¶
Câteva instrumente utile pentru lucrul cu macrocomenzi și depanarea acestora:
rpm --eval "VALOARE"
rpm --define "aa 11" --eval "%aa"
rpm --eval "%global unamer %(uname -r)" --eval "%{macrobody:unamer}"
rpm --eval "%define unamer %(uname -r)" --eval "%{macrobody:unamer}"
rpmlua
rpmlua -e 'print(macros.defined("_libdir"))'
rpmspec --shell
rpmspec --shell telnet.spec
CONSULTAȚI ȘI¶
rpm(8) rpm-common(8) rpm-macrofile(5) rpm-config(5) rpm-lua(7) rpmspec(1) rpmlua(1)
TRADUCERE¶
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
| 15 decembrie 2025 | RPM 6.0.1 |