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

%{_sysconfdir}

/etc

%{_prefix}

/usr

kann für Flatpak-Builds auf /app gesetzt werden

%{_exec_prefix}

%{_prefix}

Vorgabe: /usr

%{_includedir}

%{_prefix}/include

Vorgabe: /usr/include

%{_bindir}

%{_exec_prefix}/bin

Vorgabe: /usr/bin

%{_libdir}

%{_exec_prefix}/%{_lib}

Vorgabe: /usr/%{_lib}

%{_libexecdir}

%{_exec_prefix}/libexec

Vorgabe: /usr/libexec

%{_datadir}

%{_datarootdir}

Vorgabe: /usr/share

%{_infodir}

%{_datarootdir}/info

Vorgabe: /usr/share/info

%{_mandir}

%{_datarootdir}/man

Vorgabe: /usr/share/man

%{_docdir}

%{_datadir}/doc

Vorgabe: /usr/share/doc

%{_rundir}

/run

%{_localstatedir}

/var

%{_sharedstatedir}

/var/lib

%{_lib}

lib64

lib auf 32bit-Plattformen

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

%{_datarootdir}

%{_prefix}/share

Vorgabe: /usr/share

%{_var}

/var

%{_sbindir}

same as %{_bindir}

historisch /usr/sbin, jetzt /usr/bin, für Kompatibilitätszwecke

%{_tmppath}

%{_var}/tmp

Vorgabe: /var/tmp

%{_usr}

/usr

%{_usrsrc}

%{_usr}/src

Vorgabe: /usr/src

%{_initddir}

%{_sysconfdir}/rc.d/init.d

Vorgabe: /etc/rc.d/init.d

%{_initrddir}

%{_initddir}

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

%{buildroot}

%{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}

gleichbedeutend mit $BUILDROOT

%{_topdir}

%{getenv:HOME}/rpmbuild

%{_builddir}

%{_topdir}/BUILD

%{_rpmdir}

%{_topdir}/RPMS

%{_sourcedir}

%{_topdir}/SOURCES

%{_specdir}

%{_topdir}/SPECS

%{_srcrpmdir}

%{_topdir}/SRPMS

%{_buildrootdir}

%{_topdir}/BUILDROOT

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