perl und rpmbuild und broken deps

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

INFO:
Dieser Artikel setz Grundkenntnisse zum Thema „RPM Bau“ voraus.

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ührtden Befehl 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. Eine weitere Datei in Perl mittels „require“ einzubinden ist in Perl jedoch legitim.

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 der Analyse aller Perl Dateien (perl_requires) sed aus. Mittels 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.