Paketbau/SUSE-Paketkonventionen/RPM-Makros
aus openSUSE, der freien Wissensdatenbank
3. RPM-Makros
Dieses Kapitel beschreibt in SUSE-Paketen genutzte vordefinierte RPM-Makros, von denen einige allgemeine RPM-Makros sind und mache SUSE-spezifische. Informationen zu anderen, allgemeinen Makros finden Sie in anderer Dokumentation wie Maximum RPM
.
Ein wichtiger Unterschied zwischen RPM-Makros und normalen Linux-Kommandos ist, wie die Optionen und Parameter definiert werden. RPM bietet nur eine einfache Unterstützung zur Verarbeitung von Optionen. Eine Begrenzung besteht darin, dass alle Optionen vor den Parametern definiert werden müssen und es ist nicht einfach möglich, aus Optionen und dazugehörenden Werten gebildete Paare zu nutzen. Das Linux-Kommando top nutzt zum Beispiel die folgende Zusammenfassung:
top [-bcisS] [-d delay] [-n iterations] [-p pid] [, pid ...]
Die genutzten Paare -d delay, -n iterations, -p pid und alle Parameter sind optional. Die Option vor einem Parameter gibt an, welcher Parameter wirklich genutzt wird. Dies ermöglicht solcherart Aufrufe:
Beispiel 1: top -n 20 -p 10345
Beispiel 2: top -d 1 -p 10345
Das Kommando weiß dann, dass 20 eine Anzahl von Wiederholungen ist, 1 die Verzögerung und 10345 eine pid ist.
Auf Grunde der Einschränkungen von RPM würde die Zusammenfassung eines zugehörigen RPM-Makros wie folgt aussehen:
%top [-bcisSdnp] [delay] [iterations] [pid] [,pid ...]
Alle Optionen müssen hierbei vor den Parametern definiert werden und die Option definiert wieder, welcher Parameter wirklich genutzt wird. Das heißt, dass der potentielle Aufruf des zum obigen Beispiel gehörenden RPM-Makros folgendermaßen aussieht:
Beispiel 1: %top -d -p 5 10345
Beispiel 2: %top -d -p 1 460
3.1. %_docdir
Dieses Makro setzt das Standardverzeichnis für Dokumentation ein: /usr/share/doc/packages. Es kann mit dem Docdir Tag umdefiniert werden. Normalerweise wird es zum Installieren von Dokumentation im Abschnitt %install verwendet, falls es nicht reicht, dies mit dem Tag %doc im Abschnitt %files zu erledigen. Das Tag %doc muss bei de Verwendung von %_docdir im Abschnitt %files nicht zusätzlich angegeben werden, da dies automatisch für dieses Verzeichnis geschieht.
Das folgende Beispiel entstammt dem Paket aeolus:
%install
[...]
mkdir -p $RPM_BUILD_ROOT%{_docdir}/%{name}
cp .aeolusrc $RPM_BUILD_ROOT%{_docdir}/%{name}/aeolusrc
cp -R stops-* $RPM_BUILD_ROOT%{_docdir}/%{name}
[...]
%files
[...]
%{_docdir}/%{name}
3.2. %_infodir
Dieses Makro setzt das Standardverzeichnis für info-Seiten ein: /usr/share/info. Es wird oft mit ./configure --infodir=%_infodir mit dem %install_info-Makro und in der Dateiliste verwendet. Wie bei %_docdir muss das Tag %doc nicht zusammen mit %_infodir im Abschnitt %files angegeben werden, da es automatisch für dieses Verzeichnis geschieht.
3.3. %_lib
Dieses Makro setzt entweder lib oder lib64 ein. Die zweite Variante taucht auf 64-bit-Architekturen auf, die die parallele Ausführung von 64-bit- und 32-bit-Anwendungen unterstützen (biarch-Systeme). Auf solchen Systemen müssen zwei Varianten der selben Bibliothek nebeneinander existieren, weshalb 64-bit-Bibliotheken in lib64-Verzeichnisse und 32-bit-Bibliotheken in lib-Verzeichnisse installiert werden.
Es wird genutzt, wenn das Makro %_libdir nicht ausreicht, zum Beispiel wenn die Bibliotheken in /usr/X11R6/lib landen sollen. Es wird oft mit ./configure –libdir=/usr/X11R6/%_lib und in der Dateiliste verwendet.
3.4. %_libdir
Dieses Makro setzt auf biarch-Systemen /usr/lib64 und /usr/lib auf anderen Systemen ein. Es hat die selbe Funktion wie %_lib und wird wesentlich öfter genutzt als %_lib, da die Bibliotheken normalerweise unter /usr/lib installiert werden. Auch dieses wird oft mit ./configure –libdir=%_libdir und in der Dateiliste verwendet.
3.5. %_mandir
Dieses Makro setzt das Standardverzeichnis für manual-Seiten ein: /usr/share/man. Es wird oft mit ./configure --mandir=%_mandir und im Abschnitt %files, etwa als %_mandir/man5/*, genutzt.
So wie bei %_docdir und %_infodir ist auch hier das Tag %doc im Abschnitt %files nicht zusammen mit %_mandir nötig, da es für dieses Verzeichnis automatisch erledigt wird.
3.6. %fillup_and_insserv
Dieses Makro kann dazu genutzt werden, sysconfig-Dateien zu füllen und init-Skripte einzurichten (insserv).
Übersicht:
%fillup_and_insserv [-finpsyY] [sysconfig_filename] [init_script_name] [START_variable]] ...
Das Makro %fillup_and_insserv vereint zwei Funktionen in einem Kommando. Es wird genutzt, um Konfigurationsdateien unter /etc/sysconfig einzufügen (fill up) und um Dienste in Runleveln zu aktivieren (insserv). Der fillup-Teil erwartet eine unter /var/adm/fillup-templates/sysconfig.[sysconfig_filename][.][%name] gespeicherte Vorlage.
Das Makro wird im %post-Skript von Pakete genutzt, die ein init-Skript installieren und es standardmäßig aktivieren wollen. Es wird auch genutzt, wenn das init-Skript schon vor SL 8.0 existierte, als die START-Variablen genutzt wurden. Weiter Informationen dazu finden Sie in Abschnitt 7.8 "Installation von Init-Skripten". Vergessen Sie nicht, die verwendeten Werkzeuge im PreReq Tag anzugeben; diesem Zweck dienen die Makros %insserv_prereq und %fillup_prereq.
Optionen:
-
-füberspringt den fillup-Teil. -
-iüberspringt den insserv-Teil. -
-ngibt an, dass der Parametersysconfig_filenamegenutzt wird (siehe unten). -
-pwird aus gründen den Rückkompatibilität ignoriert. -
-sgibt an, dass der ParameterSTART_variablegenutzt wird (siehe unten). -
-ysetzt die START-Variablen standardmäßig auf“yes”. Wird ignoriert, falls im Init-SkriptX-UnitedLinux-Default-Enabledangegeben ist. -
-Yerzwingt das Setzten der SART-Variable auf“yes”. Das heißt, dass der Dienst immer aktiviert ist, ungeachtet der Einstellung vor einer Aktualisierung.
Parameter:
-
sysconfig_filenamebildet mit der Option-nein Paar und definiert den Dateinamen, in den die Konfiguration gefüllt werden soll;/etc/sysconfig/sysconfig_filename.
Zusätzlich definiert der Parameter einen Namen der Dateien mit den Vorlagen. Das Makros such nach zwei möglichen Vorlagendateien. Es bevorzugt dabei/var/adm/fillup-templates/sysconfig.sysconfig_filename.%name, falls dies verfügbar ist. andernfalls sucht es nach/var/adm/fillup-templates/sysconfig.sysconfig_filename. Die längere Variante muss genutzt werden, falls mehere Pakete in die gleiche Konfigurationsdatei schreiben.
Standardmäßig (die Option -n bleibt ungenutzt) ist /var/adm/fillup-templates/sysconfig.%name die Vorlage und die sysconfig-Zieldatei ist /etc/sysconfig/%name.
-
init_script_namedefiniert den Namen des von insserv berarbeiteten Init-Skripts. Muss angegeben werden, wenn die Option-inicht genutzt wird. Es können mehere Init-Skriptnamen angegeben werden (siehe Beispiele weiter unten). -
START_variablebildet mit der Option-sein Paar und definiert den Namen der START-Variablen neu, welche bei einer Aktualisierung geprüft wird. Daneben bildet er Paare mit dem Parameterinit_script_name. Alle Paare müssen vollständig sein, falls die Option-sgesetzt ist und mehrere Init-Skripte auf einmal verarbeitet werden (sie Beispiel weiter unten). Bei den Hinweisen in Kapitel 7.8 "Installation von Init-Skripten" finden Sie weitere Informationen über START-Variablen.
Standardmäßig (die Option-sbliebt ungenutzt) wird der Name der START-Variablen vom Parameterinit_script_nameabgeleitet. Konkret wird dabei der Wert voninit_script_namein Großbuchstaben umgewandelt und erhält die VorsilbeSTART_(siehe Beispiele weiter unten).
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
mailman(zeigt auch die zugehörigen Teile desPreReqTag):
PreReq: ... %insserv_prereq %fillup_prereq ...
%post
%{fillup_and_insserv mailman}
- Es füllt die Konfiguratiosndatei
/etc/sysconfig/mailmanaus der Vorlage/var/adm/fillup-templates/sysconfig.mailman. Es lässt insserv über/etc/init.d/mailmanlaufen, indem die VariableSTART_MAILMANgeprüft wird.
- 2. Diese Beispiel entstammt dem Paket hwinfo (zeigt auch die zugehörigen Teile des
PreReqTag):
PreReq: ... %insserv_prereq
%post
[...]
%{fillup_and_insserv -fy hwscan}
- Es lässt insserv über
/etc/init.d/hwscanlaufen und aktiviert den Dienst standardmäßig. Beachten Sie, dass sich hier nur derinsserv-Teil unterPreReqbefindet, da derfillup-Teil mit der Option-fübersprungen wird.
- 3. Dieses Beispiel entstammt dem Paket
openssh:
%{fillup_and_insserv -n -y ssh sshd}
- Es füllt die Konfigurationsdatei
/etc/sysconfig/sshauf. Die Vorlage wird entweder/var/adm/fillup-templates/sysconfig.ssh.opensshoder/var/adm/fillup-templates/sysconfig.sshentnommen, wobei die erste Vorlage bevorzugt wird. Es lässt insserv über/etc/init.d/sshdlaufen, indem es die VariableSTART_SSHDprüft. Der Dienst wird standardmäßig aktiviert.
- 4. Dieses Beispiel entstammt dem Paket
apache:
%{fillup_and_insserv -s apache START_HTTPD}
- Es füllt die Konfigurationsdatei
/etc/sysconfig/apacheaus der Vorlage/var/adm/fillup-templates/sysconfig.apache. Es lässt insserv über/etc/init.d/apachelaufen, indem es die VariableSTART_HTTPDprüft.
- 5. Dieses Beispiel entstammt dem Paket
openldap2:
%{fillup_and_insserv -n openldap ldap slurpd}
- Es füllt die Konfigurationsdatei
/etc/sysconfig/openldap. Die Vorlage wird entweder/var/adm/fillup-templates/sysconfig.openldap.openldap2oder/var/adm/fillup-templates/sysconfig.openldapentnommen, wobei die erste Datei bevorzugt wird. Es lässt insserv über/etc/init.d/ldaplaufen, indem es die VariableSTART_LDAPüberprüft. Dazu lässt es insserv über/etc/init.d/slurpdlaufen, indem es die VariableSTART_SLURPDüberprüft.
- 6. Dieses Beispiel zeigt die Verwendung der Option
-sfür mehere Init-Skripte:
%{fillup_and_insserv -n -s openldap ldap START_LDAP slurpd START_SLURPD}
- Hierbei wird das selbe gemacht, wie im vorherigen Beispiel. Der einzige Unterschied besteht darin, dass die START-Variablen hier explizit angegeben sind.
3.7. %fillup_only
Dieses Makro kann genutzt werden, um sysconifg-Dateien aufzufüllen.
Übersicht:
%fillup_only [-adns] [sysconfig_filename] [suffix] [sysconfig_subdir]
Das Makro %fillup_only wird genutzt, um die Variablen aus ein Vorlage /var/adm/fillup-templates/sysconfig.sysconfig_filename[-suffix] ein eine Konfigurationsdatei /etc/sysconfig/sysconfig_filename zu füllen (fill up). Die Basisfunktion ähnelt der von %fillup_and_insserv -i, allerdings erlaubt sie es auch, Konfigurationsdateien in Unterverzeichnissen von /etc/sysconfig zu verändern.
Das Makro wird typischerweise im %post-Skript genutzt. Vergessen Sie nicht, die genutzten Dienstprogramme im PreReq Tag anzugeben. Für diesen Zweck gibt es das Makro %fillup_prereq.
Optionen:
-
-anutzt den Paketnamen als Endsilbe für die Datei mit der sysconfig-Vorlage. -
-dgibt an, dass der Parametersysconf_subdirgenutzt wird (siehe unten). -
-ngibt an, dass der Parametersysconfig_filenamegenutzt wird (siehe unten). -
-sgibt an, dass der Parametersuffixgenutzt wird (siehe unten).
Parameter:
-
sysconfig_filenamebildet mit der Option-nein Paar und definiert den Namen der sysconfig-Datei und einen Namen der Vorlagendatei.
Standardmäßig (bei ungenutzter Option-n) wird stattdessen de Paketname genutzt. So wird dann die Voralge/var/adm/fillup-templates/sysconfig.%namezum Auffüllen von/etc/sysconfig/%nameverwendet. -
sysconfig_template_filename_suffixbildet mit der Option-sein Paar und definiert eine Endsilbe für den Dateinamen der Vorlage. -
sysconfig_subdirbildet mit der Option-dein Paar und definiert ein Unterverzeichnis von/etc/sysconfig, in welchem sich die sysconfig-Dateien befinden.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
tetex(und zeigt auch die zugehörigen Teile imPreReqTag):
PreReq: %fillup_prereq ...
%post
%{fillup_only}
- Es füllt die Konfigurationsdatei
/etc/sysconfig/tetexmit dem Inhalt der Vorlage/var/adm/fillup-templates/sysconfig.tetexauf.
- 2. Dieses Beispiel entstammt dem Paket
man:
%{fillup_only -an cron}
- Es füllt die Konfigurationsdatei
/etc/sysconfig/cronmit dem Inhalt der Vorlage/var/adm/fillup-templates/sysconfig.cron-manauf.
- 3. Dieses Beispiel entstammt dem Paket
dhcp:
%{fillup_only -ans syslog dhcpd}
- Es füllt die Konfigurationsdatei
/etc/sysconfig/syslogmit dem Inhalt der Vorlage/var/adm/fillup-templates/sysconfig.syslog-dhcpdauf.
- 4. Dieses Beispiel entstammt dem Paket
samba:
%fillup_only -nsd dhcp samba-client network
- Es füllt die Konfigurationsdatei file
/etc/sysconfig/network/dhcpmit dem Inhalt der Vorlage/var/adm/fillup-templates/sysconfig.dhcp-samba-clientauf.
3.8. %find_lang
Dieses Makro hilft, sprachabhängige Dateien mit dem zuigehörigen %lang Tag in der Dateiliste zu markieren.
Übersicht:
%find_lang name [filelist]
Das Makro %find_lang durchsucht die Verzeichnisse /usr/share/locale und locale/*/LC_MESSAGES nach name.mo-Dateien. Außerdem durchsucht es die Verzeichnisse gnome/help/name und kde*/share/doc/HTML/*/name nach lokalisierter Dokumentation. Aus diesen Ergebnissen wird die Datei filelist erstellt, in der die geunfendenen Dateien zusammen mit dem zugehörigen %lang(locale) Tag und (falls passend) dem %doc Tag aufgelistet werden. So eine Datei kann dann über die Option -f an das %files Tag weitergeleitet werden. Weiter unten finden Sie ein Beispiel dazu.
Es wird empfohlen, dieses Makro nur zu verwenden, wenn das BuildRoot Tag definiert ist, da ansonsten das ganze System durchsucht wird.
Parameter:
name definiert den Namen von .mo-Dateien und den Namen der Unterverzeichniss, in denen lokalisierte Dokumentation für GNOME und KDE gespeichert ist. Falls der Parameter filelist nicht definiert ist, wird die Datei mit der Dateiliste ebenfalls nach dem hier angegebenen Namen benannt.
filelist definiert den Namen der Datei, in welcher die Liste der gefundenenen Dateien gespeichert wird. name.lang wird verwendet, falls nichts angegeben wird.
Dieses Beispiel entstammt derm Paket pan:
%install
make -i DESTDIR=$RPM_BUILD_ROOT install
%find_lang %{name} # generate a special file list
%files -f %{name}.lang # use the special file list
%defattr(-,root,root) # list the other files
%doc README ChangeLog AUTHORS TODO COPYING CREDITS
%attr(755,root,root) %{prefix}/bin/pan
[...]
3.9. %insserv_cleanup
Dieses Makro wird genutzt, um nach dem Entferenen eines Pakets insserv aufzuräumen und sollte von jedem Paket, dass ein Init-Skript enthält, im %postun-Skript genutzt werden.
Dieses Beispiel entstammt dem Paket openldap2:
%postun %restart_on_update ldap slurpd %insserv_cleanup
3.10. %insserv_force_if_yast
Dieses Makro ist ein einfacher Aufruf des Dienstprogramms insserv, falls das Paket nicht durch YaST installiert wird. Falls YaST genutzt wird, lautete der Aufruf insserv -f. Dies hilft, Fehler bei Paketinstallationen "aus der Reihe" zu vermeiden.
Das Makro wird im %post-Skript von Paketen genutzt, die ein Init-Skript installieren und dies standardmäßig aktivieren wollen. Es wird auch beim Verwenden der START-Variablen genutzt, wenn das Init-Skript schon vor SL 8.0 existierte. Siehe Kapitel 7, Abschnitt 8 "Installation von Init-Skripten" für weitere Details. Vergessen Sie nicht, die vernwendeten Dienstprogramme im PreReq Tag einzutragen, wofür die Makros %insserv_prereq und %fillup_prereq bereitstehen.
Dieses Beispiel entstammt dem Unterpaket Paket nscd des Pakets glibc (und zeigt auch das zugehörige PreReq Tag an):
%package -n nscd
[...]
PreReq: %insserv_prereq
%post -n nscd
%{insserv_force_if_yast nscd}
3.11. %install_info
Dieses Makro aktualisiert Verzeichniseinträge für info-Datein.
Übersicht:
%install_info install_info_options
Das Makro %install_info lässt bin/install-info mit einigen zusätzlichen Tests laufen und akzeptiert dabei jede Option des install-info-Dienstprogramms. Mit man install-info erhalten Sie weitere Details dazu.
Jedes Paket, dass info-Seiten enthält, sollte dieses Makro im %post-Skript aufrufen. Vergessen Sie nicht, die verwendeten Dienstprogramme im PreReq Tag aufzuführen. Für diesen Zweck steht das Makro %install_info_prereq bereit.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
zsh(und zeigt auch das zugehörigePreReqTag):
PreReq: %install_info_prereq [...] %post %install_info --info-dir=%_infodir %_infodir/%name.info.gz
- 2. Dieses Beispiel entstammt dem Paket
rplay(einem Paket mit mehreren Info-Seiten). Das Beispiel zeigt auch das zugehörigePreReqTag:
PreReq: %install_info_prereq
[...]
%post
%install_info --info-dir=%{_infodir} %{_infodir}/%{name}.info.gz
%install_info --info-dir=%{_infodir} %{_infodir}/RPLAY.info.gz
%install_info --info-dir=%{_infodir} %{_infodir}/RPTP.info.gz
%install_info --info-dir=%{_infodir} %{_infodir}/librplay.info.gz
3.12. %install_info_delete
Dieses Makro entfernt Verzeichniseinträge für info-Dateien.
Übersicht:
%install_info_delete install_info_options
Das Makro %install_info_delete ist das Gegenstück zum Makro %install_info. Es führt sbin/install-info --quiet –delete mit einigen zusätzlichen Tests aus, wobei es jede Option des install-info-Dienstprogramms nutzen kann. Mit man install-info erhalten Sie weitere Details.
Jedes Paket, dass info-Seiten bereitstellt, sollte dieses Makro im %postun-Skript aufrufen. Vergessen Sie dabei nicht, die verwendeten Dienstprogramme im PreReq-Tag aufzuführen, wozu sich das Makro %install_info_prereq nutzen lässt.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
zsh(und zeigt auch das zugehörigePreReqTag):
PreReq: %install_info_prereq
[...]
%post
%install_info_delete --info-dir=%{_infodir} %{_infodir}/%{name}.info.gz
- 2. Dieses Beispiel entstammt dem Paket
rplay(einem Paket mit mehreren info-Seiten). Das Beispiel zeigt auch das zugehörigePreReqTag):
PreReq: %install_info_prereq
[...]
%postun
%install_info_delete --info-dir=%{_infodir} %{_infodir}/%{name}.info.gz
%install_info_delete --info-dir=%{_infodir} %{_infodir}/RPLAY.info.gz
%install_info_delete --info-dir=%{_infodir} %{_infodir}/RPTP.info.gz
%install_info_delete --info-dir=%{_infodir} %{_infodir}/librplay.info.gz
3.13. %perl_archlib
Dieses Makro setzt den Pfad ein, unter dem die architekturspezifischen Teile von Perl installiert sind, beispielsweise /usr/lib/perl5/5.8.5/i586-linux-thread-multi.
Es wird normalerweise nur vom perl-Paket selbst und vom Makro <class="systemitem">%perl_process_packlist</code> genutzt. Siehe weiter unten.
3.14. %perl_make_install
Dieses Makro ruft make install auf verschiedenen Produkten korrekt auf. Vor SL 9.0 sah der normale Weg wie folgt aus:
make PREFIX=$RPM_BUILD_ROOT/%_prefix \ INSTALLMAN1DIR=$RPM_BUILD_ROOT/%_mandir/man1 \ INSTALLMAN3DIR=$RPM_BUILD_ROOT/%_mandir/man3 \ install
Für 9.0 und spätere Versionen:
make DESTDIR=$RPM_BUILD_ROOT install_vendor
Mit dem Makro %perl_make_install wird dies für die jeweilige Version korrekt erledigt.
Dieses Beispiel entstammt dem Paket perl-URI:
%install %perl_make_install
3.15. %perl_process_packlist
Dieses Makro bereitet einige, zu Perl-Modulen gehörende Dateien, für das finale Paket vor, wobei es die folgenden Aktionen durchführt:
- Entfernt
$RPM_BUILD_ROOTvon%perl_archlib/perllocal.podund benennt die Datei in eine paketspezifische Datei um. Weiter untern finden Sie mehr Details - Sucht nach installierten
.packlist-Dateien und entfernt von diesen$RPM_BUILD_ROOT.
Jedes Paket, dass ein Perl-Modul enthält, sollte dieses Makro im Abschnitt %install aufrufen.
Die Datei %perl_archlib/perllocal.pod muss umbenannt werden, da sie Informationen über zusätzlich installierte Perl-Module enthält und von mehreren Paketen am gleichen Platz installiert werden kann. Au diesem Grund wird Sie umbenannt und ein spezielles SuSEconfig-Modul, /sbin/conf.d/SuSEconfig.perl, fügt die Informationen nach der Installation eines Pakets der System-%perl_archlib/perllocal.pod hinzu.
Das Beispiel entstammt dem Paket perl_URI:
%install
%perl_make_install
%perl_process_packlist
%files
[...]
/var/adm/perl-modules/%{name}
3.16. %perl_sitearch
Dieses Makro setzt den Pfad ein, unter dem architekturspezifische Teile von Perl-Modulen von einem lokalen Administrator installiert werden (/usr/lib/perl5/site_perl/5.8.5/i586-linux-thread-multi). Die Pakete die mit SUSE Linux ausgeliefert werden nutzen stattdessen den Pfad, der von %perl_vendorarch definiert wird, weiteres dazu weiter unten.
3.17. %perl_sitelib
Dieses Makro setzt den Pfad ein, unter dem architekturunabhängige Teile von Perl-Modulen von einem lokalen Administrator installiert werden (/usr/lib/perl5/site_perl/5.8.5). Die Pakete die mit SUSE Linux ausgeliefert werden nutzen stattdessen den Pfad, der von %perl_vendorlib definiert wird; weiteres dazu weiter unten.
3.18. %perl_vendoarch
Dieses Makro setzt den Pfad ein, unter dem architekturspezifische Teile von Perl-Modulen von Linux-Anbietern gespeichert werden (/usr/lib/perl5/vendor_perl/5.8.5/i586-linux-thread-multi). Das Makro wird meistens in der Dateiliste eingesetzt.
Das Beispiel entstammt dem Paket perl-URI:
%files
[...]
%{perl_vendorarch}/auto/URI
Dieser Pfad wird seit SL 9.0 benutzt. Bis dahin wurden die Perl-Module unter /usr/lib/perl5/site_perl gespeichert, indem das Makro %perl_sitearch genutzt wurde. Das Verzeichnis site_perl ist nun für Module gedacht, die von einem lokalen Administrator installiert werden (siehe auch weiter oben unter %perl_sitearch).
3.19. %perl_vendorlib
Dieses Makro setzt den Pfad ein, unter dem architekturunabhängige Teile von Perl-Modulen von einem Linux-Anbieter installiert werden (/usr/lib/perl5/vendor_perl/5.8.5). Das Makro wird zumeist in der Dateiliste genutzt.
Dieses Beispiel entstammt dem Paket perl-URI:
%files
[...]
%{perl_vendorlib}/URI.pm
%{perl_vendorlib}/URI
Dieser Pfad wird seit SL 9.0 genutzt. Bis dahin wurden die Perl-Module unter /usr/lib/perl5/site_perl gespeichert, indem das Makro %perl_sitearch genutzt wurde. Das Verzeichnis site_perl ist nun für Module gedacht, die vom lokalen Administrator installiert werden (siehe auch weiter oben unter %perl_sitelib).
3.20. %perl_version
Dieses Makro setzt die zum Bauen verwendete Version von Perl ein, beispielsweise 5.8.5. Es wird Paketen, die ein Perl-Modul enthalten, dazu genutzt, die Abhängigkeit zu Perl zu definieren.
Normalerweise wird es auf dem folgenden Weg genutzt. Dieses Beispiel entstammt dem Paket perl-URI:
Requires: perl = %{perl_version}
3.21. %py_incdir
Dieses Makro setzt den Pfad ein, unter dem die Python header-Dateien installiert sind, beispielsweise /usr/include/python2.3. Weitere Details dazu finden Sie in Kapitel 10.4 "Python-Module".
3.22. %py_libdir
Dieses Makro setzt den Pfad ein, unter dem Python-Module installiert sind, beispielweise /usr/lib/python2.3. Weitere Details dazu finden Sie in Kapitel 10.4 "Python-Module".
3.23. %py_requires
Dieses Makro setzt die Tags PreReq und BuildRequires ein und definiert dort Abhängigkeiten zur selben Python-Hauptversion, wie sie beim Bau verwendet wird. Weitere Details dazu finden Sie in Kapitel 10.4 "Python-Module".
3.24. %py_sitedir
Dieses Makro setzt den Pfad ein, unter dem alle Extra-Python-Module installiert sind, beispielsweise /usr/lib/python2.3/site-packages. Weitere Details dazu finden Sie in Kapitel 10.4 "Python-Module".
3.25. %py_ver
Dieses Makro setzt die Python-Hauptversion ein, beispielsweise 2.3. Weitere Details dazu finden Sie in Kapitel 10.4 "Python-Module".
3.26. %remove_and_set
Dieses Makro wird genutzt, um überflüssige sysconfig-Variablen zu entfernen.
Übersicht:
%remove_and_set [-ny] [sysconfig_filename] variable...
Das Makro %remove_and_set entfernt Variablen aus /etc/rc.config und /etc/sysconfig/sysconfig_filename und setzt sie für weitere Behandlung in der aktuellen Umgebung. Falls eine Variable nicht gefunden wird, wird sie standardmäßig auf "no" gesetzt oder im Fall der Nutzung der Option -y auf “yes”.
Optionen:
-
-ngibt an, dass der Parametersysconfig_filenamegenutzt wird (siehe unten). -
-ysetzt den Standardwert auf“yes”.
Parameter:
-
sysconfig_filenamebildet mit der Option-nein Paar und definiert den sysconfig-Dateinamen; andernfalls wird der Paketname (%name) für den sysconfig-Dateinamen genutzt. -
variabledefiniert den Namen einer zu entfernenden Variablen, wobei mehre Variablen angegeben werden können.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
postfix:
%{fillup_and_insserv -y postfix}
if [ -f etc/sysconfig/mail ]; then
. etc/sysconfig/mail
if [ -n "$NULLCLIENT" ]; then
RCTMP=etc/sysconfig/postfix.$$
sed "s/^POSTFIX_NULLCLIENT.*/POSTFIX_NULLCLIENT=\"$ \"/" \
etc/sysconfig/postfix > $RCTMP
mv $RCTMP etc/sysconfig/postfix
fi
fi
%{remove_and_set -n mail NULLCLIENT}
- Dieser Kode setzt die Variable
POSTFIX_NULLCLIENTausetc/sysconfig/postfixauf den Wert der überflüssigen VariableNULLCLIENTausetc/sysconfig/mail. Danach wird die überflüssige Variable entfernt.
- 2. Dieses Beispiel entstammt dem Paket
autofs:
%post
%{fillup_and_insserv autofs}
# needed for update from 7.3 and before
%{remove_and_set USE_NIS_FOR_AUTOFS USE_NISPLUS_FOR_AUTOFS}
if [ $USE_NIS_FOR_AUTOFS == "yes" ] ; then
if `grep "^automount:" etc/nsswitch.conf | \
grep -vqw nis` ; then
sed "s/^automount:.*/& nis/" < etc/nsswitch.conf \
>etc/nsswitch.conf.new
mv etc/nsswitch.conf.new etc/nsswitch.conf
fi
fi
if [ $USE_NISPLUS_FOR_AUTOFS == "yes" ] ; then
if `grep "^automount:" etc/nsswitch.conf | \
grep -vqw nisplus` ; then
sed "s/^automount:.*/& nisplus/" < etc/nsswitch.conf \
> etc/nsswitch.conf
mv etc/nsswitch.conf.new etc/nsswitch.conf
fi
fi
- Die überflüssigen Variablen
USE_NIS_FOR_AUTOFSundUSE_NISPLUS_FOR_AUTOFSwerden aus/etc/rc_configund/etc/sysconfig/autofsentfernt und die entfernten Werte werden zur Modifizierung einer aktuellen Konfiguration genutzt.
Die erkannten Werte können im vorherigen Beispiel nicht genutzt werden, da dass Makro %remove_and_set nur die Werte “yes” oder “no” in der Umgebung setzen kann.
3.27. %restart_on_update
Dieses Makro startet einen Dienst nach einer Aktualisierung neu.
Übersicht:
%restart_on_update service...
Das Makro %restart_on_update führt /etc/init.d/service try-restart aus, falls es nicht unter YaST im instsys-Modus läuft. Es können mehrere Dienste angegeben werden.
Dieses Makro wird normalerweise im %postun-Skript von Paketen genutzt, die einen Dienst anbieten. Es kann jedoch nicht genutzt werde, wenn nicht sicher ist, ob der Dienst nach einer Aktualisierung auch funktioniert.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
rsync:
%postun %restart_on_update rsyncd %insserv_cleanup
- 2. Dieses Beispiel entstammt dem Paket
samba(startet zwei Dienste neu):
%postun %restart_on_update nmb smb %insserv_cleanup
3.28. %run_ldconfig (auslaufend)
Dieses Makro führt ldconfig aus, falls es nicht von YaST aus aufgerufen wird. YaST führt ldconfig selber aus, nachdem alle ausgewählten Pakete installiert sind.
Es wurde in %post- und %postun-Skripten von Paketen genutzt, die eine Bibliothek bereitstellen. Dieses Makro wird nicht weiter unterstützt und sollte nicht mehr genutzt werden. Stattdessen sollte /sbin/ldconfig in beiden Skripten direkt aufgerufen werden, auch unter YaST, um andere %post-Skripte nicht zu brechen. Dies kann folgendermaßen ablaufen:
%post -p /sbin/ldconfig %postun -p /sbin/ldconfig
Falls ldconfig nicht das einzige Kommando ist, ist die Option -p nicht nutzbar. Das %post-Skript könnte dann etwa so aussehen:
%post /sbin/ldconfig [...]
3.29. %run_permissions
Dieses Skript fixiert die Berechtiungen für problematische Dateien, um sich an die Sicherheitseinstellungen des Systems zu halten. Dazu muss das Paket permissions installiert sein.
Es sollte im %post-Skript von Paketen aufgerufen werden, die eine Datei installieren, deren Zgriffsberechtigung in /etc/permissions.{easy,secure} oder /etc/permissions.d/%name.{easy,secure} definiert ist. Vergessen Sie nicht, dass Paket permissions im PreReq Tag anzugeben.
Es wird normalerweise zusammen mit dem Makro %verify_permissions verwendet.
Dieses Beispiel entstammt dem Paket xtetris (zeigt auch das zugehörige PreReq Tag):
PreReq: permissions [...] %post %run_permissions
3.30. %sles_version
Dieses Makro setzt die SLES-Version ein, auf dem das Paket gebaut wird. Dabei wird ”7” für SLES7, ”8” für SLES8, usw. eingesetzt. Es ist ”0” wenn nicht auf SLES gebaut wird.
Siehe auch %suse_version und %ul_version.
Dieses Beispiel entstammt dem Paket pam-modules:
%install
[...]
# On UL or SLES, we have other defaults
%if %sles_version >= 8
cp $RPM_SOURCE_DIR/pam_pwcheck.conf.sles \
$RPM_BUILD_ROOT/etc/security/pam_pwcheck.conf
%endif
3.31. %stop_on_removal
Dieses Makro stoppt einen Dienst, nachdem ein paket entfernt wurde.
Übersicht:
%stop_on_removal service...
Das Makro %stop_on_removal führt /etc/init.d/service stop falls es nicht unter YaST im instsys-Modus läuft. Es können mehere Dienste angegeben werden.
Jedes Paket, dass einen Dienst bereitstellt, der gestoppt werden kann, sollte dieses im %preun-Skript für all diese Dienste aufrufen.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
rsync:
%preun %stop_on_removal rsyncd
- 2. Dieses Beispiel entstammt dem Paket
samba(stoppt zwei Dienste):
%preun %stop_on_removal smb nmb
3.32. %suse_update_config
Dieses Makro aktualisiert eineige Dateien mit automatischem Zeug.
Nutzung:
%suse_update_config [-fcl] [dir ...]
Dieses Makro führt für das aktuelle und für alle als Parameter übergebenen Verzeichnisse die folgenden Aktionen aus:
-
config.guessundconfig.subwerden durch ihre aktuellsten Versionen aus/usr/share/automake*/überschrieben. -
depcompundmissingwerden hinzugefügt, falls sie in/usr/share/automake*/aber nicht im verarbeiteten Verzeichnis vorhanden sind. -
ltconfigundltmain.shwerden gepatched, umlinux-gnuundlinuxzu akzeptieren. -
/libwird bei manchen Erscheinungen inltconfigundltmain.shdurch/%_libersetzt.
Dieses Makro sollte in allen Paketen genutzt werden, die die problematischen Dateien nutzen. Es ist jedoch nicht notwendig, wenn autoreconf oder aclocal, libtoolize, automake und autoconf genutzt werden, da diese in der Lage sind, die benötigten Dinge zu aktualisieren.
Wenn dieses Makro im Abschnitt %prep genutzt wird, sollte seine Existenz geprüft werden. Dies erlaubt es, diesen Abschnitt auch auf anderen Distributionen auszuführen, auf denen dieses Makro nicht verfügbar ist. Ein Beispiel dazu erhalten Sie unten.
Optionen:
-
-c—config.guess,config.sub,depcompundmissingnicht aktualisieren -
-f— forcieren, Zeitstempel ignorieren -
-l—ltconfigundltmain.shnicht aktualisieren
Parameter:
-
dirgibt ein zusätzliches Verzeichnis an, in dem die Dateien aktualisiert werden solln, wobei mehrer Verzeichnisse angegeben werden können.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
libunicode:
%prep
%setup
%patch1
%{?suse_update_config:%{suse_update_config -f}}
%build
CFLAGS="$RPM_OPT_FLAGS" \
./configure --prefix=%{prefix} \
--libdir=%{prefix}/%_lib \
--sysconfdir=%{sysconfdir}
make
- 2. Dieses Beispiel entstammt dem Paket
xosview(aktualisiert Dateien in den Verzeichnissen./und./config):
%prep
%setup -q
%patch1 -p0 -b ".serial"
[...]
%{?suse_update_config:%{suse_update_config -f config}}
%build
%ifarch ppc
export SYSTEM=powerpc-suse-linux
%else
export SYSTEM=%{_target_cpu}-suse-linux
%endif
(cd config/; autoconf; cp configure ../)
./configure $SYSTEM \
--with-x \
--enable-auto-depend \
--enable-linux-syscalls \
--prefix=/usr/X11R6 \
--disable-linux-memstat
make clean
3.33. %suse_update_desktop_file
Dieses Makro aktualisiert .desktop-Dateien.
Übersicht:
%suse_update_desktop_file -c filename name comment exec icon [category]...
%suse_update_desktop_file [-inru] [-D docpath] [-N name] [-G genericname] filename [category]...
Das Makro %suse_update_desktop_file aktualisiert Übersetzungen, fügt Kategorien hinzu (benötigt zum Sortieren der Menüs) und führt einige Plausibilitätsprüfungen an den angegebenen .dekstop-Dateien durch. Es benötigt das Paket update-desktop-files.
Jedes Paket, dass eine .desktop-Datei mitbringt, sollte dieses Makro im Abschnitt %install für alle .desktop-Dateien aufrufen. Vergessen Sie dabei nicht, dass Paket update-desktop-files im BuildRequires Tag einzutragen, welches in den folgenden Metapaketen enthalten ist:
-
gnome2-devel-packages -
gtk2-devel-packages -
kde3-devel-packages -
qt3-devel-packages -
yast2-core-devel-packages -
yast2-devel-packages
Das Paket update-desktop-files muss nicht explizit im BuildRequires Tag eingetragen werden, falls sich dort schon eins der Metapakete befindet.
Optionen:
-
-cfilenamenamecommentexecicon[category] — erstellt eine neue .desktop-Datei, initialisiert durch die Parameterfilename,name,comment,exec,iconundcategory, die folgendermaßen aussieht:
[Desktop Entry] Name=name GenericName=comment Type=Application Exec=exec Icon=icon Categories=category;....
und installiert sie als $RPM_BUILD_ROOT/usr/share/applications/filename.desktop.
-
-i— Durchsucht$RPM_SOURCE_DIRund/usr/share/update-desktop-files/templatesnach der Vorlagefilename.desktopund installiert diese als$RPM_BUILD_ROOT/usr/share/applications/filename.desktop. -
-n— Die Übersetzungen werden nicht aktualisiert. Dies ist nützlich, falls die ZeilenName=undGenericName=eine Zeichenkette enthalten, die nicht übersetzt werden kann. -
-r— Ersetzt die in der .desktop-Datei definierten Kategorien durch die im Parameter category angegebenen. Standardmäßig werden die neuen Kategorien lediglich an die schon enthaltenen Kategorien angehängt. -
-u— Fügt der .desktop-Datei die ZeielX-SuSE-Unimportant=truehinzu. -
-DdocpathSetzt in der .desktop-Datei den Eintrag DocPath. -
-NnameSetzt in der .desktop-Datei den Eintrag Name. -
-GgenericnameSetzt in der .dekstop-Datei den Eintrag GenericName.
Parameter:
-
filenamegibt einen Dateinamen für die .desktop-Datei an. Als Wert wird der Dateinamen ohne.desktop-Endung genommen. -
categorywird genutzt, um die ZeileCategories=in der .desktop -Datei hinzuzufügen oder zu ändern. Diese Zeile wird genutzt, um Einträge in Untermenüs zu sortieren.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
kvim(zeigt auch die zugehörigen Teile desBuildRequiresTag und den Abschnitt%files):
BuildRequires: ... update-desktop-files ... %install [...] %suse_update_desktop_file KVim TextEditor %files [...] /opt/kde3/share/applnk/*/*.desktop
- Dieser Kode aktualisiert Übersetzungen im bereits installierten
/opt/kde3/share/applnk/Editors/KVim.desktop. Da die originale .desktop-Datei die ZeileCategories=nicht besitzt, wird sie mitCategories=TextEditor;initialisiert.
- 2. Dieses Beispiel entstammt dem Paket
crack-atack: (zeigt auch die zugehörigen Teile derBuildRequiresundSourceTags sowie den Abschnitt%files):
BuildRequires: ... update-desktop-files ... Source1: %name.desktop Source2: %name-xtreme.desktop [...] %install [...] %suse_update_desktop_file -i %name Game ArcadeGame %suse_update_desktop_file -i %name-xtreme Game ArcadeGame %files [...] /usr/share/applications/%name.desktop /usr/share/applications/%name-xtreme.desktop
- Dieser Kode findet die zwei Vorlagen in
$RPM_SOURCE_DIRund installiert sie unter/usr/share/applications. Im Abschnitt%filessehen Sie den endgültigen Pfad. Außerdem werden Übersetzungen aktualisiert. Da die Vorlagen die ZeileCategories=nicht enthalten, wird diese mitCategories=Game;ArcadeGame;initialisiert.
- 3. Dieses Beispiel entstammt dem Paket
koffice:
%install [...] %suse_update_desktop_file kugar Office Viewer %suse_update_desktop_file karbon -r Graphics VectorGraphics %suse_update_desktop_file kivio Office FlowChart %suse_update_desktop_file kpresenter Office Presentation %suse_update_desktop_file kchart Office FlowChart %suse_update_desktop_file kspread Office Spreadsheet %suse_update_desktop_file KThesaurus -u Office %suse_update_desktop_file kformula -u Office %suse_update_desktop_file kword Office WordProcessor %suse_update_desktop_file koshell -u Office Core-Office
- Dieser Kode aktualisiert Übersetzungen in bereits installierten .desktop-Dateien. Zusätzlich wird beispielsweise
Kthesaurus.desktopals unwichtig (unimportant) markiert und die überflüssige ZeileCategories=wird inkarbon.dekstopdurchCategories=VectorGraphics;ersetzt.
- 4. Dieses Beispiel entstammt dem Paket
qbrew:
%suse_update_desktop_file -c qbrew QBrew \ "A homebrewer's recipe calculator" \ qbrew "" Science
- 5. Dieser Kode erstellt eine .desktop-Datei:
[Desktop Entry] Name=QBrew GenericName=A homebrewer's recipe calculator Type=Application Exec=qbrew Icon= Categories=Science;
- Danach werden verfügbare Übersetzungen hinzugefügt und die Datei wird als
/usr/share/applications/qbrew.desktopinstalliert.
3.34. %suse_version
Dieses Makro setzt die Version des SUSE Linux ein, auf dem das Paket gebaut wird. Der Wert ist ”800” für SUSE Linux 8.0, ”810” für 8.1, usw.
Siehe auch %sles_version und %ul_version.
Dieses Beispiel entstammt dem Paket binutils:
%prep [...] # experimental stuff not for the older distributions %if %suse_version > 820 %patch6 %endif
3.35. %tcl_version
Dieses Makro setzt die Version von Tcl ein, die auf dem System verwendet wird, auf dem das Paket gebaut wird. Der Wert ist "8.3" für tcl-8.3, “8.4” für tcl-8.4, usw.
Dieses Beispiel entstammt dem Paket vkeybd:
%build
make PREFIX=%{_prefix} \
TCL_VERSION=%{tcl_version} \
XLIB="-L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11" \
USE_LADCCA=1
3.36. %ul_version
Dieses Makro setzt die Version des United Linux ein, auf dem das Paket gebaut wird. Der Wert ist “1” für UL 1.0 und “0” wenn es nicht auf UL gebaut wird.
Siehe auch %sles_version und %suse_version.
Dieses Beispiel entstammt dem Paket installation-images:
%build [...] %ifarch %ix86 themes="SuSE Home" %else themes=SuSE %endif %if %ul_version > 0 themes=UnitedLinux %else %if %sles_version > 0 themes="SuSE-SLES" %endif
3.37. %verify_permissions
Dieses Makro hilft dabei, Zugriffsrechte von Dateien zu prüfen, die von den Sicherheitseinstellungen des Systems abhängen.
Nutzung:
%verify_permissions [-f filelist] [-e file] ...
Jedes Paket, dass Dateien enthält für die in /etc/permissions oder /etc/permissions.easy andere Berechtigungen definiert sind als in /etc/permissions.secure, sollte dieses Makro im Abschnitt %verifyscript aufrufen.
Es wird normalerweise zusammen mit dem Makro %run_permissions genutzt. Die problematischen Dateien werden in der Dateiliste für gewöhnlich mit %verify(not mode) markiert (siehe Beispiele weiter unten).
Optionen:
-
-ffilelist — Gibt eine Datei mit einer List zu prüfender Dateien an. -
-efile — gibt eine einzelne zu prüfende Datei an.
Beide Optionen können wiederholt werden.
Beispiele:
- 1. Dieses Beispiel entstammt dem Paket
xtetris(zeigt auch den Teil mit%run_permissions):
PreReq: permissions [...] %post %run_permissions %verifyscript %verify_permissions -e /usr/X11R6/bin/xtetris %files %defattr(-, root, root) %verify(not mode) %attr(0755,games,games) /usr/X11R6/bin/xtetris
- 2. Dieses Beispiel entstammt dem Paket
cron:
%verifyscript %verify_permissions -e /etc/crontab -e /usr/bin/crontab [...] %files [...] %verify(not mode) %config(noreplace) /etc/crontab [...] %verify(not mode) %attr (4750,root,trusted) /usr/bin/crontab
- 3. This example is taken from the package
gnome-games:
%verifyscript
%verify_permissions -f %prefix/share/gnome-games/sgidlist
[...]
%files -f %files -f %{name}.lang
%defattr(-,root,root)
%doc AUTHORS COPYING ChangeLog NEWS README
%defattr (0755, games, games)
%verify(not mode) %{prefix}/bin/glines
%verify(not mode) %{prefix}/bin/gnibbles
%verify(not mode) %{prefix}/bin/gnobots2
[...]
%verify(not mode) %{prefix}/bin/same-gnome
%defattr (-, root, root)
%{prefix}/bin/blackjack

