2.4. Software de parcheo
En esta sección se explica cómo parchear el software.
En el empaquetado RPM, en lugar de modificar el código fuente original, lo conservamos y utilizamos parches sobre él.
Un parche es un código fuente que actualiza otro código fuente. Se formatea como un diff, porque representa lo que es diferente entre dos versiones del texto. Un diff se crea con la utilidad diff
, que luego se aplica al código fuente con la utilidad de parche.
Los desarrolladores de software suelen utilizar sistemas de control de versiones como git para gestionar su base de código. Estas herramientas proporcionan sus propios métodos para crear diffs o parchear el software.
El siguiente ejemplo muestra cómo crear un parche a partir del código fuente original utilizando diff
, y cómo aplicar el parche utilizando patch
. El parcheado se utiliza en una sección posterior al crear un RPM; véase Sección 3.2, “Trabajar con archivos SPEC”.
Este procedimiento muestra cómo crear un parche a partir del código fuente original de cello.c
.
Procedimiento
Conservar el código fuente original:
cp -p cello.c cello.c.orig
$ cp -p cello.c cello.c.orig
Copy to Clipboard Copied! La opción
-p
se utiliza para conservar el modo, la propiedad y las marcas de tiempo.Modifique
cello.c
según sea necesario:#include <stdio.h> int main(void) { printf("Hello World from my very first patch!\n"); return 0; }
#include <stdio.h> int main(void) { printf("Hello World from my very first patch!\n"); return 0; }
Copy to Clipboard Copied! Genere un parche utilizando la utilidad
diff
:diff -Naur cello.c.orig cello.c
$ diff -Naur cello.c.orig cello.c --- cello.c.orig 2016-05-26 17:21:30.478523360 -0500 + cello.c 2016-05-27 14:53:20.668588245 -0500 @@ -1,6 +1,6 @@ #include<stdio.h> int main(void){ - printf("Hello World!\n"); + printf("Hello World from my very first patch!\n"); return 0; } \ No newline at end of file
Copy to Clipboard Copied! Las líneas que empiezan por
-
se eliminan del código fuente original y se sustituyen por las líneas que empiezan porSe recomienda utilizar las opciones
Naur
con el comandodiff
porque se ajusta a la mayoría de los casos de uso habituales. Sin embargo, en este caso particular, sólo es necesaria la opción-u
. Las opciones particulares garantizan lo siguiente:-
-N
(o--new-file
) - Maneja los archivos ausentes como si fueran archivos vacíos. -
-a
(o--text
) - Trata todos los archivos como texto. Como resultado, los archivos quediff
clasifica como binarios no son ignorados. -
-u
(o-U NUM
o--unified[=NUM]
) - Devuelve el resultado en forma de salida NUM (por defecto 3) líneas de contexto unificado. Este es un formato fácilmente legible que permite una coincidencia difusa al aplicar el parche a un árbol de fuentes modificado. -r
(o--recursive
) - Compara de forma recursiva los subdirectorios encontrados.Para más información sobre los argumentos habituales de la utilidad
diff
, consulte la página del manualdiff
.
-
Guarda el parche en un archivo:
diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
$ diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
Copy to Clipboard Copied! Restaurar el original
cello.c
:cp cello.c.orig cello.c
$ cp cello.c.orig cello.c
Copy to Clipboard Copied! El original
cello.c
debe conservarse, porque cuando se construye un RPM, se utiliza el archivo original, no el modificado. Para más información, consulte Sección 3.2, “Trabajar con archivos SPEC”.
El siguiente procedimiento muestra cómo parchear cello.c
utilizando cello-output-first-patch.patch
, construir el programa parcheado y ejecutarlo.
Redirige el archivo de parches al comando
patch
:patch < cello-output-first-patch.patch
$ patch < cello-output-first-patch.patch patching file cello.c
Copy to Clipboard Copied! Compruebe que el contenido de
cello.c
refleja ahora el parche:cat cello.c #include<stdio.h> int main(void){ printf("Hello World from my very first patch!\n"); return 1; }
$ cat cello.c #include<stdio.h> int main(void){ printf("Hello World from my very first patch!\n"); return 1; }
Copy to Clipboard Copied! Construya y ejecute el parche
cello.c
:make clean make ./cello
$ make clean rm cello $ make gcc -g -o cello cello.c $ ./cello Hello World from my very first patch!
Copy to Clipboard Copied!