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.