Ga naar inhoud


Hoe patch je de broncode


Lamko

Aanbevolen berichten

Vaak zie ik mensen zich afvragen hoe ze een patch bestand moeten uitvoeren. Deze bestanden worden soms ook wel diff bestanden genoemd na het programma wat ze gemaakt heeft. Om een diff bestand te maken heeft iemand twee kopieen van de broncode gemaakt en heeft de DIFFerences (verschillen) tussen de twee broncode mappen opgeslagen. In realiteit zijn dit de verschillen in twee verschillende teksten dat gebruikt wordt om het programma te compileren. Dit is dus geen update want dan krijg je alles.

Wanneer je de inhoud van het patch bestand bekijkt dan zijn er verschillende regels aan het begin van het bestand die aangeven hoeveel lijnen aangepast moeten worden om de code aan te passen (patchen). Denk er ook aan voor welke versie de patch gemaakt is, verrassend genoeg is dit niet het belangrijkste wat je wel zou denken. Daarvoor zijn er namelijk de twee parameters : -p en -f.

De -p parameter laat zien hoeveel je moet strippen. Om je een voorbeeld te geven mijn mythtv broncode staat in de directory /usr/src/mythtv en ik wil deze patch toepassen :

Index: libs/libmythtv/eitscanner.cpp
===================================================================
--- libs/libmythtv/eitscanner.cpp.orig  2006-09-29 09:37:12.000000000 -0700
+++ libs/libmythtv/eitscanner.cpp       2006-09-29 16:09:15.000000000 -0700

Dit geeft aan dat de patch het bestand /usr/src/mythtv/libs/libmythtv/eitscanner.cpp zal aanpassen. Het vertelt ook dat het gemaakt is van het bestand /usr/src/mythtv/libs/libmythtv/eitscanner.cpp.orig.
Om deze patch toe te passen, kopieert de patch naar /usr/src/mythtv directory en gebruik -p0 (haal niks vanaf het pad af)

Nog maar een voorbeeld (ongeveer het zelfde voorbeeld)

diff -ruN mythtv.14471.orig/libs/libmythtv/eitscanner.cpp mythtv.14471/libs/libm
ythtv/eitscanner.cpp
--- mythtv.14471.orig/libs/libmythtv/eitscanner.cpp     2007-09-09 19:02:56.0000
00000 -0500
+++ mythtv.14471/libs/libmythtv/eitscanner.cpp  2007-09-09 19:15:01.000000000 -0
500

In deze patch kan ik zien dat het bestand mythtv.14471/libs/libmythtv/eitscanner.cpp wordt aangepast. Op mijn computer heb ik geen mythtv.14471 map dus moet het eerste stuk eraf gestript worden (mythtv.14471) en niet het tweede gedeelte. (-p1)

Het volgende wat je moet weten is dat je patch niet teveel verschilt van de versie die jij hebt gedownload als ze niet in versie overeenkomen. Een stukje code dat gepatched wordt ziet er bijvoorbeeld zo uit :

@@ -216,7 +216,7 @@
}

void EITScanner::StartActiveScan(TVRec *_rec, uint max_seconds_per_source,
-                                 bool _ignore_source)
+                                 bool _ignore_source, bool limit_transports)
{
     rec           = _rec;
     ignore_source = _ignore_source;

Elk gedeelte begint met en eindigt met @@. Dit stuk code verandert 7 lijnen code (Er zijn versies van diff die dit niet vermelden) in het orginele bestand op regelnummer 216. Het + stuk geeft aan welke code veranderd wordt in het bestand wat aangepast dient te worden. Je zou dus naar het orginele bestand kunnen kijken op regelnummer 216 en je zou zien dat het stuk er boven geen + heeft. De rest van de regels worden gebruikt om de positie van de code te vinden die aangepast dient te worden.

Deze verandering veranderd de volgende lijn:
bool_ignore_source)
to
boot_ignore_source, bool limit_transports)

De regels erom heen gebruikt het patch programma om de regels te vinden. Je kan dit effect detecteren met de -F parameter. Het geeft aan hoeveel niet overeenkomende lijnen je kan negeren. Bijv. als de patch en de code die je hebt niet voor de juiste versie is en dit komt vrij vaak voor omdat niemand zin heeft om de patches bij te houden. Hoeveel regels dus opgeschoven zijn door bijv. extra code die toegevoegd is aan het bestand.

De meeste patches die je zult vinden kan je simpel toepassen met de -p parameter.
Voorb. patch -p0 < naamvandepatch.diff

Maar voor anderen zul je bijv. aan moeten geven hoever ze uit sync zijn met het origineel. Dit vindt ik zelf meestal te veel romslomp om dit uit te tellen en kijk ik gewoon wat er bij is gekomen en pas ik het handmatig aan met een tekstbewerker zoals nano of gedit. Vi leren is teveel moeite als je kijkt dat ik spontaan maar iets in een tekstbestand zit aan te passen.
Maar toch maar een voorbeeld voor de diehards :
patch -p0 -F3

Als de patch gelukt is dan zou je zoiets als dit zien :
patching file libs/libmythtv/mpeg/dvbstreamdata.cpp
Hunk #1 succeeded at 138 (offset -1 lines).

Als je iets probeerd te patchen wat al gepatched is zal het patch programma dit detecteren en je een waarschuwing geven. In de trant van :
Reversed (or previously applied) patch detected! Assume -R?[n]

Dit betekend dat het patch programma de regels al heeft gevonden en gezien heeft dat de patch al toegepast is. Hij vraagt daarbij of je de patch ongedaan wilt maken. Door hier op te antwoorden met y zal de patch ongedaan maken. Door hier op te antwoorden met n zal niks doen.

Als het bestand niet goed gepatched wil worden dan krijg je zo iets als hieronder :
4 out of 4 hunks ignored -- saving rejects to file libs/libmythtv/mpeg/dvbstreamdata.cpp.rej

Dit betekend dat 4 stukken code van de patch niet doorgevoerd zijn en deze stukken naar het bestand libs/libmythtv/mpeg/dvbstreamdata.cpp.rej

Als dit gebeurt heb je twee verschillende keuzes. Je kijkt naar de patches die niet willen doorvoeren en probeert ze met de hand te patchen (logisch nadenken) of wachten dat er een geupdate patch komt die wel geschikt is voor jouw versie.

Ps nog een laatste tip

Voordat je een patch uitvoert kun je ook de parameter --dry-run uitvoeren dan gebeurt er niks en hoef je de source ook niet opnieuw te downloaden als er iets mis gaat.

patch -p1 -l < patch.diff --dry-run

 

Voor vragen kun je hier terecht om deze informatie voor iedereen nog toegankelijker te maken.

 

Fouten zijn onder voorbehoud en dienen per pm aan mij teruggekoppeld te worden.

Tevens is dit een vertaling vanaf het Dvbn forum en alle credit komt toe aan de werkelijke auteur Torxbit

Sommige delen heb ik zelf verduidelijkt waar me dat toepasselijk leek.

Mythbuntu 12.04

Celeron 220 op Mini-ITX D201GLY2, 1 GB Ram,2x1,5 TB HDD, Digitenne op TerraTec Cinergy, CCcam

Link naar reactie
Delen op andere sites


Maak een account aan of log in om te reageren

Je moet een lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Registreer voor een nieuwe account in onze community. Het is erg gemakkelijk!

Registreer een nieuwe account

Inloggen

Heb je reeds een account? Log hier in.

Nu inloggen
×
×
  • Nieuwe aanmaken...