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