Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

24.11.2008, 15:54

Wie man einen Patch einspielt

Aufgrund einiger Anfragen und weil ich der Meinung bin, das sich sowieso alle lieb haben sollen, poste ich mal wie man einen Patch einspielt.

Hintergund: ihr habt ein Problem und euer emerge Kommande scheitert. Auf http://bugs.gentoo.org seht ihr nun, das es das Problem gibt und ein wahnsinnig guter Geist hat bereits einen patch gemacht. ABER: wie kriegt ihr das in euer System gebacken???

Ganz einfach. ;)

Ich mach das mal auf Basis von http://bugs.gentoo.org/show_bug.cgi?id=248589, weil ICH diesen Patch dort raufgeladen habe (was ... ohh ... na so was ... MICH zu einem wahnsinnig guten Geist macht *g*).

Wie immer gibt es mehrere Varianten und Möglichkeiten das zu tun. Ich werde die mal jetzt vorstellen.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dyle« (25.11.2008, 06:04)


2

24.11.2008, 16:07

I. Top-Level via emerge

Das ist "Top-Level" hier werdet ihr euer ebuild verändern müssen und ein Manifest anlegen .... klingt böse ist es aber nicht.

Ihr solltet wissen, das jedes Portage-"Package" im Grunde von einem ebuild verwaltet wird. Das ist diejenige Datei, welche angibt, woher die Sourcen kommen, welche USE es gibt und wie das Package dann gebaut wird.

Im Beispiel =media-libs/ftgl-2.1.3_rc5 ist das die Datei /usr/portage/media-libs/ftgl/ftgl-2.1.3_rc5.ebuild.

Alle ebuilds, unabhängig der Versionsnummer teilen sich pro Package ein "files" Veruzeichnis in dem zusätzliche Dateien untergebracht sind.

Im Beispiel ist dies /usr/portage/media-libs/ftgl/files.

Dort werden auch die Patches reingespielt.

Also ladet den Patch von der Seite runter und stellt ihn dort rein.

Dann müsst ihr dem ebuild noch Bescheid geben, den Patch anzuwenden. Der idealle Ort dies zu tun ist die src_unpack Funktion im ebuild. Bei ftgl-2.1.3_rc5.ebuild ist das

Quellcode

1
2
3
4
5
6
src_unpack() {
	unpack ${A}
	cd "${S}"
	epatch "${FILESDIR}"/${P}-gentoo.patch
	AT_M4DIR=m4 eautoreconf
}


Dort setzt ihr noch eine Zeile mit

Quellcode

1
epatch "${FILESDIR}"/EURE-PATCH-DATEI
hinzu. Bei ftgl sieht das dann so aus:

Quellcode

1
2
3
4
5
6
7
src_unpack() {
	unpack ${A}
	cd "${S}"
	epatch "${FILESDIR}"/${P}-gentoo.patch
	epatch "${FILESDIR}"/ftgl-2.1.3_rc5_Makefile.patch
	AT_M4DIR=m4 eautoreconf
}


Wenn ihr allerdings jetzt emerge anwerft, dann wird das mosern, da sich jetzt ja die Checksummen geändert haben. Also müßt ihr ein Manifest ertzeugen indem ihr einfach das ebuild-Kommando zusammen mit dem ebuild und der Anweisung "manifest" eintippt. Sprich:

Quellcode

1
# ebuild /usr/portage/media-libs/ftgl/ftgl-2.1.3_rc5.ebuild manifest


Das war's und ihr solltest beim Bauen nun nach dem "Unpacking Source" eine Zeile mit eurem patch sehen ...

1. Patch runterladen und nach CATEGORY/PACKAGE/files stellen
2. ebuild-Datei anpassen und Zeile mit 'epatch ${FILESDIR}"/PATCH-DATEI' einpflegen
3. ebuild PATH/TO/EBUILD/FILE manifest aufrufen
4. emerge ...
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dyle« (24.11.2008, 16:18)


3

24.11.2008, 16:16

II. Low-Level ohne das ebuild zu ändern.

Low-Level hat es den Vorteil, das ihr schneller zum Ziel kommt. Ohne den ganzen ebuild-File Hex-Mex.

ABER: wenn ihr das Ganz dann nochmals im normalen Modus (via emerge) baut, dann wird das wieder ohne patch gebaut.

Der Low-Level-Ansatz setzt ganz auf das ebuild-Kommando.

I.d.R. mache ich den Pfad auf die ebuild-Datei gleich in einer Variable EB. Das erspart Tiparbeit ...
Also etwa so:

Quellcode

1
# export EB="/usr/portage/media-libs/ftgl/ftgl-2.1.3_rc5.ebuild"


Nun könnt ihr ein ein

Quellcode

1
# ebuild ${EB} unpack
laufen lassen. Das sollte den Sourcecode runterladen und in euer Portage-Temp-Verzeichnis auspacken. Bei ftgl-2.1.3_rc5 ist das: /var/tmp/portage/media-libs/ftgl-2.1.3_rc5.

In diesem "Arbeitsverzeichnis" gibt es das Unterverzeichnis "work" in dem der Source ausgepackt wurde und wo er kompiliert wird. Navigiert dorthin, in die Top-Wurzel des Source-Verzeichnisses und spielt den Patch via

Quellcode

1
# patch -p0 < PATH/To/PATCH
ein.

Abschließend ruft ihr ebuild ${EB} merge auf und erledigt somit den Rest ...

Also (für bsp. ftgl-2.1.3-rc5; patch "ftgl-2.1.3_rc5_Makefile.patch" befindet sich im ~):

Quellcode

1
2
3
4
5
# export EB="/usr/portage/media-libs/ftgl/ftgl-2.1.3_rc5.ebuild"
# ebuild ${EB} unpack
# cd /var/tmp/portage/media-libs/ftgl-2.1.3_rc5/work/ftgl-2.1.3~rc5
# patch -p0 < ~/ftgl-2.1.3_rc5_Makefile.patch
# ebuild ${EB} merge


Vorteil dieser Methode: es geht sehr schnell von der Hand ...
Nachteil: ein normales emerge kennt diesen Patch nicht ...
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

4

29.12.2010, 22:55

Easy Patching Hint

Es gibt nun auch mit den neuen portage Versionen eine weitere möglichkeit Patches einzuspielen (ohne das Ebuild bearbeiten zu müssen).

Ich zitiere hier einfach mal eine recht gute Beschreibung aus einem Bug-Report
http://bugs.gentoo.org/show_bug.cgi?id=349707#c11

Zitat

Easy Patching Hint:

FWIW, I don't know exactly when this VERY USEFUL new portage feature was
introduced, but all latest current versions (2.2/sets, 2.1.9.26 ~arch and
2.1.9.25 stable, at least) of portage appear to have this feature now....

Instead of worrying about updating the ebuild when you have "user" patches to
apply like this one, in /most/ cases, you can simply drop the patch as a file
in /etc/portage/patches/cat-egory/package(-version-optional)/*.patch and
portage will automatically try to apply it for you. =:^)

So for this one, I dropped the patch in:

/etc/portage/patches/kde-base/pykde4-4.5.4/pykde4-typedefs-fix.patch

Point: Make sure permissions on the directory chain are readable by the portage
user (and for security reasons, probably owned and only writable by root, you
don't want arbitrary users being able to apply whatever patches they want).

Point: The package dir version number is optional. In this case, I decided the
patch isn't likely to be needed (from my side) for more than a single version,
so I used the version number in the patches dir, so it won't apply to the next
one automatically. If it's your own patch to package functionality, you might
want to omit the version, so it automatically applies whenever the package
upgrades. I did that with one (kde3) package for awhile.

Point: The name of the patch file itself was the same one it has in bugzilla.
I saw no reason to change it, but I did change ownership (from the user I had
downloaded it as) and permissions as appropriate.

Here's what that the prepare phase of the the package build look like when it
finds a user patch in /etc/portage/patches/* to apply (using this package and
patch as an example):

>>> Preparing source in /tmp/portage/kde-base/pykde4-4.5.4/work/pykde4-4.5.4 ...
* Applying pykde4-mapped-type-fix.patch ...
[ ok ]
* Applying user patches from /etc/portage/patches//kde-base/pykde4-4.5.4 ...
* pykde4-typedefs-fix.patch ...
[ ok ]
* Done with patching
>>> Source prepared.

Note the "applying user patches"... bit and that it's NOT just the usual ebuild
listed patches applied! That's the new feature. =:^)

Just drop that patch in the appropriate /etc/portage/patches/ subdir, change
the ownership and permissions appropriately from what you happen to download
the patch-file as, and re-emerge the package. As you can see, once it's in the
proper location, portage automatically detects it and applies it for you. =:^)

In MOST cases, that eliminates any need to copy the ebuild to an overlay, add
the line applying the patch, and then re-digest the ebuild, since portage
handles it all automatically now, without even changing the ebuild. All you
have to do is have the patch in the right place and readable. =:^)

Occasionally you might come across a complex case where the automatic method
doesn't work and you have to do the ebuild-edit-and-redigest thing, but that
doesn't happen very often. (I've been using an earlier version of this for
years now, even using it when I was applying patches to help packages build
with a still-masked gcc version, as I usually unmask those well ahead of when
they hit ~arch, and have only had the automatic handling fail on me a couple of
times.)

As I said, even latest stable portage (well, I didn't test the old versions for
the lagging archs, but 2.1.9.25 has it, anyway) has this feature now. My
overlay gets WAY less use that it did before this feature, for sure, and where
the only reason you're using the overlay is to apply a patch like the one
attached to this bug, yours probably won't get as much use now either. =:^)

Duncan

@dyle
Wenn du dies hier eventuell noch ein wenig anders einpflegen möchtest (zb eine deutsche Übersetzung), dann kannst du diesen Beitrag natürlich entsprechend editieren oder auch entfernen.

5

30.12.2010, 08:15

Das ist doch mal eine echt gute neue Funktion von Portage. Ich habe mir bislang immer gleich ein eigenes ebuild erstellt mit den entsprechenden patch und es in mein Overlay gelegt.

Zum testen, ist diese Funktion von Portage aber sicher echt gut geeignet.

Viele Grüße