CentOS 7 und das inkorrekte dist RPM-Makro

Download PDF

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.

Download PDF