Wiki-Artikel über rpmbuild

Michael Schwendt mschwendt at gmail.com
Sun Mar 4 10:20:03 UTC 2012


On Sun, 4 Mar 2012 09:39:49 +0100 (CET), OR (Olaf) wrote:

> > Im Gegensatz zu %prep ist %setup ein Kommando mit hinreichend gut
> > dokumentierten Optionen. Laß für den Anfang -q ("quiet") weg, damit in
> > der Ausgabe nichts unterdrückt wird. %setup ist für das Anlegen des
> > "Build" Verzeichnisses und das Entpacken der "Source" Archive zuständig.
> 
> Also müsste zu dem Zeitpunkt, wo "%setup" abgearbeitet  wird, vom
> Makefile die Software gebaut, als Tar-Arch verschnürt und in [wo-immer]/SOURCE/
> abgeschoben worden sein.
> 
> Das gibt - theoretisch - zwei Probleme:
> 
> 1.) Wenn u.a. das Verzeichnis  "[wo-immer]/SOURCE/" erst von "%setup"
>     angelegt wird, kann da noch nix drinnen sein. Auch kein Tar-Archiv.

Doch. Ich erwähnte %_sourcedir bereits. Das ist der Platz für SourceX
Dateien. Wenn Du %setup nicht verwendest, muß Du in %prep halt die SourceX
Dateien selber in das noch leere build Verzeichnis kopieren. Das fehlte
in Deiner spec Datei bislang.

Nimm zum Verständnis einfach ein geändertes Szenario an. Installation
(bzw. Auspacken) eines src.rpm Paketes:
  rpm -ivh beispiel.src.rpm
Das src.rpm ist vollständig, d.h. die enthaltenden Dateien sind danach
innerhalb der spec Datei verwendbar, wurden je nach Konfiguration der
rpmbuild Pfade jedoch in unterschiedliche Verzeichnisse extrahiert.

> 2.) Kann Make das Tar-Archiv nicht erstellen und verschieben, wenn
>     es nicht zuvor von rpmbuild aufgerufen wird, und gesagt bekommt,
>     wo es das Tar-Archiv hinschieben soll.

Das ergibt so keinen Sinn. Siehe oben. Ein src.rpm liefert vollständigen
Inhalt. Dieser Inhalt fehlte bei Dir jedoch noch.

Du könntest durchaus Dein "make dist-tar" verwenden, um den tarball
zu erzeugen, und dann mit rpmbuild weitermachen. Voraussetzung dafür ist,
daß der tarball in %_sourcedir verfügbar gemacht wird. Auch für den
Umweg über ein src.rpm:

dist-rpm: dist-tar
    [...]
    rpmbuild -bs beispiel.spec --define _sourcedir $(pwd) --define _srcrpmdir $(pwd)
    rpmbuild --rebuild beispiel.src.rpm

Das Resultat ….noarch.rpm findet sich dann natürlich nicht in $(pwd).

> > > make PREFIX=%(echo $HOME)/rpmbuild/ pre-rpm
> > > <snap>
> >
> > Dieser PREFIX ist auch falsch. Ohne Kommentierung sogar unsinnig.
> > Üblich wäre PREFIX=/usr bzw. PREFIX=%{_prefix}.
> 
> Noch mehr "schwarze Magie".

Warum das? Entweder Du hast im Makefile Variablen definiert, die Du im
RPM Paket abändern _möchtest_ oder mußt, oder nicht. PREFIX=$prefix ist ja
üblicherweise auf /usr/local eingestellt. Das könntest Du im RPM auch
so lassen. Distributionen installieren jedoch nach /usr, müssen da
also eine Änderung vornehmen. Besonders wichtig, wenn solche Variablenwerte
von Make in das Programm (oder Skript) eingesetzt werden.

> Ich hab jetzt erst mal
> <snip>
> %install make PREFIX=$RPM_BUILD_ROOT install
> <snap>
> ...genommen. Auch falsch?

Ja. Zum einen fehlt ein Zeilenumbruch zwischen %install und make.
%install ist kein Kommando. Zum anderen möchtest Du sehr wahrscheinlich
$RPM_BUILD_ROOT als ein Präfix verwenden. So wie $DESTDIR in tausenden
von Autoconf/Automake Projekten. Dort wird $(DESTDIR) beim Installieren
von Dateien einfach vor jeden Zielpfad im Makefile gehängt. Im RPM Paket
führt das zu:

  make DESTDIR=$RPM_BUILD_ROOT install

Hast Du keine DESTDIR Variable, wird sowas nötig sein, damit /usr nicht
fehlt:

  make PREFIX=$RPM_BUILD_ROOT/usr install


More information about the de-users mailing list