Beim Erstellen von RPM-Paketen hatte ich neulich den Effekt, dass auf CentOS 7 erstellte Pakete (für mich) inkorrekte Paketnamen hatten. Ein Paket trug beispielsweise den Namen pinkepank-0.6-1.el7.centos.x86_64.rpm, sollte aber pinkepank-0.6-1.el7.x86_64.rpm heißen. Da Enterprise Linux-Derivate (CentOS, Scientific Linux,…) zu Red Hat Enterprise Linux binärkompatibel sind, präferiere ich es, keine Distributionsspezifika im Namen zu platzieren.
Im RPM Specfile wurden Paketname, -Version und -Release wie folgt definiert:
Name: interceptty Version: 0.6 Release: 1%{?dist}
Die Variable dist wird auf Enterprise Linux-Derivaten durch das Major-Release ersetzt – also beispielsweise el7 für Enterprise Linux 7. Hier wird also kein centos platizert. Nach langem Suchen habe ich herausgefunden, dass das Makro dist in der Datei /etc/rpm/macros.dist definiert wird – beispielsweise unter EL6:
el6$ grep dist /etc/rpm/macros.dist # dist macros. %dist .el6
Unter CentOS 7 sieht die Datei wie folgt aus:
el7$ grep dist /etc/rpm/macros.dist # dist macros. %dist .el7.centos
Auf einem Red Hat Enterprise Linux 7-System sieht die betroffene Zeile jedoch wie folgt aus:
%dist .el7
Ein Test innerhalb einer virtuellen Maschine hat ergeben, dass die Paketnamen wieder stimmen, wenn die Zeile entsprechend angepasst wird.
Zum Erstellen von RPM-Paketen verwende ich Docker-Container, das dazugehörige Dockerfile habe ich um eine Zeile erweitert:
#Fix broken RPM macro RUN sed -i "s/.el7.centos/.el7/g" /etc/rpm/macros.dist
Beim Erstellen der Images wird die oben erwähnte Datei entsprechend angepasst. Überprüfen lässt sich das anschließend wie folgt:
# docker run rpmdevel-centos7:latest cat /etc/rpm/macros.dist|grep dist # dist macros. %dist .el7
Jedoch brachte die Änderung dieser Datei und das erneute Erstellen des Containers keine Änderung – die Paketnamen waren immer noch inkorrekt. Die Lösung war es, die folgenden Zeilen in das RPM Specfile zu schreiben:
%if 0%{?rhel} == 7 %define dist .el7 %endif
Diese Zeilen setzen die Variable dist manuell auf den Wert .el7, wenn eine Enterprise Linux 7-Umgebung erkannt wurde. Wichtig ist dabei, dass die Zeilen vor der Release-Definition stehen, ansonsten erzielt die Ausnahme keinen Effekt:
%if 0%{?rhel} == 7 %define dist .el7 %endif Name: pinkepank Version: 0.6 Release: 1%{?dist}
Falsch wäre:
Name: pinkepank Version: 0.6 Release: 1%{?dist} %if 0%{?rhel} == 7 %define dist .el7 %endif
In diesem Fall würde das Paket wieder pinkepank-0.6-1.el7.centos.x86_64.rpm statt pinkepank-0.6-1.el7.x86_64.rpm heißen.
Thank you!!