perl und rpmbuild und broken deps

Beim Paketbau eines RPMs kann es vorkommen das RPM eine Datei als Abhängigkeit setzt, die im Paket selbst enthalten ist.

Kling verdammt dämlich! Und das ist es auch!

INFO:
In diesem Artikel setze ich Grundkenntnisse zum Thema „RPM Bauen“ voraus.

Hier ein Beispiel:

[code=““““““““““““““““““““]linux:~# rpmbuild -ba path/to/example.spec
——–snip—————–
linux:~# Requires(interp): /bin/sh /bin/sh
linux:~# Requires(rpmlib): rpmlib(CompressedFileNames) < = 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 linux:~# Requires(post): /bin/sh linux:~# Requires(postun): /bin/sh linux:~# Requires: /bin/bash /usr/bin/env /usr/bin/perl perl(functions.pl)[/code]

Die Datei functions.pl wird als Abhängigkeit angegeben, ist aber im Paket enthalten.

Was Passiert?

rpmbuild geht alle Dateien im Paket durch und führt ldd auf alle ausführbaren Dateien aus um benötigte Libraries als Abhängigkeit zu setzten.
Im nächsten Schritt geht rpmbuild durch alle perl Dateien und sucht nach use oder require um benötigte perl Module mit in die Abhängigkeiten zu setzten.

Steht in unserer Datei example.pl z.B. folgendes

[code=“perl'“““]require „functions.pl“;[/code]

setzt rpmbuild diese Datei als Abhängigkeit. Diese Aktion ist aber völlig legitim in Programmen/Scripten.

Der Workaround!

Eine von mir nicht getestete Methode währe folgende Zeile our $RPM_Provides = „functions.pl“;. Sie muss in die erste Datei (example.pl) eingefügt werden.
Die wohl elegantere Methode währe folgende, da der Sourcecode des entsprechenden Programms nicht geändert werden muss. Folgendes muss in den %prep Part des SPEC-Files:

[code=““““]cat < < EOF > %{name}-%{version}-req
#!/bin/sh
%{__perl_requires} $* |\
sed -e ‚/perl(functions.pl)/d‘
EOF
%define __perl_requires %{_builddir}/%{name}-%{version}-req
chmod 755 %{__perl_requires}[/code]

Diese kleine Script führt nach perl_requires sed aus. Mit sed werden die entsprechenden unerwünschten Teile (hier perl(functions.pl) gelöscht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.