CentOS 7 und das inkorrekte dist RPM-Makro

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:

1Name: interceptty
2Version: 0.6
3Release: 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:

1el6$ grep dist /etc/rpm/macros.dist
2# dist macros.
3%dist .el6

Unter CentOS 7 sieht die Datei wie folgt aus:

1el7$ grep dist /etc/rpm/macros.dist
2# dist macros.
3%dist .el7.centos

Auf einem Red Hat Enterprise Linux 7-System sieht die betroffene Zeile jedoch wie folgt aus:

1%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:

1# fix broken RPM macro
2RUN 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:

1# docker run rpmdevel-centos7:latest cat /etc/rpm/macros.dist|grep dist
2# dist macros.
3%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:

1%if 0%{?rhel} == 7
2 %define dist .el7
3%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:

1%if 0%{?rhel} == 7
2 %define dist .el7
3%endif
4
5Name:    pinkepank
6Version: 0.6
7Release: 1%{?dist}

Falsch wäre:

1Name:    pinkepank
2Version: 0.6
3Release: 1%{?dist}
4
5%if 0%{?rhel} == 7
6 %define dist .el7
7%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.

Übersetzungen: