weidner/computer/linux/rpm/

Ein RPM aus einem Perl-Modul

Wenn ich die Systemversion von Perl auf einem Rechner benutze und zusätzliche Module dafür benötige, dann versuche ich diese ebenfalls mit der Softwareverwaltung des Systems zu installieren. Das heißt, mit apt-get oder yum. Der Hauptgrund ist, dass Module, die ich direkt von CPAN installiere, in anderen Verzeichnissen landen, als die vom System installierten. Dann kann es passieren, dass ein Modul mehrfach und in verschiedenen Versionen installiert wird, was mir bei Problemen die Fehlersuche komplizierter macht.

Bereits 2002 hatte ich beschrieben, wie ich Perl-Module als RPM aufbereite, um sie ohne weiteren Aufwand auf verschiedenen Rechnern zu installieren. Damals war cpanflute das Werkzeug meiner Wahl, mit dem ich eine Spezifikation für das Modul erzeugte.

Zwischenzeitlich habe ich viel mit Debian und Ubuntu gearbeitet, bei denen dh-make-perl einen ähnlichen Zweck erfüllt, aber in den letzten Monaten fand ich über Qubes OS wieder zu - mittlerweile - Fedora Linux zurück. Auch hier stehe ich vor dem Problem, ein Perl-Modul, das noch nicht über die Fedora-Repositories verfügbar ist, via RPM zu installieren.

Zeit also, mich zu informieren, welche Werkzeuge aktuell sind.

Die besten Informationen, die ich fand, um mich wieder mit RPM und dem Erzeugen von RPMS für Perl-Module vertraut zu machen, sind:

Insgesamt fand ich zwei Programme, die mir helfen, ein RPM aus einem Perl-Modul von CPAN zu erzeugen: cpan2rpm und cpanspec.

Meine Wahl fiel auf cpanspec, da dieses mir aktueller erscheint und ich es aus den Repositories installieren kann. Außerdem bezog sich Dave Cross in seinem Vortrag darauf.

Zusätzlich benötige ich die Skripts und Programme um Packages zu bauen, kurz das Paket rpm-build. Ich installiere beides mit:

$ sudo yum install cpanspec rpm-build

Bevor ich anfange, ein RPM zu bauen, passe ich einige Variablen in der Datei ~/.rpmmacros an:

%packager Mathias Weidner <mamawe@cpan.org>
%vendor Mathias Weidner
%_topdir /home/mathias/rpm
%__perl_requires %{nil}

Die Variable %_perlrequires enthält den Pfad zu einem Skript, dass automatisch alle Perl-Abhängigkeiten auflöst. Indem ich dieses auf %{nil} setze, sorge ich dafür, dass cpanspec nicht versucht, die allerletzte Abhängigkeit des Perl-Moduls zu ermitteln und im RPM festzuhalten.

Nun lege ich die benötigten Verzeichnisse an und starte den ersten Versuch:

$ mkdir -p ~/rpm/{BUILD,RPMS,SRPMS,SOURCES,SPECS}
$ cpanspec -n Directory::Organize

Dabei kümmert sich cpanspec selbstständig um das Herunterladen der Quellen von CPAN.

Bei Directory::Organize handelt es sich um ein Skript mit einer Bibliothek dran. Ich verwende darum die Option -n, damit cpanspec dem Namen des Moduls kein perl- voranstellt. Normalerweise beginnen die Namen aller Perl-Module mit perl-, so dass ich mir die verfügbaren mit yum list available 'perl-*' anzeigen lassen kann.

Das Specfile muss ich noch etwas anpassen. Insbesondere kommt cpanspec nicht mit dem 'v' zurecht, das bei Perl-Modulen, die use version verwenden, in der Versionsnummer auftaucht.

Für den Bau und Test des Perl-Moduls brauche ich noch ein paar Module, insbesondere Module::Build und Test::More. Diese kann ich aus den Fedora-Repositories installieren, Test::More ist im Paket perl-Test-Most enthalten:

$ sudo yum install perl-Module-Build perl-Test-Most

Nun kann ich RPM und SRPM bauen:

$ rpmbuild -ba Directory-Organize.spec

Das RPM kann ich nun auf diesem und anderen Rechnern installieren. Das SRPM hebe ich auf, falls ich später noch einmal ein RPM erzeugen will, denn hier habe ich sowohl Specfile als auch die Quellen beieinander.

Posted 2014-12-19
Tags: