# [ebuild] epatch vs. patch

## V10lator

Dank eines Bugs in qemu-kvm war ich gezwungen ein ebuild in mein lokales Overlay zu kopieren um einen patch einspielen zu können. Das ebuild war fix angepasst doch funktionieren wollte es _nicht_.

Nach zig Tests war ich am verzweifeln: Patch per Hand einspielen funktionierte, per ebuild nicht. In meiner Verzweiflung änderte ich die Zeile

epatch "${FILESDIR}/mein.patch"

in

patch -p1 < "${FILESDIR}/mein.patch"

und siehe da: Es funktioniert!  :Shocked: 

Worin liegt also der Unterschied zwischen epatch und patch?

----------

## franzf

"epatch" gibts über "inherit eutils", was aber bei den ganzen qemu-kvm schon der Fall ist. Demnach musst du irgendwo anders einen Fehler machen.

Deshalb wäre es gut, du würdest dein angepasstes ebuild posten (vielleicht auch sagen, Welche qemu-kvm-Version du da anpasst).

Verwendest du portage oder einen anderen Paketmanager? (paludis, pkgcore)

Wie hast du das Overlay eingerichtet? Sieh mal hier: http://en.gentoo-wiki.com/wiki/Overlay#Local_Overlays

----------

## V10lator

```
--- /usr/portage/app-emulation/qemu-kvm/qemu-kvm-0.14.1-r1.ebuild   2011-05-31 17:53:45.000000000 +0200

+++ /usr/local/portage/app-emulation/qemu-kvm/qemu-kvm-0.14.1-r1.ebuild   2011-06-09 06:51:39.841602137 +0200

@@ -128,6 +128,9 @@

    # to the qemu-devel ml - bug 337988

    epatch "${FILESDIR}/qemu-0.11.0-mips64-user-fix.patch"

 

+   einfo "Applying qxl.patch"

+   patch -p1 <"${FILESDIR}/qxl.patch"

+

    [[ -n ${BACKPORTS} ]] && \

       EPATCH_FORCE=yes EPATCH_SUFFIX="patch" EPATCH_SOURCE="${S}/patches" \

          epatch
```

(Wobei ich anstelle der Zeile

patch -p1 <"${FILESDIR}/qxl.patch"

wie bereits erwähnt eig. ein

epatch"${FILESDIR}/qxl.patch"

haben wollte.

Der Patch: http://paste.pocoo.org/show/403245/

```
# cat /usr/local/portage/profiles/repo_name

Local-Overlay

# cat /etc/make.conf | grep PORTDIR_OVERLAY

PORTDIR_OVERLAY="/usr/local/portage"
```

Ich nutze portage.

----------

## franzf

 *V10lator wrote:*   

> Worin liegt also der Unterschied zwischen epatch und patch?

 

Schau dir mal /usr/portage/eclass/eutils.eclass an, da findest du Beschreibung und Code von epatch - es macht einiges mehr als patch, verwendet es aber intern zum patchen.

Schaut aber eigentlich alles OK aus (Bis auf das fehlende Leerzeichen zwischen epatch und dem ", aber nehme an, das war nur ein Leertastenklemmer in deinem letzten Post). Kannst du vllt. noch die komplette Fehlermeldung posten, die portage ausspuckt?

Evtl. auch das build-log (in der Meldung von portage wird dir auch gesagt, wo das Teil liegt) und die Fehlermeldung des patch-cmd, wenn es nur da ein Problem gegeben haben sollte (portage sagt auch hier den Dateinamen).

----------

## V10lator

 *franzf wrote:*   

> Bis auf das fehlende Leerzeichen zwischen epatch und dem ", aber nehme an, das war nur ein Leertastenklemmer in deinem letzten Post

 Richtig.  :Smile: 

 *Quote:*   

> Kannst du vllt. noch die komplette Fehlermeldung posten, die portage ausspuckt?

 Hier erstmal mit dem Workaround (direkter Aufruf von patch):

```
 * Applying qemu-0.11.0-mips64-user-fix.patch ...                         [ ok ]

 * Applying qxl.patch

patching file hw/qxl.c

patching file hw/qxl.h

patching file ui/spice-display.c

Hunk #1 succeeded at 78 (offset -1 lines).

Hunk #2 succeeded at 141 (offset -1 lines).

Hunk #3 succeeded at 300 (offset -1 lines).

patching file ui/spice-display.h

patching file hw/qxl.c

patching file hw/qxl.c

patching file ui/spice-display.h

patching file hw/qxl-render.c

patching file hw/qxl.c

patching file ui/spice-display.c

Hunk #1 succeeded at 186 (offset -1 lines).

Hunk #2 succeeded at 203 (offset -1 lines).

 * Applying various patches (bugfixes/updates) ...
```

Also alles OK!

Nun mit epatch:

```
 * Applying qemu-0.11.0-mips64-user-fix.patch ...                         [ ok ]

 * Applying qxl.patch

 * Applying qxl.patch ...

 * Failed Patch: qxl.patch !

 *  ( /usr/local/portage/app-emulation/qemu-kvm/files/qxl.patch )

 * 

 * Include in your bugreport the contents of:

 * 

 *   /var/tmp/portage/app-emulation/qemu-kvm-0.14.1-r1/temp/qxl.patch.out

 * ERROR: app-emulation/qemu-kvm-0.14.1-r1 failed (prepare phase):

 *   Failed Patch: qxl.patch!

 * 

 * Call stack:

 *     ebuild.sh, line   56:  Called src_prepare

 *   environment, line 3576:  Called epatch '/usr/local/portage/app-emulation/qemu-kvm/files/qxl.patch'

 *   environment, line 1626:  Called die

 * The specific snippet of code:

 *               die "Failed Patch: ${patchname}!";

 * 

 * If you need support, post the output of 'emerge --info =app-emulation/qemu-kvm-0.14.1-r1',

 * the complete build log and the output of 'emerge -pqv =app-emulation/qemu-kvm-0.14.1-r1'.

 * This ebuild is from an overlay named 'Local-Overlay': '/usr/local/portage/'

 * The complete build log is located at '/var/tmp/portage/app-emulation/qemu-kvm-0.14.1-r1/temp/build.log'.

 * The ebuild environment file is located at '/var/tmp/portage/app-emulation/qemu-kvm-0.14.1-r1/temp/environment'.

 * S: '/var/tmp/portage/app-emulation/qemu-kvm-0.14.1-r1/work/qemu-kvm-0.14.1'

>>> Failed to emerge app-emulation/qemu-kvm-0.14.1-r1, Log file:

>>>  '/var/tmp/portage/app-emulation/qemu-kvm-0.14.1-r1/temp/build.log'
```

Dazu noch die /var/tmp/portage/app-emulation/qemu-kvm-0.14.1-r1/temp/qxl.patch.out: http://paste.pocoo.org/show/403276/

bzw. der relevante Teil:

```
PATCH COMMAND:  patch -p1 -g0 -E --no-backup-if-mismatch < '/usr/local/portage/app-emulation/qemu-kvm/files/qxl.patch'

=====================

patching file hw/qxl.c

patching file hw/qxl.h

patching file ui/spice-display.c

Hunk #1 succeeded at 78 (offset -1 lines).

Hunk #2 succeeded at 141 (offset -1 lines).

Hunk #3 succeeded at 300 (offset -1 lines).

patching file ui/spice-display.h

patching file hw/qxl.c

Hunk #1 FAILED at 1083.

1 out of 1 hunk FAILED -- saving rejects to file hw/qxl.c.rej

patching file hw/qxl.c

Hunk #1 FAILED at 356.

Hunk #2 FAILED at 364.

Hunk #3 succeeded at 587 (offset -24 lines).

Hunk #4 FAILED at 1061.

Hunk #5 FAILED at 1069.

Hunk #6 FAILED at 1081.

Hunk #7 FAILED at 1129.

6 out of 7 hunks FAILED -- saving rejects to file hw/qxl.c.rej

patching file ui/spice-display.h

Hunk #1 FAILED at 48.

1 out of 1 hunk FAILED -- saving rejects to file ui/spice-display.h.rej

patching file hw/qxl-render.c

patching file hw/qxl.c

Hunk #1 succeeded at 662 (offset -25 lines).

Hunk #2 succeeded at 793 (offset -25 lines).

Hunk #3 succeeded at 862 (offset -25 lines).

Hunk #4 succeeded at 932 (offset -25 lines).

patching file ui/spice-display.c

Hunk #1 succeeded at 186 (offset -1 lines).

Hunk #2 succeeded at 203 (offset -1 lines).
```

----------

## firefly

funktioniert es auch nicht, wenn du den patch befehl von hand genauso ausführst wie portage?

----------

## V10lator

Ich habe gerade Testweise die patch Zeile im ebuild ersetzt durch:

```
patch -p1 -g0 -E --no-backup-if-mismatch < /usr/local/portage/app-emulation/qemu-kvm/files/qxl.patch
```

Also genau der Zeile die epatch benutzt. Doch anders als epatch funktioniert auch diese Zeile einwandfrei.

Zeit für einen Bug-Report?

----------

## franzf

Wie bist du an den Patch gekommen?

Hab mir den mal kurz angeschaut. Die selbe Stelle (z.B. in pipe_read) wird mehrmals umgepatcht, das könnte man mal ganz ordentlich und sauber neu machen.

Und diese Zeile ist ziemlicher Unsinn:

```
@@ -1058,16 +1082,27 @@ static void qxl_map(PCIDevice *pci, int region_num,

 static void pipe_read(void *opaque)

 {

     PCIQXLDevice *d = opaque;
```

Mitten in der Zeile wird bei den Funktionsparametern umgebrochen und eine neue Funktionsdefinition angefangen.

Das ist schonmal aus C-Sicht nicht möglich, der Original-Code wird das sicher nicht machen.

Da dieser Teil ganz weit oben kommt, kann daraus auch ein Folgefehler für die ganzen anderen Sachen resultieren.

Warum das mit patch (ohne epatch) funktioniert weiß ich nicht. Ich installier grad die ungepatchte Version, und werde in etwa 1,5-2h die mit dem Patch versuchen (sry, mein Rechner ist relativ alt, das dauert.... und ich muss jetzt erstmal weg).

----------

## V10lator

Die genaue Quelle des Patches müsste ich nochmal suchen. Dieser patch sorgt dafür das man (wieder) zeitgleich KVM und QXL verwenden kann.  :Wink: 

Das er unsauber ist liegt daran das er aus einer Mailinglist entnommen wurde und eig. aus 6 Patches besteht, wovon der erste dafür da ist einen Patch rückgängig zu machen der in der gentoo Version auch noch nicht enthalten ist, es sind also 5 aneinandergereihte Patches. Sicher könnte man die Sources auch 2 mal entpacken, einmal die 5 Patches anwenden und dann per diff einen sauberen Patch ziehen, ich bin aber faul und der Patch scheint ja an und für sich zu funktionieren.

Ach ja, in der aktuellen git Version sollten diese Patches ebenso enthalten sein, das sie fehlerhaft geschrieben wurden wage ich also zu bezweifeln.

Aber all das ist nicht Kern der Frage: Wieso funktioniert es mit patch, nicht aber mit epatch? (Bug?)

//EDIT: Und da die Sources mit den Patches auch kompilieren und die resultierenden Binarys fehlerfrei laufen kann ich auch nicht glauben das das von dir genannte Konstrukt unmöglich ist, dann dürfte es dem Compiler doch nicht gefallen?  :Wink: 

//EDIT²: Ich habe die Patches zwar nicht genau von dieser Seite sondern aus einem anderen Archiv der selben Mailinglist, aber das sollte ja nichts machen: http://lists.fedoraproject.org/pipermail/virt/2011-March/002572.html - Wie gesagt wurde der erste Patch nicht verwendet da dieser nur diesen Patch rückgängig macht, welcher das Problem ursprünglich lösen sollte.

----------

## Necoro

 *franzf wrote:*   

> 
> 
> ```
> @@ -1058,16 +1082,27 @@ static void qxl_map(PCIDevice *pci, int region_num,
> 
> ...

 

Das liest du falsch ...

in der @@... Zeile stehen nur Meta-Informationen drin -- halt unter anderem, in welcher Funktion man gerade ist (auch wenns an dieser Stelle keinen Sinn ergibt  :Smile: ). Das dient nur um Patches, denen man nicht ansieht wo genau sie eine Änderung ausführen, zuordnen zu können.

----------

