RPM-Makros
RPM bietet eine Vielzahl von Makros, um die Paketbetreuung zu vereinfachen und konsistenter zu gestalten. Beispielsweise enthält es eine Liste von Standardpfaddefinitionen, die von den Bausystem-Makros verwendet werden, sowie Definitionen für spezifische Verzeichnisse, die beim Bau von RPM-Paketen benötigt werden. Diese sollten in der Regel anstelle von fest kodierten Verzeichnissen verwendet werden. Außerdem stellt RPM die Standard-Compiler-Flags als Makros bereit, die beim manuellen Kompilieren ohne Bausystem verwendet werden sollten.
Abrufen und Festlegen von Makros in der Befehlszeile
Es ist möglich, RPM beliebige Zeichenketten, die Makros enthalten, über die Befehlszeile auswerten zu lassen, indem Sie rpm --eval in der Befehlszeile ausführen:
$ rpm --eval "some text printed on %{_arch}"
some text printed on x86_64
Zusätzlich können Sie Werte für Makros temporär angeben (und auch wieder außer Kraft setzen), indem Sie Befehlszeilenoptionen für rpm und rpmbuild bereitstellen:
$ rpm --define "test Hello, World!" --eval "%{test}"
Hello, World!
Makros für von Buildsystemen gesetzte und verwendete Pfade
Die Makros für Bausystemaufrufe (z.B. %configure, %cmake oder %meson) verwenden die von RPM definierten Werte, um Installationspfade für Pakete festzulegen. Daher ist es in der Regel ratsam, diese Pfade auch in Spec-Dateien nicht fest zu kodieren, sondern aus Gründen der Konsistenz dieselben Makros zu verwenden.
Die Werte für diese Makros finden Sie im Verzeichnis /usr/lib/rpm/platform/*/macros für die jeweilige Plattform.
Die folgende Tabelle listet Makros auf, die in .spec-Dateien in Fedora häufig verwendet werden.
| Makro | Definition | Kommentar |
|---|---|---|
|
|
|
|
|
kann für Flatpak-Builds auf |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
|
|
|
|
|
|
|
|
|
|
Einige selten verwendete Makros sind der Vollständigkeit halber unten aufgeführt. Ältere .spec-Dateien verwenden sie möglicherweise noch, und es kann Fälle geben, in denen sie weiterhin benötigt werden.
| Makro | Definition | Kommentar |
|---|---|---|
|
|
Vorgabe: |
|
|
|
|
|
historisch |
|
|
Vorgabe: |
|
|
|
|
|
Vorgabe: |
|
|
Vorgabe: |
|
|
alte fehlerhafte Schreibweise, für Kompatiblitätszwecke |
Für den RPM- (und SRPM-) Bauprozess festgelegte Makros
RPM stellt über Makros auch die Speicherorte einiger Verzeichnisse bereit, die für den Paketbauprozess relevant sind.
Das einzige Makro, das in .spec-Dateien weit verbreitet ist, ist %{buildroot}, welches auf das Wurzelverzeichnis des Installationsziels verweist. Es wird verwendet, um DESTDIR im %install-Schritt des Pakets festzulegen.
Die anderen Makros werden üblicherweise nur außerhalb von .spec-Dateien verwendet. Beispielsweise werden sie von fedpkg gesetzt, um die Standardverzeichnisse außer Kraft zu setzen.
| Makro | Definition | Kommentar |
|---|---|---|
|
|
gleichbedeutend mit |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Makros, die Compiler- und Linker-Flags bereitstellen
Die Standard-Build-Flags für Binärdateien unter Fedora sind über Makros verfügbar. Sie werden von den Bausystem-Makros verwendet, um die Bauumgebung einzurichten, daher ist es normalerweise nicht notwendig, sie direkt zu verwenden – außer beispielsweise bei einer minimalen Kompilierung mit gcc.
Die unten aufgeführten Flags spiegeln den aktuellen Zustand von Fedora 42 auf einem x86_64-Rechner wider, wie er in der Datei /usr/lib/rpm/redhat/macros definiert ist.
Das Makro %{optflags} enthält Flags, die CFLAGS, CXXFLAGS, FFLAGS usw. bestimmen.
Die aktuellen Definitionen dieser Werte finden Sie im Paket redhat-rpm-config in den build flags documentation.
$ rpm --eval "%{optflags}"
-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
Der Wert der von Bausystemen gesetzten Umgebungsvariablen LDFLAGS wird durch das Makro %{build_ldflags} bestimmt:
$ rpm -E "%{build_ldflags}"
-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1
Want to help? Learn how to contribute to Fedora Docs ›