.\" -*- coding: UTF-8 -*- .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" Generated by scdoc 1.11.4 .\" Complete documentation for this program is not available as a GNU info page .nh .ad l .\" Begin generated content: .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH RPM\-MACROS 7 "8. Januar 2026" "RPM 6.0.1" .PP .SH BEZEICHNUNG rpm\-macros \- RPM\-Makroprozessor .PP .SH ÜBERSICHT .SS Definieren \fB%\fP\fINAME\fP \fITEXTKÖRPER\fP .PP \fB%\fP\fINAME\fP\fB(\fP[\fIOPTIONEN\fP]\fB)\fP \fITEXTKÖRPER\fP .PP .SS Expandieren \fB%\fP\fINAME\fP .PP \fB%\fP\fINAME\fP [\fIOPTIONEN\fP] [\fIARGUMENTE\fP] .PP \fB%{\fP\fINAME\fP\fB}\fP .PP \fB%{\fP\fINAME\fP [\fIOPTIONEN\fP] \fIARGUMENTE\fP\fB}\fP .PP \fB%{\fP\fINAME\fP\fB:\fP\fIARGUMENT\fP\fB}\fP .PP \fB%{?\&\fP\fINAME\fP\fB}\fP .PP \fB%{?\&\fP\fINAME\fP\fB:\fP\fIWERT\-FALLS\-DEFINIERT\fP\fB}\fP .PP \fB%{!\&?\&\fP\fINAME\fP\fB:\fP\fIWERT\-FALLS\-NICHT\-DEFINIERT\fP\fB}\fP .PP \fB%(\fP\fISHELL\-BEFEHL\fP\fB)\fP .PP \fB%[\fP\fIAUSDRUCK\fP\fB]\fP .PP \fB%[\fP\fIAUSDRUCK\fP \fB?\&\fP \fIWERT\-FALLS\-WAHR\fP \fB:\fP \fIWERT\-FALLS\-FALSCH\fP\fB]\fP .PP \fB%{lua:\fP\fILUA\-CODE\fP\fB}\fP .PP .SH BESCHREIBUNG .PP RPM verfügt über einen leistungsstarken integrierten Makroprozessor. Makros werden hauptsächlich für die Konfiguration und andere Dienstprogrammfunktionen von RPM selbst sowie als Paketierungshilfe in Spec\-Dateien verwendet. .PP Neben der einfachen Textersetzung unterstützt der Makroprozessor die folgenden Funktionen: .PD 0 .IP \(bu 4 funktionsähnliche \fBPARAMETRISCHE MAKROS\fP mit Optionen und Argumentverarbeitung sowie lokal begrenzten automatischen und benutzerdefinierten Makros .IP \(bu 4 \fBShell\-Expansion\fP .IP \(bu 4 \fBAusdrucksexpansion\fP .IP \(bu 4 \fBLua\-Expansion\fP für die eingebettete Lua\-Verarbeitung .IP \(bu 4 verschiedene \fBEINGEBAUTE MAKROS\fP für die Verarbeitung von Zeichenketten und Interaktion mit dem Betriebssystem .PD .PP Die Syntax zum Definieren einfacher Makros lautet: .PP .RS 4 \fINAME\fP \fITEXTKÖRPER\fP .PP .RE Jeglicher Leerraum um den \fITEXTKÖRPER\fP wird entfernt. Der \fINAME\fP kann aus alphanumerischen Zeichen und dem Unterstrich (\fB_\fP) bestehen und muss mindestens zwei Zeichen lang sein. Der Textkörper wird bei jedem Makroaufruf (erneut) expandiert. Bei Makronamen und \-optionen wird die Groß\- und Kleinschreibung beachtet. .PP Siehe \fBPARAMETRISCHE MAKROS\fP für die fortgeschrittene Makrovariante mit Options\- und Argumentverarbeitung. .PP Makros können über \fBrpm\-macrofile\fP(5)\-Dateien definiert und vollständig mit den Makroprimitiven \fB%define\fP, \fB%global\fP und \fB%undefine\fP, der RPM\-Befehlszeile (beschrieben in \fBrpm\-common\fP(8)) und der API (C, Python, Lua) verwaltet werden. .PP Mit Ausnahme derjenigen, die in parametrischen Makros definiert sind, haben Makros immer einen globalen Gültigkeitsbereich. .PP RPM\-Makros werden gestapelt, das heißt, wenn ein bereits vorhandenes Makro neu definiert wird, wird die vorherige Definition lediglich überdeckt, anstatt sie zu ersetzen. Beim Aufheben der Definition eines Makros wird nur die oberste Definition entfernt, wodurch die vorherige Makrodefinition wieder aktiviert wird. .PP Beachten Sie, dass diese Handbuchseite nur die Makroprozessor\-Engine selbst beschreibt. Auf einem normalen RPM\-basierten System gibt es eine Vielzahl weiterer Makros, die über \fBrpm\-macrofile\fP(5)\-Dateien definiert sind und hier nicht behandelt werden. .PP .SH EXPANSION Um ein Makro zu expandieren, stellen Sie ein \fB%\fP voran. Es werden mehrere Formen unterstützt: .PP \fB%\fP\fINAME\fP .RS 4 Expandieren des Makros \fINAME\fP. .PP .RE \fB%{\fP\fINAME\fP\fB}\fP .RS 4 Expandieren des Makros \fINAME\fP, wobei die Platzierung neben anderem Text erlaubt ist (ähnlich wie in \fB${ENV}\fP in der Shell). .PP .RE \fB%\fP\fINAME\fP [\fIOPTIONEN\fP] [\fIARGUMENTE\fP] .RS 4 Expandieren des parametrischen/eingebauten Makros \fINAME\fP, wobei Optionen und Argumente bis zum Ende der Zeichenkette oder dem nächsten Zeilenvorschub eingelesen werden. .PP \fB\-\-\fP kann dazu verwendet werden, Optionen von Argumenten zu trennen. .PP .RE \fB%{\fP\fINAME\fP [\fIOPTIONEN\fP] [\fIARGUMENTE\fP]\fB}\fP .RS 4 Expandieren des parametrischen/eingebauten Makros \fINAME\fP, wobei Optionen und Argumente bis zur schließenden geschweiften Klammer \fB}\fP eingelesen werden. Dies ermöglicht die Verwendung neben anderem Text. .PP .RE \fB%{\fP\fINAME\fP\fB:\fP\fIARGUMENT\fP\fB}\fP .RS 4 Expandieren des parametrischen/eingebauten Makros \fINAME\fP, wobei die Zeichenkette nach dem Doppelpunkt \fB:\fP als einziges Argument verwendet wird. Dies ermöglicht die Verwendung neben anderem Text. .PP .RE Hinweis: Die Syntax für den Aufruf parametrischer und eingebauter Makros ist jetzt generell austauschbar, aber vor Version 4.18 war die Syntax \fB%{\fP\fINAME\fP\fB:\fP\fIARGUMENT\fP\fB}\fP auf eingebaute Makros beschränkt. .PP Die Makroexpansion kann durch Platzieren eines zweiten \fB%\fP vor dem Makro vermieden werden. Beispielsweise würde \fB%%{name}\fP zu \fB%{name}\fP expandiert. .PP Der Versuch, ein undefiniertes Makro zu expandieren, führt zum wörtlichen Aufruf, z.B. wird \fB%_undefined\fP zu \fB%_undefined\fP. Wenn dies nicht erwünscht ist, verwenden Sie Bedingungen. .PP Makro\-Expansionen können bis zu 64 Ebenen rekursiv sein. .PP .SS Shell\-Expansion Die Shell\-Expansion kann mit \fB%(\fP\fIShell\-Befehl\fP\fB)\fP durchgeführt werden. Der \fIShell_Befehl\fP wird expandiert, bevor er mit \fI/bin/sh\fP ausgeführt wird, dessen Ausgabe die Expansion des Makros darstellt. Der abschließende Zeilenumbruch wird gelöscht. .PP Beispiel: .nf .RS 4 %(echo aa\-bb\-cc | tr \&'\-\&' \&'\&.\&') .fi .RE .PP .SS "Bedingte Expansion" Der Makroprozessor unterstützt das Testen, ob ein Makro definiert ist oder nicht. .PP \fB%{?\&\fP\fINAME\fP\fB:\fP\fIWERT\fP\fB}\fP .RS 4 Wird auf die Expansion des \fIWERTES\fP expandiert, wenn der \fINAME\fP definiert ist, anderenfalls auf eine leere Zeichenkette. .PP .RE \fB%{!\&?\&\fP\fINAME\fP\fB:\fP\fIWERT\fP\fB}\fP .RS 4 Wird auf die Expansion des \fIWERTES\fP expandiert, wenn der \fINAME\fP \fInicht\fP definiert ist, anderenfalls auf eine leere Zeichenkette. .PP .RE \fB%{?\&\fP\fINAME\fP\fB}\fP .RS 4 Kürzel für \fB%{?\&\fP\fINAME\fP\fB:%{\fP\fINAME\fP\fB}}\fP. .PP .RE Für komplexere Tests verwenden Sie die \fBExpansion von Ausdrücken\fP oder die \fBLua\-Expansion\fP. Beachten Sie, dass \fB%if\fP, \fB%ifarch\fP und ähnliche keine Makros, sondern Spec\-Datei\-Direktiven und nur in diesem Kontext verwendbar sind. .PP Beachten Sie, dass in RPM >= 4.17 Bedingungen für integrierte Makros lediglich die Existenz des integrierten Makros prüfen, genau wie bei allen anderen Makros. In älteren Versionen ist das Verhalten von Bedingungen für integrierte Makros undefiniert. .PP .SS "Expansion von Ausdrücken" Ausdrücke können in der Form \fB%[\fP\fIAUSDRUCK\fP\fB]\fP expandiert werden. Ein Ausdruck besteht aus Termen, die mittels Operatoren kombiniert werden können. .PP RPM unterstützt drei Arten von Termen: .PD 0 .IP \(bu 4 Zahlen, bestehend aus Ziffern .IP \(bu 4 in hochgestellte doppelte Anführungszeichen eingeschlossene Zeichenketten (z.B. \fB"Zeichenkette"\fP) .IP \(bu 4 in hochgestellte doppelte Anführungszeichen eingeschlossene Versionen, denen ein \fBv\fP vorangestellt ist (z.B. \fBv"3:1.2\-1"\fP) .PD .PP RPM expandiert Makros, wenn Terme ausgewertet werden. .PP Sie können die Standard\-Operatoren verwenden, um Terme zu verknüpfen: .PD 0 .IP \(bu 4 die logischen Operatoren \fB&&\fP, \fB||\fP, \fB!\&\fP .IP \(bu 4 die relationalen Operatoren \fB!\&=\fP, \fB==\fP, \fB<\fP, \fB>\fP, \fB<=\fP, \fB>=\fP .IP \(bu 4 die arithmetischen Operatoren \fB+\fP, \fB\-\fP, \fB/\fP, \fB*\fP, .IP \(bu 4 den ternären Operator \fB?\& :\fP .IP \(bu 4 Klammern .PD .PP Beispielsweise wird \fB%[ 3 + 4 * (1 + %two) ]\fP zu \fB15\fP expandiert, wenn \fB%two\fP zu \fB2\fP expandiert wird. Versionsterme werden mit dem RPM\-Versionsvergleichsalgorithmus ([\fIEpoche\fP:]\fIVersion\fP[\-\fIVeröffentlichung\fP]) verglichen, nicht mit einem regulären Zeichenkettenvergleich. .PP Beachten Sie, dass sich die Expansion der Form \fB%[\fP\fIAUSDRUCK\fP\fB]\fP vom Makro \fB%{expr:\fP\fIAUSDRUCK\fP\fB}\fP unterscheidet. Bei Letzterem werden zuerst die Makros im Ausdruck expandiert und dann der Ausdruck ausgewertet (ohne die Terme erneut zu expandieren). Somit wird .PP .nf .RS 4 rpm \-\-define \&'foo 1 + 2\&' \-\-eval \&'%{expr:%foo}\&' .fi .RE .PP \fB3\fP ausgeben. Wenn Sie stattdessen \fB%[%bla]\fP verwenden, wird eine Fehlermeldung ausgegeben, dass »1 + 2« keine Zahl ist. .PP Die Makroexpansion bei der Auswertung der Terme durchzuführen hat zwei Vorteile. Erstens ermöglicht sie RPM eine korrekte verkürzte Verarbeitung bei der Auswertung von logischen Operatoren. Zweitens beeinflusst das Expansionsergebnis nicht die Auswertung von Ausdrücken. Beispielsweise funktioniert \fB%["%file"]\fP selbst dann, wenn das Makro \fB%file\fP zu einer Zeichenkette mit doppelten englischen Anführungszeichen expandiert wird. .PP Hinzugefügt: 4.16.0 .PP .SS Lua\-Expansion Die leistungsstärkste Methode zur Makroexpansion ist die Verwendung des in RPM eingebetteten Lua\-Interpreters: .PP \fB%{lua:\fP\fILUA\-CODE\fP\fB}\fP .RS 4 Führen Sie \fILUA\-CODE\fP mit dem eingebetteten Lua\-Interpreter von RPM aus und expandieren Sie ihn zur \fBprint()\fP\-Ausgabe des Codes. .PP .RE Weitere Details finden Sie in \fBrpm\-lua\fP(7). .PP .SH "PARAMETRISCHE MAKROS" Parametrische Makros sind ein leistungsstarker Mechanismus, der die Erstellung funktionsähnlicher Dienstprogramm\-Makros mit Optionsverarbeitung und der Annahme einer variablen Anzahl von Argumenten ermöglicht, ähnlich wie bei gängigen Shell\-Werkzeugen. .PP Ein parametrisches Makro wird nach folgender Syntax definiert: .PP .RS 4 \fINAME\fP([\fIOPTIONEN\fP]) \fITEXTKÖRPER\fP .PP .RE Falls vorhanden, werden die \fIOPTIONEN\fP (das heißt, die Zeichenkette in Klammern) genau so an \fBgetopt\fP(3) zur argc/argv\-Verarbeitung zu Beginn eines Makroaufrufs übergeben. Es werden nur kurze Optionen unterstützt. .PP \fB\-\fP als einziges \fIOPTIONEN\fP\-Feld deaktiviert die Optionsverarbeitung von RPM. Dadurch können Makros vollständig entscheiden, wie sie mit ihren Eingaben umgehen. Wenn zum Beispiel die Argumente des Makros ausschließlich oder hauptsächlich aus Elementen bestehen, die mit \fB\-\fP beginnen, ist die Standardverarbeitung nur hinderlich. .PP .SS "Automatische Makros" Während ein parametrisiertes Makro expandiert wird, stehen die folgenden Shell\-ähnlichen automatischen Makros zur Verfügung: .PP .TS allbox;l lx l lx l lx l lx l lx l lx l lx l lx. T{ \fBMakro\fP T} T{ \fBBeschreibung\fP T} T{ \fB%0\fP T} T{ der Name des aufgerufenen Makros T} T{ \fB%*\fP T} T{ alle Argumente (im Gegensatz zur Shell, ohne verarbeitete Schalter) T} T{ \fB%**\fP T} T{ alle Argumente (einschließlich aller verarbeiteten Schalter) T} T{ \fB%#\fP T} T{ die Anzahl der Argumente T} T{ \fB%{\-f}\fP T} T{ falls beim Aufruf vorhanden, das letzte Vorkommen des Schalters \fBf\fP (Schalter und Argument) T} T{ \fB%{\-f*}\fP T} T{ falls beim Aufruf vorhanden, das Argument für das letzte Vorkommen des Schalters \fBf\fP T} T{ \fB%1\fP, \fB%2\fP, … T} T{ die Argumente selbst (nach der Verarbeitung mit \fBgetopt\fP(3)) T} .TE .sp 1 Wenn die integrierte Optionsverarbeitung mit \fB\-\fP als \fIOPTIONEN\fP\-Feld deaktiviert wurde, sind nur die folgenden automatischen Makros verfügbar: .PP .TS allbox;l lx l lx l lx l lx l lx. T{ \fBMakro\fP T} T{ \fBBeschreibung\fP T} T{ \fB%0\fP T} T{ der Name des aufgerufenen Makros T} T{ \fB%*\fP, \fB%**\fP T} T{ alle Argumente T} T{ \fB%#\fP T} T{ die Anzahl der Argumente T} T{ \fB%1\fP, \fB%2\fP, … T} T{ die Argumente selbst T} .TE .sp 1 Automatische Makros werden beim Ein\- und Ausstieg aus parametrischen Makros automatisch definiert und undefiniert. .PP .SS "Zugriff auf Optionen" Im Textkörper eines parametrischen Makros gibt es mehrere Konstrukte, die das Testen auf das Vorhandensein optionaler Parameter ermöglichen. Das einfachste Konstrukt ist \fB%{\-f}\fP, das (wörtlich) zu \fB\-f\fP expandiert wird, wenn \fB\-f\fP beim Aufruf des Makros übergeben wurde. Es gibt auch Möglichkeiten, Text einzufügen, wenn ein Schalter vorhanden ist, indem \fB%{\-f:X}\fP verwendet wird. Dieses Makro expandiert zu (der Expansion von) \fBX\fP, wenn der Schalter vorhanden war. Die negierte Form \fB%{!\-f:Y}\fP, die zu (der Expansion von) \fBY\fP expandiert, wenn \fB\-f\fP \fBnicht\fP vorhanden war, wird ebenfalls unterstützt. .PP .SS "Bereich und Sichtbarkeit" Im Allgemeinen haben Makros einen globalen Gültigkeitsbereich, unabhängig davon, wo und wie sie definiert wurden. Makros, die innerhalb parametrischer Makros definiert sind, haben jedoch einen nicht\-globalen Gültigkeitsbereich, und zwar wie folgt: .PD 0 .IP \(bu 4 Automatische Makros haben einen lokalen Gültigkeitsbereich, das heißt, sie sind nur auf der Aufrufebene des Makros selbst sichtbar. .IP \(bu 4 Benutzerdefinierte lokale Makros haben einen verschachtelten Gültigkeitsbereich, das heißt, sie sind auf der Aufrufebene des Makros selbst und tiefer sichtbar. .PD .PP Das heißt, ein parametrisches Makro kann die Optionen oder Argumente eines anderen nicht sehen, aber auf ein benutzerdefiniertes lokales Makro in einem aufrufenden Makro kann in den aufgerufenen Makros zugegriffen werden. .PP Um ein globales Makro innerhalb eines parametrischen Makros zu definieren, \fImüssen\fP Sie \fB%global\fP anstelle von \fB%define\fP verwenden. Beachten Sie außerdem, dass \fB%global\fP \fIden Makrokörper zum Zeitpunkt der Definition einmal expandiert\fP, da ein solches Makro möglicherweise auf andere Makros verweist, die nur im aktuellen Bereich sichtbar sind. .PP .SS Aufrufkonvention Beim Expandieren eines parametrischen Makros wird die folgende Aufrufkonvention verwendet: .PD 0 .IP 1. 4 alle Argumente des Makros werden auf der Aufrufebene des Aufrufenden expandiert .IP 2. 4 alle Optionen des Makros werden verarbeitet .IP 3. 4 automatische Makros werden für die Optionen und die Argumente eingerichtet .IP 4. 4 der Makrokörper wird rekursiv expandiert .IP 5. 4 alle auf dieser Aufrufebene definierten Makros werden verworfen .PD .PP .SH "EINGEBAUTE MAKROS" RPM verfügt über die in der nachfolgenden Liste aufgeführten eingebauten Makros für verschiedene Aktionen. Eingebaute Makros können nicht undefiniert oder außer Kraft gesetzt werden. .PP Hinweis: Der Stil \fB%{Name:Argument}\fP wird hier verwendet, da er am abwärtskompatibelsten ist und keine Anführungszeichen für Leerraum erfordert. Er kann aber grundsätzlich auch durch die anderen Expandierungsformen ersetzt werden. Integrierte Funktionen mit mehreren Argumenten müssen andere Stile verwenden, wie nachfolgend angegeben. .PP .SS "Manipulation von Makros" Die Makroprimitive werden zur Makromanipulation in Spec\-Dateien und anderen Makros verwendet. Beachten Sie, dass alle diese auf dem Makronamen \fIohne\fP das vorangehende \fB%\fP\-Zeichen arbeiten. .PP \fB%define\fP \fINAME\fP[([\fIOPTIONEN\fP])] \fITEXTKÖRPER\fP .RS 4 Dies ist die primäre Methode zum Definieren von Makros. Ein \fB%define\fP ist immer vollständig deklarativ: Es findet keine Makroexpansion statt und es gibt keine Nebeneffekte. Damit definierte Makros haben einen globalen Gültigkeitsbereich, es sei denn, die Definition erfolgt innerhalb eines parametrischen Makros. .PP Beispiel: .nf .RS 4 %define meinpfad /usr/bin/mein .fi .RE .PP .RE \fB%global\fP \fINAME\fP[([\fIOPTIONEN\fP])] \fITEXTKÖRPER\fP .RS 4 Das Primitiv \fB%global\fP ist in der Syntax zu \fB%define\fP identisch, verhält sich jedoch in zweierlei Hinsicht signifikant anders: Wie der Name schon andeutet, hat ein mit \fB%global\fP definiertes Makro immer einen globalen Gültigkeitsbereich, unabhängig davon, wo es verwendet wird. .PP Der zweite Unterschied besteht darin, dass der \fITEXTKÖRPER\fP bei der Definition einmalig expandiert wird und die Expansion zum eigentlichen Makrokörper wird. Daher kann es bei Verwendung von \fB%global\fP je nach Inhalt und den anderen im \fITEXTKÖRPER\fP verwendeten Makros zu beliebiger Codeausführung und Nebeneffekten kommen. Dass die Expansion zum eigentlichen Makrokörper wird, kann praktisch sein, um, falls sich der Wert nicht ändert, redundante, möglicherweise aufwändige Makroexpansionen zu vermeiden. Beachten Sie jedoch die Nebeneffekte. .PP Beachten Sie, dass \fB%global\fP zwar technisch gesehen ein \fIOPTIONEN\fP\-Feld akzeptiert, es jedoch aufgrund des \fITEXTKÖRPER\fP\-Expansionsverhaltens nicht für die Definition parametrischer Makros geeignet ist. .PP Beispiel: .nf .RS 4 %global snapver 0\-0\&.48\&.20240616git .fi .RE .PP .RE \fB%undefine\fP \fINAME\fP .RS 4 Beachten Sie, dass \fB%undefine\fP nur eine Makrodefinition aus dem Stapel entfernt. Daher garantiert die Verwendung \fInicht\fP, dass der \fINAME\fP nach dem Aufruf von \fB%undefine\fP undefiniert ist. Automatische Makros und eingebaute Makros können nicht undefiniert werden. .PP Beispiel: .nf .RS 4 %undefine mein_Pfad .fi .RE .PP .RE \fB%{load:\fP\fIDATEI\fP\fB}\fP .RS 4 Eine Makrodatei laden. (siehe \fBrpm\-macrofile\fP(5); hinzugefügt: 4.12.0) .PP Beispiel: .nf .RS 4 %{load:/irgendein/verzeichnis/makros\&.foo} .fi .RE .PP .RE .SS Makro\-Expansion \fB%{expand:\fP\fITEXTKÖRPER\fP\fB}\fP .RS 4 Expandiert den angegebenen \fITEXTKÖRPER\fP, als wäre er ein Makrotext. Nützlich für erweiterte Indirektion, zum Beispiel um einen Makronamen zu expandieren, der aus zwei oder mehr Makros besteht. .PP Beispiel: .nf .RS 4 %{expand:%{foo_präfix}%{foo_suffix}} .fi .RE .PP .RE \fB%{expr:\fP\fIAUSDRUCK\fP} .RS 4 Expandiert den angegebenen \fIAUSDRUCK\fP. Siehe \fBExpansion von Ausdrücken\fP. (Hinzugefügt: 4.15.0) .PP Beispiel: .nf .RS 4 %{expr:5*1024} .fi .RE .PP .RE \fB%{lua:\fP\fILUA\-CODE\fP\fB}\fP .RS 4 Expandiert die Ausgabe von \fILUA\-CODE\fP mithilfe des eingebetteten Lua\-Interpreters. Siehe \fBLua\-Expansion\fP. .PP Beispiel: .nf .RS 4 %{lua:for i=65,90 do print(string\&.char(i)) end} .fi .RE .PP .RE \fB%{macrobody:\fP\fINAME\fP\fB}\fP .RS 4 Expandiert zum unveränderten Textkörper des Makros \fINAME\fP. (Hinzugefügt: 4.16.0) .PP Beispiel: .nf .RS 4 %{macrobody:_libdir} .fi .RE .PP .RE .SS Zeichenkettenaktionen \fB%dnl\fP .RS 4 Verwirft und zur wechselt zur nächsten Zeile (ohne etwas zu expandieren). \fB%dnl\fP ist die empfohlene Methode zum Auskommentieren von Elementen in Spec\-Dateien, da sie überall funktioniert und die Makroverarbeitung für diese Zeile deaktiviert. (Hinzugefügt: 4.15.0) .PP Beispiel: .nf .RS 4 %dnl Dies ist ein Kommentar zum Verhalten von %{mymacro} .fi .RE .PP .RE \fB%{gsub \fP\fIZEICHENKETTE\fP, \fIMUSTER\fP, \fIERSETZUNG\fP [,\fIN\fP]\fB}\fP .RS 4 Ersetzt alle (oder die \fIN\fP ersten, falls angegeben) Vorkommen des angegebenen \fIMUSTERS\fP in der \fIZEICHENKETTE\fP durch die \fIERSETZUNG\fP. .PP Hinzugefügt: 4.19.0 .PP Beispiel: .nf .RS 4 %{gsub aabbaacc aa dd 1} .fi .RE .PP .RE \fB%{len:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Expandiert auf die Länge der \fIZEICHENKETTE\fP. (Hinzugefügt: 4.19.0) .PP Beispiel: .nf .RS 4 %{len:9bf7da058a7c582878310e75be3d56a5a8b67f95} .fi .RE .PP .RE \fB%{lower:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Expandiert zur \fIZEICHENKETTE\fP in Kleinschreibung. (Hinzugefügt: 4.19.0) .PP Beispiel: .nf .RS 4 %{lower:CamelCase}\&' .fi .RE .PP .RE \fB%{quote:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Maskiert Argumente in englischen hochgestellten Anführungszeichen für die Übergabe von leeren Zeichenketten und Zeichenketten mit eingebettetem Leerraum als Argumente für parametrische Makros. (Hinzugefügt: 4.14.0) .PP Beispiel: .nf .RS 4 %myzip \-x %{quote:empty spaces\&.zip} .fi .RE .PP .RE \fB%{rep \fP\fIZEICHENKETTE\fP, \fIN\fP [,\fITRENNER\fP]\fB}\fP .RS 4 Expandiert zu einer Zeichenkette, die die Verkettung von \fIN\fP Kopien der angegebenen \fIZEICHENKETTE\fP ist, getrennt durch einen \fITRENNER\fP (falls angegeben). .PP Hinzugefügt: 4.19.0 .PP Beispiel: .nf .RS 4 %{rep a 5} .fi .RE .PP .PP .RE \fB%{reverse:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Kehrt eine Zeichenkette um. (Hinzugefügt: 4.19.0) .PP Beispiel: .nf .RS 4 %{reverse:tac} .fi .RE .PP .RE \fB%{shescape:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 \fIZEICHENKETTE\fP in einfachen hochgestellten englischen Anführungszeichen mit Maskierungszeichen zur Verwendung in der Shell. (Hinzugefügt: 4.18.0) .PP Beispiel: .nf .RS 4 %{shescape:foo\&'s} .fi .RE .PP .RE \fB%{shrink:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Entfernt führenden und angehängten Leerraum von der \fIZEICHENKETTE\fP und reduziert dazwischenliegenden Leerraum auf ein einzelnes Leerzeichen. (Hinzugefügt: 4.14.0) .PP Beispiel: .nf .RS 4 %{shrink:aa bb ccc } .fi .RE .PP .RE \fB%{span:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Unveränderte Zeichenkette, praktisch zum Umschließen mehrzeiliger Makros. (Hinzugefügt: 6.0.0) .PP Beispiel: .nf .RS 4 %{span: %one thing %another thing } .fi .RE .PP .RE \fB%{sub \fP\fIZEICHENKETTE\fP, \fII\fP, [,\fIJ\fP]\fB}\fP .RS 4 Expandiert zu einer Teilzeichenkette der \fIZEICHENKETTE\fP, die bei \fBI\fP beginnt und bis \fBJ\fP fortgesetzt wird. \fBI\fP und \fBJ\fP können negativ sein, um vom Ende der Zeichenkette aus zu indizieren. Fehlt \fBJ\fP, wird angenommen, dass es gleich \fB\-1\fP ist (d.h. das Ende der Zeichenkette). .PP Hinzugefügt: 4.19.0 .PP Beispiel: .nf .RS 4 *%{sub meinedatei\&.zip 3 6}* .fi .RE .PP .RE \fB%{upper:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Expandiert zur \fIZEICHENKETTE\fP in Großschreibung. (Hinzugefügt: 4.19.0) .PP Beispiel: .nf .RS 4 %{upper:CamelCase}\&' .fi .RE .PP .RE .SS "Datei\- und Pfadaktionen" \fB%{basename:\fP\fIPFAD\fP\fB}\fP .RS 4 Makro analog zu \fBbasename\fP(1). .PP Beispiel: .nf .RS 4 %{basename:/ein/verzeichnis/datei.endung} .fi .RE .PP .RE \fB%{dirname:\fP\fIPFAD\fP\fB}\fP .RS 4 Makro analog zu \fBdirname\fP(1). .PP Beispiel: .nf .RS 4 %{dirname:/ein/verzeichnis/datei.endung} .fi .RE .PP .RE \fB%{exists:\fP\fIPFAD\fP\fB}\fP .RS 4 Testet das Vorhandensein einer Datei; expandiert zu 1/0. (Hinzugefügt: 4.18.0) .PP Beispiel: .nf .RS 4 %{exists:%{builddir}/meinschalter\&.txt} .fi .RE .PP .RE \fB%{suffix:\fP\fIPFAD\fP\fB}\fP .RS 4 Expandiert zum Endungs\-Teil eines Dateinamens. .PP Beispiel: .nf .RS 4 %{suffix:meinedatei\&.zip} .fi .RE .PP .RE \fB%{url2path:\fP\fIURL\fP\fB}\fP .RS 4 Wandelt eine URL in einen lokalen Pfad um. .PP Beispiel: .nf .RS 4 %{url2path:http://rpm.org/nicht/dort} .fi .RE .PP .RE \fB%{uncompress:\fP\fIPFAD\fP\fB}\fP .RS 4 Expandiert zu einem Befehl zur Ausgabe des Arguments \fIPFAD\fP in die Standardausgabe, wobei dekomprimiert wird, falls erforderlich. .PP Beispiel: .nf .RS 4 %{uncompress /meine/quelldatei.tar.gz} .fi .RE .PP .RE \fB%{xdg:\fP\fIART\fP\fB}\fP .RS 4 Expandiert zu den Basisverzeichnispfaden des XDG\-Standards. Folgende Werte werden für \fIART\fP unterstützt: .PD 0 .IP \(bu 4 \fBcache\fP: benutzerspezifische nicht wesentliche (zwischengespeicherte) Daten .IP \(bu 4 \fBconfig\fP: benutzerspezifische Konfigurationsdateien .IP \(bu 4 \fBdata\fP: benutzerspezifische Datendateien .IP \(bu 4 \fBstate\fP: benutzerspezifische Statusdateien .PD .PP Hinzugefügt: 6.0.0 .PP Beispiel: .nf .RS 4 %{xdg config} .fi .RE .PP .RE .SS "Infos zur Umgebung" \fB%getncpus\fP .RS 4 Expandiert zu der Anzahl der verfügbaren CPUs. (Hinzugefügt: 4.15.0) .PP .RE \fB%{getncpus:\fP\fIART\fP\fB}\fP .RS 4 Expandiert zu der Anzahl der verfügbaren CPUs. Für \fIART\fP werden folgende Werte unterstützt: .PD 0 .IP \(bu 4 \fBtotal\fP: Gesamtanzahl der verfügbaren CPUs (gleichbedeutend mit \fB%getncpus\fP) .IP \(bu 4 \fBproc\fP: Anzahl der für Prozesse verfügbaren CPUs .IP \(bu 4 \fBthread\fP: Anzahl der für Threads verfügbaren CPUs .PD .PP \fBproc\fP und \fBthread\fP berücksichtigen den verfügbaren Speicher, einschließlich Adressraumbeschränkungen für Threads. .PP Hinzugefügt: 4.19.0. .PP Beispiel: .nf .RS 4 %{getncpus proc} .fi .RE .PP .RE \fB%getconfdir\fP .RS 4 Expandiert zum »Home«\-Verzeichnis von RPM (typischerweise \fI/usr/lib/rpm\fP). .PP .RE \fB%{getenv:\fP\fINAME\fP\fB}\fP .RS 4 Makro analog zu \fBgetenv\fP(3). .PP Beispiel: .nf .RS 4 %{getenv:HOME} .fi .RE .PP .RE \fB%rpmversion\fP .RS 4 Wird zu der laufenden RPM\-Version expandiert. .PP .RE .SS Ausgabe \fB%{echo:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Schreibt die \fIZEICHENKETTE\fP in die Standardausgabe des Prozesses. .PP Beispiel: .nf .RS 4 %{echo:Building with foo} .fi .RE .PP .RE \fB%{warn:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Schreibt die \fIZEICHENKETTE\fP in die Standardfehlerausgabe des Prozesses und stellt »warning: « voran. .PP Beispiel: .nf .RS 4 %{warning:Foo is deprecated} .fi .RE .PP .RE \fB%{error:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Schreibt die \fIZEICHENKETTE\fP in die Standardfehlerausgabe des Prozesses und stellt »error: « voran und löst einen Fehler im Makroprozessor aus. .PP Beispiel: .nf .RS 4 %{error:Invalid argument} .fi .RE .PP .RE \fB%verbose\fP .RS 4 Expandiert zu 1/0, je nachdem, ob RPM im ausführlichen Modus ausgeführt wird oder nicht. (Hinzugefügt: 4.17.1) .PP .RE \fB%{verbose:\fP\fIZEICHENKETTE\fP\fB}\fP .RS 4 Expandiert zur \fIZEICHENKETTE\fP, falls RPM im ausführlichen Modus ausgeführt wird, und gibt eine leere Zeichenkette aus, falls nicht. (Hinzugefügt: 4.17.1) .PP Beispiel: .nf .RS 4 %{verbose:\-x} .fi .RE .PP .RE .SS "Spec\-spezifische Makros" \fB%{S:\fP\fINUMMER\fP\fB}\fP .RS 4 Expandiert zum Dateinamen der angegebenen Quelle (»Source*«) \fINUMMER\fP. \fB%{S:n}\fP ist gleichbedeutend mit \fB%{SOURCEn}\fP. .PP .RE \fB%{P:\fP\fINUMMER\fP\fB}\fP .RS 4 Expandiert zum Dateinamen des angegebenen Patches (»Patch*«) \fINUMMER\fP. \fB%{P:n}\fP ist gleichbedeutend mit \fB%{PATCHn}\fP. .PP .RE .SS Diagnostik \fB%trace\fP .RS 4 Schaltet die Ausgabe von Debugging\-Informationen vor bzw. nach der Expansion um. .PP .RE \fB%dump\fP .RS 4 Gibt die aktive (das heißt, nicht überdeckte) Makrotabelle aus. .PP .RE \fB%__file_name\fP .RS 4 Wird zum aktuellen Dateinamen expandiert (falls eine Datei ausgewertet wird). (Hinzugefügt: 4.15) .PP .RE \fB%__file_lineno\fP .RS 4 Wird zur aktuellen Zeilennummer in der aktuellen Datei expandiert (falls eine Datei ausgewertet wird). Hinzugefügt: 4.15. .PP .RE .SH BEISPIELE .SS "Beispiel 1: Definieren eines einfachen Makros" Das Makro \fBmylib\fP in einer Spec\-Datei auf einen Pfad relativ zum \fB%{_libdir}\fP\-Makro setzen: .PP .nf .RS 4 %define mylib %{_libdir}/mein .fi .RE .PP .SS "Beispiel 2: Ein parametrisches Makro definieren" Das parametrische Makro \fBmyhelper\fP definieren, das das durch \fB%myprog\fP angegebene Programm mit seinem ersten Argument ausführt und ihm immer die Option \fB\-\-some\-opt\fP übergibt, sowie zusätzlich die Option \fB\-\-xtra\fP, wenn es selbst die Option \fB\-x\fP erhalten hat: .PP .nf .RS 4 %define myhelper(x) %{myprog} \-\-some\-opt %{?\-x:\-\-xtra} %{1} .fi .RE .PP .SS "Beispiel 3: Ein Makro mittels Shell\-Expansion definieren" Definieren des Makros \fB%today\fP, das mithilfe des Shell\-Dienstprogramms \fBdate\fP(1) zum aktuellen Datum im Format \fIJJMMTT\fP expandiert. Beachten Sie das zweite \fB%\fP, das zum Maskieren der Argumente für \fBdate\fP(1) benötigt wird: .PP .nf .RS 4 %define today %(date +%%y%%m%%d) .fi .RE .PP .SS "Beispiel 4: Ein bedingtes Makro definieren" Das Makro \fBmypath\fP definieren, sofern es nicht bereits zuvor definiert wurde: .PP .nf .RS 4 %{!?mypath: %define mypath /ir/gend/wo} .fi .RE .PP .SS "Beispiel 5: Bedingte Expansion" Expandiert zu \fB1\fP, falls \fBuse_foo\fP definiert ist, anderenfalls zu \fB0\fP: .PP .nf .RS 4 %{?use_foo:1}%{!?use_foo:0} .fi .RE .PP .SS "Beispiel 6 – Ausdrücke" 5 * 1024 berechnen: .PP .nf .RS 4 %[5 * 1024] .fi .RE .PP Zu wörtlichem \fBtrue\fP oder \fBfalse\fP expandieren, abhängig von einer Bedingung: .PP .nf .RS 4 %[1 < 2 ? "true" : "false"] .fi .RE .PP Versionen vergleichen; zu \fB1\fP (wahr) oder \fB0\fP (falsch) expandieren: .PP .nf .RS 4 %[ v"3\&.1\&.0\-1" < v"1\&.0~alpha\-2" ? 1 : 0] .fi .RE .PP Zu \fB1\fP expandieren, falls \fB%aa\fP zu \fB5\fP expandiert, anderenfalls zu \fB2\fP expandieren: .PP .nf .RS 4 %[ "%{aa}" == "5" ? 1 : 2] .fi .RE .PP .SH DEBUGGING Einige nützliche Werkzeuge zum Arbeiten mit Makros und zur Fehlerbehebung: .PP \fBrpm \-\-eval "\fP\fIWERT\fP\fB"\fP .RS 4 Expandiert den angegebenen \fIWERT\fP in der Befehlszeile. .PP .RE \fBrpm \-\-define "aa 11" \-\-eval "%aa"\fP .RS 4 Definiert und berechnet ein Makro in der Befehlszeile. .PP .RE \fBrpm \-\-eval "%global unamer %(uname \-r)" \-\-eval "%{macrobody:unamer}"\fP .RS 4 Definiert und untersucht den Makro\-Textkörper mit \fB%global\fP in der Befehlszeile. .PP .RE \fBrpm \-\-eval "%define unamer %(uname \-r)" \-\-eval "%{macrobody:unamer}"\fP .RS 4 Definiert und untersucht den Makro\-Textkörper mit \fB%define\fP in der Befehlszeile. .PP .RE \fBrpmlua\fP .RS 4 Führt eine interaktive Shell in der eingebetteten Lua\-Umgebung aus. .PP .RE \fBrpmlua \-e '\&print(macros.\&defined("_libdir"))'\&\fP .RS 4 Mit dem eingebetteten eigenständigen Lua\-Interpreter wird »1/0« ausgegeben, abhängig davon, ob das Makro \fB_libdir\fP definiert ist oder nicht. .PP .RE \fBrpmspec \-\-shell\fP .RS 4 Eine interaktive Shell in der Makro\-Umgebung ausführen. .PP .RE \fBrpmspec \-\-shell telnet.spec\fP .RS 4 Nach dem Auswerten von \fBtelnet.spec\fP eine interaktive Shell in der Makroumgebung ausführen. .PP .RE .SH "SIEHE AUCH" \fBrpm\fP(8), \fBrpm\-common\fP(8), \fBrpm\-macrofile\fP(5), \fBrpm\-config\fP(5), \fBrpm\-lua\fP(7), \fBrpmspec\fP(1), \fBrpmlua\fP(1) .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Mario Blättermann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer: .MT debian-l10n-german@lists.debian.org .ME .