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:
- rpm.org,
- der RPM Guide des Fedora Projekts,
- die Folien des Vortrags Perl in RPM-Land von Dave Cross zur Konferenz YAPC::Europe 2008
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 %__perl_requires 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