Patentrezept "Kompilieren und Installieren"
Hallo, regelmäßig stehe ich vor dem Problem, dass ich ein Programm selbst kompilieren und installieren will. Regelmäßig führe ich dazu "make && sudo checkinstall" aus in der Hoffnung, ein Paket zu erzeugen, damit wenigstens die Paketverwaltung über meine Aktivitäten Bescheid weiß. Ebenso regelmäßig schlägt das "checkinstall" fehl. Ohne jetzt genau den Grund zu analysieren, warum "checkinstall" fehlschlägt (Exitcode != 0) hätte ich gerne ein paar Meinungen und "Best Practices" gehört. Lohnt es sich, "checkinstall" in den Griff zu bekommen oder ist das für die "private" Installation auf einem Rechner irrelevant und "make install" das Mittel der Wahl? Gibt es andere gangbare Wege, ein Eigenkompilat mit angemessenem Aufwand in ein Paket zu verwandeln damit man es bei einer neuen Version durch ein neues Paket ersetzen kann? Für Denkanstöße oder gute Anleitungen/Links wäre ich dankbar, Grüße Philipp -- http://philipp.rootiniert.de E-Mails verschlüsseln mit PGP. Mein PGP-Key zur Verifizierung: http://tinyurl.com/ddyfnm -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo Philipp, Am 28.12.2009 15:47, schrieb Philipp Bender:
regelmäßig stehe ich vor dem Problem, dass ich ein Programm selbst kompilieren und installieren will. Regelmäßig führe ich dazu "make && sudo checkinstall" aus in der Hoffnung, ein Paket zu erzeugen, damit wenigstens die Paketverwaltung über meine Aktivitäten Bescheid weiß. Ebenso regelmäßig schlägt das "checkinstall" fehl. Ohne jetzt genau den Grund zu analysieren, warum "checkinstall" fehlschlägt (Exitcode != 0) hätte ich gerne ein paar Meinungen und "Best Practices" gehört. Lohnt es sich, "checkinstall" in den Griff zu bekommen oder ist das für die "private" Installation auf einem Rechner irrelevant und "make install" das Mittel der Wahl? Gibt es andere gangbare Wege, ein Eigenkompilat mit angemessenem Aufwand in ein Paket zu verwandeln damit man es bei einer neuen Version durch ein neues Paket ersetzen kann?
Meines Erachtens muss man das ganze über die RPM-Build-Umgebung regeln. Normalerweise erzeugen 'make install' und Konsorten keine rpm-Pakete, sondern 'nur' die ausführbaren Dateien usw. eines Programms, welche dann direkt in den/die (konfigurierten) Dateipfad(e) kopiert werden. Ein Tutorial zum Erstellen eines RPM Build-Environments findest Du hier: http://en.opensuse.org/SUSE_Build_Tutorial Gruß Stefan - -- ? S T E F A N ? J U R I S C H ? ====================================== System Engineer ? Department VMware® Software Development ====================================== SIEGNETZ.Informationstechnologie® GmbH Schneppenkauten 1a ? DE 57076 Siegen phone +49 271 68193 -0 ? facsimile -28 web www.siegnetz.de ? info@siegnetz.de Geschäftsfuehrer: Oliver Seitz Amtsgericht Siegen HRB4838 Sitz der Gesellschaft ist Siegen Das Wort "WINDOWS" stammt aus einem alten Sioux-Dialekt und bedeutet: "Weißer Mann starrt durch Glasscheibe auf Sanduhr." The word "WINDOWS" originates from an old Sioux dialect and means: "White man staring through glass pane at hourglass." -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org/ iEYEARECAAYFAks4zaEACgkQqdb99cbyCz5nOwCfXIXN/oDtYNwg3GzZT3ppGmbG f7IAnjcpQ12MPd5G/OJxqPfrGFNDsMIt =ROVW -----END PGP SIGNATURE----- -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Stefan,
Meines Erachtens muss man das ganze über die RPM-Build-Umgebung regeln. Normalerweise erzeugen 'make install' und Konsorten keine rpm-Pakete, sondern 'nur' die ausführbaren Dateien usw. eines Programms, welche dann direkt in den/die (konfigurierten) Dateipfad(e) kopiert werden.
Danke für den Link, dieses "Spec-Datei"-Gedöns bereitet mir aber Kopfzerbrechen obwohl ich es noch nicht mal ausprobiert habe. Naja, ich werd es mir mal antun ;) Dass "make install" ein Paket erstellt, war mir schon klar, allerdings kann ich nicht überblicken, welche Nachteile daraus erwachsen. Vorstellen kann ich mir gerade nur, dass Dateien, die in neueren Versionen des Programms nicht mehr erzeugt werden, dann bei einem "Update" via "make install" weiterhin ungenutzt auf der Platte verbleiben, ich gehe davon aus, dass der Paketmanager das irgendwie trackt und alle Dateien, die es in einem neueren Paket nicht mehr gibt, löschen würde. Wie machst du das denn? Einfach schmerzfrei installieren? Grüße Philipp -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Wed, Dec 30, 2009 at 02:35:57PM +0100, Philipp Bender wrote:
Meines Erachtens muss man das ganze über die RPM-Build-Umgebung regeln. Normalerweise erzeugen 'make install' und Konsorten keine rpm-Pakete, sondern 'nur' die ausführbaren Dateien usw. eines Programms, welche dann direkt in den/die (konfigurierten) Dateipfad(e) kopiert werden.
Danke für den Link, dieses "Spec-Datei"-Gedöns bereitet mir aber Kopfzerbrechen obwohl ich es noch nicht mal ausprobiert habe. Naja, ich werd es mir mal antun ;)
Dieses Spec-Datei"-Gedöns _ist_ die Hölle und Kopfschmerzen sind das geringste Übel. Und man sollte darauf auf keinen Fall auch nur eine Minute verwenden. ;) Nun der ernste Teil der Antwort: a) Es gibt eine unabhängige Einführung zum openSUSE Build Service (OBS). Andreas hat darauf unter lizards.o.o verwiesen. IIRC. Der Direkt- und Einfachheit halber hier die Links: openSUSE Build System: Building Binary Packages for Many Linux Distributions at Once http://ldn.linuxfoundation.org/article/opensuse-build-system-building-binary... openSUSE Build System: Building RPM Packages http://ldn.linuxfoundation.org/article/opensuse-build-system-building-rpm-pa... openSUSE Build System: Building DEB Packages http://ldn.linuxfoundation.org/article/opensuse-build-system-building-deb-pa... Der DEB-Verweis lediglich der Vollständigkeit halber. b) Wir benötigen eine Beispiel basierte Anleitung. Ich denke da an ein foobar-Paket mit einem "hello foobar world"-Skript/ Programm, einer Konfigurationsdatei (Stichwork %config(noreplace)) und einem Set an %pre- und %pos-Skripten, die illustrieren, was den Skripten an Argumenten mitgegeben wird (Anzahl der installierten foobar-Pakete). Was ich mir davon verspreche: Die Einstiegshürde senken. Wenn man erst mal darüber hinweg ist, dann will man das nie mehr anders handhaben. Hat seine eigene zusätzliche Installationsquelle im OBS _und_ fixt schnell mal ein Paket in dem zum Beispiel die Dokumentation fehlt oder fehlerhaft ist. Mit einem submit request spielt man die Änderung sodann dem eigentlichen Maintainer des jeweiligen Projektes im OBS zu. Aber möglicherweise ist so etwas gar nicht erforderlich, da es bereits http://de.opensuse.org/Build_Service/Anleitung gibt. Aber bereits der erste Punkt "Grundvoraussetzungen" läßt mich daran zweifeln.
Dass "make install" ein Paket erstellt, war mir schon klar, allerdings kann ich nicht überblicken, welche Nachteile daraus erwachsen.
- Dateien werden ohne Rücksicht auf Abhängigkeiten installiert. - Existierende Dateien werden möglicherweise überschrieben. - Keine oder schwierige Übertragbarkeit auf andere Systeme. - Keine "saubere" Deinstallation, da kein Tracking stattfindet. - Keine Überprüfungsmöglichkeit, ob etwas verändert wurde (rpm -V) Lars -- Lars Müller [ˈlaː(r)z ˈmʏlɐ] Samba Team SUSE Linux, Maxfeldstraße 5, 90409 Nürnberg, Germany
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo, Am 30.12.2009 14:35, schrieb Philipp Bender:
Danke für den Link, dieses "Spec-Datei"-Gedöns bereitet mir aber Kopfzerbrechen obwohl ich es noch nicht mal ausprobiert habe. Naja, ich werd es mir mal antun ;)
Die einfachste Sache ist das tatsächlich nicht, da braucht man ein bisschen, bis man da einigermaßen durchblickt. Ich nutze das auch nur ungern bis gar nicht! ;-)
Dass "make install" ein Paket erstellt, war mir schon klar, allerdings kann ich nicht überblicken, welche Nachteile daraus erwachsen. Vorstellen kann ich mir gerade nur, dass Dateien, die in neueren Versionen des Programms nicht mehr erzeugt werden, dann bei einem "Update" via "make install" weiterhin ungenutzt auf der Platte verbleiben, ich gehe davon aus, dass der Paketmanager das irgendwie trackt und alle Dateien, die es in einem neueren Paket nicht mehr gibt, löschen würde.
Nein, "make install" erstellt allein eben *kein* Paket, weshalb auch der Packagemanager hier nichts "zu melden" hat - das geht nur bei sauberen RPM-Paketen. Schlimm ist das aber nicht, da der Paketmanager die Files überschreibt, wenn man doch irgendwann ein RPM dazu finden sollte.
Wie machst du das denn? Einfach schmerzfrei installieren?
Genau - einfach drauf! Ich achte i.d.R. nur *genau dann* auf einen speziellen Pfad für die Software, wenn es ein entsprechendes RPM gibt, das ich aber nicht nutzen will, weil die compilierte Version eventuell neuer oder "FastEddy-Spezial" (also von mir für mich modifiziert) ist. Aber das sind Feinheiten... ;-) Gruß Stefan - -- ? S T E F A N ? J U R I S C H ? ====================================== System Engineer ? Department VMware® Software Development ====================================== SIEGNETZ.Informationstechnologie® GmbH Schneppenkauten 1a ? DE 57076 Siegen phone +49 271 68193 -0 ? facsimile -28 web www.siegnetz.de ? info@siegnetz.de Geschäftsfuehrer: Oliver Seitz Amtsgericht Siegen HRB4838 Sitz der Gesellschaft ist Siegen Das Wort "WINDOWS" stammt aus einem alten Sioux-Dialekt und bedeutet: "Weißer Mann starrt durch Glasscheibe auf Sanduhr." The word "WINDOWS" originates from an old Sioux dialect and means: "White man staring through glass pane at hourglass." -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org/ iEYEARECAAYFAktB3TAACgkQqdb99cbyCz6ndQCdH6X9o/pWb/O3xhD+DUTrzIdE 2BsAnRwcQwbXG9KuluKA16ygka89Not1 =NmsE -----END PGP SIGNATURE----- -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi,
Dass "make install" ein Paket erstellt, war mir schon klar, allerdings
Nein, "make install" erstellt allein eben *kein* Paket, weshalb auch der
Tippfehler, sorry, "ein" und "kein" sind ja auch nur einen Buchstaben voneinander entfernt. -- http://philipp.rootiniert.de E-Mails verschlüsseln mit PGP. Mein PGP-Key zur Verifizierung: http://tinyurl.com/ddyfnm -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Lars,
b) Wir benötigen eine Beispiel basierte Anleitung. Ich denke da an ein foobar-Paket mit einem "hello foobar world"-Skript/ Programm, einer Konfigurationsdatei (Stichwork %config(noreplace)) und einem Set an %pre- und %pos-Skripten, die illustrieren, was den Skripten an Argumenten mitgegeben wird (Anzahl der installierten foobar-Pakete).
Was ich mir davon verspreche: Die Einstiegshürde senken.
Das ist das, was ich gerade brauche ;) also die Anleitung, nicht das Skript. Also, ich habe hier schonmal vorbereitet: ======================================= Paketbau mit dem openSUSE build service ======================================= 1. Account einrichten (Novell-Account anmelden) 2. Projekt erstellen (home) via Webinterface 4. Paketbauumgebung einrichten $ sudo zypper install build osc 5. Projekt auschecken $ osc checkout home:<user> $ cd home:<user> 6. Paket erstellen (?) $ osc meta pkg -e home:<Benutzername> FooScriptPackage Sich öffnende Datei nach bestem Wissen und Gewissen ausfüllen 7. Dateien erstellen In der ``Makefile``: default: g++ main.cpp -o foo install: mv foo /tmp/foo In der ``main.cpp``: #include <iostream> int main () { std::cout << "foo" << std::endl; } 8. spec-Datei erstellen In der ``FooScriptPackage.spec``: Name: FooScript License: GPL Summary: Echoing foo in cpp Version: 0.01 Release: 1 URL: http://foo.nourl %description This nonsense app echoes a "foo" %build make %install make install %clean rm -rf /tmp/foo 9. Paket bauen? chroot einrichten? Plattformen definieren? Naiver Ansatz: $ osc build openSUSE_11.2 i586 FooScriptPackage.spec (Funktioniert wohl nicht wegen "not a valid plattform") Kann mir hier vielleicht jemand weiterhelfen? Ich bin nicht abhängig von irgendwelchen Paketen und Repositories, was ist denn jetzt der einfachste Fall? Ich möchte das Paket innerhalb meines Projektes mit dem obs bauen oder auch sehr gerne lokal. Grüße Philipp -- http://philipp.rootiniert.de E-Mails verschlüsseln mit PGP. Mein PGP-Key zur Verifizierung: http://tinyurl.com/ddyfnm -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 04 Jan 2010, Philipp Bender schrieb:
9. Paket bauen?
Ja.
chroot einrichten? Plattformen definieren?
Nein und nein. Du mußt im Projekt noch die jew. Repos hinzufügen.
Naiver Ansatz:
$ osc build openSUSE_11.2 i586 FooScriptPackage.spec
osc build -j 2 --ccache --local-package openSUSE_11.2 i586 FooScriptPackage.spec Dazu kann man noch das DVD-ISO einbinden, damit man nicht _alles_ runterladen muß. Am besten per fstab Eintrag (wg. dem sauberen umount wenn man runterfährt und vergisst das ISO zu umounten). ==== ~/bin/oscbuild11.2 ==== #!/bin/sh -x test -d /ISO/suse || mount /ISO osc build --prefer-pkgs=/ISO/suse -j 2 --ccache --local-package \ openSUSE_11.2 i586 "$@" ==== Man könnte auch noch ein generisches oscbuild (alias) verwenden: ==== osc build --prefer-pkgs=/ISO/suse -j 2 --ccache --local-package "$@" ==== Bei dem muß man eben immer PLATFORM ARCH und SPEC angeben. Für den Einstieg ist es übrigens sinnvoller erstmal nur stinknormale RPM Pakete zu bauen (rpmbuild -ba FooScriptPackage.spec). Erst wenn das fehlerfrei und rel. routinemäßig klappt sollte man das OBS verwenden. Alles weitere gehört nach opensuse-packaging oder opensuse-programming-de wenn man nicht gut englisch kann. HTH, -dnh -- Vor allem fällt mir auf daß syntax highlighting in der Defaultkonfiguration meistens unbrauchbar ist. Irgendein Depp scheint zu meinen, daß man alle vorhandenen Farben auch wirklich benutzten muß, so daß das Ergebnis nicht hilfreich sondern einfach nur schrecklich bunt ist :-/ -- kraxel -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Mon, 4 Jan 2010 22:38:58 +0100, you wrote:
Bei dem muß man eben immer PLATFORM ARCH und SPEC angeben.
Nicht zwingend. Wenn weiter nichts angegeben wird, wird für factory und die verwendetete Architektur gebaut. Philipp -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Guten Abend David, danke für die Hilfe. Ich habe ein Verzeichnis, in dem Makefile, main.cpp und die spec liegen. rpmbuild schient das aber "anders" zu wollen, denn: % rpmbuild -ba FooScriptPackage.spec Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.rviWVK + umask 022 + cd /usr/src/packages/BUILD + /bin/rm -rf /usr/src/packages/BUILDROOT/FooScript-0.01-1.i386 ++ dirname /usr/src/packages/BUILDROOT/FooScript-0.01-1.i386 + /bin/mkdir -p /usr/src/packages/BUILDROOT + /bin/mkdir /usr/src/packages/BUILDROOT/FooScript-0.01-1.i386 + make make: *** Keine Targets angegeben und keine »make«-Steuerdatei gefunden. Schluss. error: Bad exit status from /var/tmp/rpm-tmp.rviWVK (%build) RPM build errors: Bad exit status from /var/tmp/rpm-tmp.rviWVK (%build) Was soll denn das mit dem "cd" schon wieder? Ich nehme an, er versucht das "make" aus dem specfile, hat aber mittlerweile einen andern Pfad erklommen und findet das Makefile nicht mehr. Kommt das aus der spec-Datei? Die war ja nur: ### Name: FooScript License: GPL Summary: Echoing foo in cpp Version: 0.01 Release: 1 URL: http://foo.nourl %description This nonsense app echoes a "foo" %build make %install make install %clean rm -rf /tmp/foo ### Oder hab ich da eine wichtige Option vergessen? Oder muss diese ~/.rpmmacros unbedingt vorhanden sein? Grüße Philipp -- http://philipp.rootiniert.de E-Mails verschlüsseln mit PGP. Mein PGP-Key zur Verifizierung: http://tinyurl.com/ddyfnm -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 04 Jan 2010, Philipp Bender schrieb:
danke für die Hilfe. Ich habe ein Verzeichnis, in dem Makefile, main.cpp und die spec liegen. rpmbuild schient das aber "anders" zu wollen, denn: [..] Oder hab ich da eine wichtige Option vergessen?
Ich hab ganz übersehen, daß du gar keinen %setup Abschnitt hast. Also: pack das .cpp und das Makefile erstmal in ein Unterverzeichnis, z.B.: FooScript-0.0.1 Das packst du in einen tarball: tar cjf FooScript-0.0.1.tar.bz2 FooScript-0.0.1 Den packst du dann ins SOURCES Verzeichnis, das Spec nach SPECS. Dann noch im .spec: ==== [..] Source0: FooScript-0.0.1.tar.bz2 [..] %setup %build make [..] ==== HTH, -dnh -- "Ein WoKo ist eine Einheit. Ein WoKo beschreibt die kleinstmoegliche Strecke zwischen zwei Fettnaepfchen." [Juergen Poehlert in dag°] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, ok, ich bin nun einen Schritt weiter. Erkentnisse soweit: 1. muss man die .rpmmacros erstellen, z.B. mit %_topdir /home/phil/build/opensuse 2. muss man innerhalb dieses topdir eine Struktur haben mit SPECS, SOURCES, BUILD, BUILDROOT und so weiter 3. gibt es nicht PRO PAKET so eine Verzeichnisstruktur, sodern in SPECS sind alle *.spec der (jemals) selbsterstellten Pakete, genau wie sich unter SOURCES mehrere verschiedene Quellarchive befinden können. 4. muss ich die kompilierte Datei nicht mit "make install" ins System kopieren (z.B. soll sie nach "/tmp/foo") sondern ich gebe unter %files an "/tmp/foo" und muss dafür sorgen, dass sich die Ordnerstruktur innerhalb meines Quellordners wiederfindet, also wenn ich eine Datei "/usr/lib/foo.so" installieren will, muss ich diese Zeile so unter %files schreiben und der Ordner $QUELLORDNER/usr/lib/ muss (samt der Datei foo.so) existieren oder beim Kompilieren erzeugt werden. Also bleibt im Beispiel der %install - Abschnitt leer? Mit dieser Konfiguration, die ich nocheinmal hier http://pastebin.ca/1738521 (Makefile) http://pastebin.ca/1738522 (Specfile) gepostet habe, erhalte ich folgende Ausgabe: #### phil@desktop ~ % rpmbuild -ba build/opensuse/SPECS/FooScript-0.0.1.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.UKxwR0 + umask 022 + cd /home/phil/build/opensuse/BUILD + cd /home/phil/build/opensuse/BUILD + rm -rf FooScript-0.0.1 + /usr/bin/bzip2 -dc /home/phil/build/opensuse/SOURCES/FooScript-0.0.1.tar.bz2 + /bin/tar -xvvf - drwxr-xr-x phil/users 0 2010-01-05 09:24 FooScript-0.0.1/ -rw-rw-r-- phil/users 57 2010-01-04 17:33 FooScript-0.0.1/Makefile~ -rw-rw-r-- phil/users 81 2010-01-04 17:26 FooScript-0.0.1/main.cpp drwxr-xr-x phil/users 0 2010-01-05 09:07 FooScript-0.0.1/tmp/ -rw-rw-r-- phil/users 34 2010-01-05 09:24 FooScript-0.0.1/Makefile + STATUS=0 + '[' 0 -ne 0 ']' + cd FooScript-0.0.1 + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.fzuYYD + umask 022 + cd /home/phil/build/opensuse/BUILD + /bin/rm -rf /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386 ++ dirname /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386 + /bin/mkdir -p /home/phil/build/opensuse/BUILDROOT + /bin/mkdir /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386 + cd FooScript-0.0.1 + make g++ main.cpp -o tmp/foo + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.hkZUVh + umask 022 + cd /home/phil/build/opensuse/BUILD + cd FooScript-0.0.1 + RPM_BUILD_ROOT=/home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386 + export RPM_BUILD_ROOT + test -x /usr/sbin/Check -a 1000 = 0 -o -x /usr/sbin/Check -a '!' -z /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386 + echo 'I call /usr/sbin/Check...' I call /usr/sbin/Check... + /usr/sbin/Check Checking permissions and ownerships - using the permissions files /tmp/Check.perms.iUMRa8 setting /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386/ to root:root 0755. (wrong owner/group phil:users) + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-symlink Processing files: FooScript-0.0.1-1.i586 error: File not found: /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386/tmp/foo RPM build errors: File not found: /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386/tmp/foo #### Die Datei aus der letzten Ausgabezeile existiert tatsächlich nicht, aber sie wurde im Verzeichnis BUILD/FooScript-0.0.1/tmp korrekt angelegt (wie im Makefile angefordert). Ich habe dazu u.A. folgende Dokumente konsultiert: [1] http://linuxwiki.de/RPM/BuildAlsUser [2] http://archiv.tu-chemnitz.de/pub/2006/0178/data/vortrag.html Grüße Philipp -- http://philipp.rootiniert.de E-Mails verschlüsseln mit PGP. Mein PGP-Key zur Verifizierung: http://tinyurl.com/ddyfnm -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, ein Umzug des Threads ist überfällig: X-Mailed & Followup-To opensuse-programming-de Am Die, 05 Jan 2010, Philipp Bender schrieb:
ok, ich bin nun einen Schritt weiter. Erkentnisse soweit:
1. muss man die .rpmmacros erstellen, z.B. mit
%_topdir /home/phil/build/opensuse
Nur wenn man nicht /usr/src/packages/ verwenden will.
2. muss man innerhalb dieses topdir eine Struktur haben mit SPECS, SOURCES, BUILD, BUILDROOT und so weiter
Jap.
3. gibt es nicht PRO PAKET so eine Verzeichnisstruktur, sodern in SPECS sind alle *.spec der (jemals) selbsterstellten Pakete, genau wie sich unter SOURCES mehrere verschiedene Quellarchive befinden können.
Korrekt. v.a. SOURCES sollte man aber ab und an ausmisten, da es sonst zu Konflikten bei schlecht benannten patch-Dateien kommt (foo.diff statt name[-version]-foo.diff). BUILD kann man regelmäßig oder sogar aus dem .spec heraus ausmisten.
4. muss ich die kompilierte Datei nicht mit "make install" ins System kopieren (z.B. soll sie nach "/tmp/foo") sondern ich gebe unter %files an "/tmp/foo" und muss dafür sorgen, dass sich die Ordnerstruktur innerhalb meines Quellordners wiederfindet, also wenn ich eine Datei "/usr/lib/foo.so" installieren will, muss ich diese Zeile so unter %files schreiben und der Ordner $QUELLORDNER/usr/lib/ muss (samt der Datei foo.so) existieren oder beim Kompilieren erzeugt werden.
FALSCH. Wie die Dateien nach %{buildroot} (aka $RPM_BUILD_ROOT) kommen ist egal. Ob per '%makeinstall (aka make DESTDIR="$RPM_BUILD_ROOT" install'), python setup.py install (hab grad nicht im Kopf wie man da DESTDIR angibt), per cp oder install oder sonstwie. Wichtig ist nur, daß die Files unter %{buildroot} am richtigen Platz laden, nämlich %{buildroot}/da/wo/sie/installiert/hinsollen. Ausführbare Dateien gehören nach %{_bindir}, also: install -d -m 755 %{buildroot}%{_bindir} install -m 755 foo %{buildroot}%{_bindir}/foo install -m 755 bar %{buildroot}%{_bindir}/
Also bleibt im Beispiel der %install - Abschnitt leer?
Nein.
Mit dieser Konfiguration, die ich nocheinmal hier
http://pastebin.ca/1738521 (Makefile)
Hier solltest du praktischerweise einen install-Target hinzufügen. ==== Makefile ==== CXX ?= g++ DESTDIR= all: $(CXX) -o foo main.cpp install: install -d -m 755 $(DESTDIR)/tmp install -m 755 foo $(DESTDIR)/tmp/foo ====
http://pastebin.ca/1738522 (Specfile)
==== foo.spec ==== [..] %prep %setup -q ### normal mit -q, ohne ist nur sinnvoll wenn man's braucht bzw. damit ### du erstmal mitbekommst, was das Makro macht ;) %build make %install make DESTDIR="%{buildroot}" install %clean rm -rf "%{buildroot}" %files /tmp/foo ==== Sinnvoller wäre generell foo in %{_bindir} zu haben: ==== Makefile ==== CXX ?= g++ prefix = /usr/local bindir = $(prefix)/bin DESTDIR= all: $(CXX) -o foo main.cpp install: install -d -m 755 $(DESTDIR)$(bindir) install -m 755 foo $(DESTDIR)$(bindir)/foo ==== ==== foo.spec ==== [..] %build make prefix="%{_prefix}" %install make prefix="%{_prefix}" DESTDIR="%{buildroot}" install %clean rm -rf "%{buildroot}" %files %{_bindir}/foo ====
error: File not found: /home/phil/build/opensuse/BUILDROOT/FooScript-0.0.1-1.i386/tmp/foo
Du hast foo eben nicht nach %{buildroot}/tmp/foo kopiert/installiert. -dnh -- Time is an illusion; lunchtime, doubly so. -- Ford Prefect -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David, super! Vielen Dank für die Hilfe, genau das, was ich für den Einstieg gebraucht habe! Ich habe das hier gleich mal verwurstet: http://philipp.rootiniert.de/wiki/Paketbau Im openSUSE-Wiki findet sich leider keine solche Anleitung, die sich an einem Beispiel entlanghangelt (zumindest habe ich sie nicht gefunden), wenn sich im Text keine groben Fehler finden könnte man ja überlegen, ob man das, was ich hier geschrieben habe, in den Paketbau-Artikel im openSUSE-Wiki einpflegt. Die Anleitung dort fand ich jedenfalls für mich als Anfänger zu abstrakt. Grüße Philipp -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Wed, Jan 06, 2010 at 05:11:55AM +0100, David Haller wrote:
ein Umzug des Threads ist überfällig: X-Mailed & Followup-To opensuse-programming-de
opensuse-meta-mailinglisten-diskussion-wie-damals-in-der-mailbox-zeit Ich bin aber nicht auf opensuse-programming-de und somit verpasse ich vielleicht was. Aber ich schau auch kein Fernsehn. :) [ 8< ]
%clean rm -rf "%{buildroot}"
Und was ist wenn %{buildroot} = / ist? Ich würde das so pauschal nicht verwenden. Entweder konditional, wenn es nicht / ist oder komplett weglassen. Im Samba spec haben wir: %clean [ x"${RPM_BUILD_ROOT}" = x"/" ] && ( echo "your buildroot is /" && \ exit 0) || rm -rf "${RPM_BUILD_ROOT}" Wie geschrieben, ich würde da heute komplett drauf verzichten. Ich meine Darix hat mir auch mal gesagt warum. Aber auch in 2010 nimmt die Vergeßlichkeit nicht ab ... Warum wir da ${RPM_BUILD_ROOT} statt %{buildroot} verwenden, ist eine Frage die ich genauso beantworten würde. Lars -- Lars Müller [ˈlaː(r)z ˈmʏlɐ] Samba Team SUSE Linux, Maxfeldstraße 5, 90409 Nürnberg, Germany
Hi Lars,
ein Umzug des Threads ist überfällig: X-Mailed & Followup-To opensuse-programming-de
opensuse-meta-mailinglisten-diskussion-wie-damals-in-der-mailbox-zeit
Ich bin aber nicht auf opensuse-programming-de und somit verpasse ich vielleicht was. Aber ich schau auch kein Fernsehn. :)
Darum hab ich bei meiner Antwort auch nochmal diese Liste als Empfänger eingetragen ;) Wie in der anderen Antowrt: Vielen Dank für die Hilfe bisher, ich hab mich mit einer "Anfängeranleitung" revanchiert. Den BuildService nehme ich dann mal in Angriff wenn ich Pakete kompiliere, für die es dort noch keine stabilen Versionen gibt und ich außerdem mit Abhängigkeiten und deren Management einigermaßen vertraut bin. Aber nicht heute. Grüße und einen schönen (Feier-) Tag, Philipp -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Wed, 6 Jan 2010 12:02:27 +0100, you wrote:
Wie geschrieben, ich würde da heute komplett drauf verzichten.
Macht rpm ab 11.2 AFAIK automatisch.
Warum wir da ${RPM_BUILD_ROOT} statt %{buildroot} verwenden, ist eine Frage die ich genauso beantworten würde.
Das ist IMO letztlich Geschmackssache. %buildroot wird schon von rpm substituiert, $RPM_BUILD_ROOT erst von der Shell, die das von rpmbuild erzeugte Skript ausführt. Philipp -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (6)
-
David Haller
-
Lars Müller
-
Philipp Bender
-
Philipp Bender
-
Philipp Thomas
-
Stefan Jurisch