Patch

Da Wiki :: openmamba.
Jump to navigation Jump to search

Una patch è normalmente costituita da un file che contiene, in uno specifico formato, informazioni circa le differenze da applicare ad uno o più file di codice sorgente.

La seguente patch modifica il codice sorgente di mpeg4ip per la compilazione con GCC 4:

--- mpeg4ip-1.5.0.1/common/video/iso-mpeg4/src/type_basic.cpp	2005-05-04 21:56:00.000000000 +0200
+++ mpeg4ip-1.5.0.1.patched/common/video/iso-mpeg4/src/type_basic.cpp	2008-06-06 01:35:06.000000000 +0200
@@ -317,13 +317,13 @@
 	iHalfY = m_vctTrueHalfPel.y - iMVY * 2;
 }
 
-Void CMotionVector::setToZero (Void)
+Void CMotionVector::setToZero ()
 {
 	memset (this, 0, sizeof (*this));
 }
 
 // RRV insertion
-Void CMotionVector::scaleup (Void)
+Void CMotionVector::scaleup ()
 {
 	if(m_vctTrueHalfPel.x == 0){
 		m_vctTrueHalfPel_x2.x = 0;

Poiché il codice sorgente è stato scritto per versioni precedenti del compilatore GCC occore applicare (tra le altre) questa modifica.

Creazione di una patch

Supponendo di avere in locale i sorgenti del pacchetto RPM per il quale andiamo a creare ed applicare la patch, lo prepariamo nella cartella /usr/src/RPM/BUILD con il comando:

rpmbuild -bp mpeg4ip.spec

Effettuiamo una copia della cartella sorgente:

cd /usr/src/RPM/BUILD
cp -a mpeg4ip-1.5.0.1 mpeg4ip-1.5.0.1.orig

Entriamo nella cartella mpeg4ip e modifichiamo il file common/video/iso-mpeg4/src/type_basic.cpp sostituendo

Void CMotionVector::setToZero (Void)

con

Void CMotionVector::setToZero ()

e

Void CMotionVector::scaleup (Void)

con

Void CMotionVector::scaleup ()

A questo punto torniamo nella cartella di build e creiamo la patch utilizzando il comando diff con l'opzione -Nru:

cd /usr/src/RPM/BUILD
diff -Nru mpeg4ip-1.5.0.1.orig mpeg4ip-1.5.0.1 > ../SOURCES/mpeg4ip-1.5.0.1-gcc4.patch

Applicazione di una patch

Aggiungiamo nello specfile di mpeg4ip il nome del file contenente la patch:

Patch0:        mpeg4ip-1.5.0.1-gcc4.patch

e la applichiamo nella sezione %prep subito dopo che l'archivio sorgente viene scompattato con la macro %setup. Esempio:

%prep
%setup -q
%patch0 -p1