Re: Patentrezept "Kompilieren und Installieren"
David Haller <[email protected]> Wed, 6 Jan 2010 05:11:55 +0100
| Newsgroups | gmane.linux.suse.programming,gmane.linux.suse.general.german |
|---|---|
| Message-ID | <[email protected]> |
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