2.4. Software de remendo
Esta seção explica como consertar o software.
Na embalagem RPM, em vez de modificar o código fonte original, nós o mantemos e usamos patches nele.
Um patch é um código fonte que atualiza outro código fonte. Ele é formatado como um diff, porque representa o que há de diferente entre duas versões do texto. Um diff é criado usando o utilitário diff
, que é então aplicado ao código-fonte usando o utilitário de patch.
Os desenvolvedores de software freqüentemente usam Sistemas de Controle de Versão como o git para gerenciar sua base de códigos. Tais ferramentas fornecem seus próprios métodos de criação de diffs ou de software de correção.
O exemplo a seguir mostra como criar um patch a partir do código fonte original usando diff
, e como aplicar o patch usando patch
. O patch é usado em uma seção posterior ao criar um RPM; ver Seção 3.2, “Trabalhando com arquivos SPEC”.
Este procedimento mostra como criar um patch a partir do código fonte original para cello.c
.
Procedimento
Preservar o código fonte original:
$ cp -p cello.c cello.c.origina
A opção
-p
é usada para preservar o modo, a propriedade e os carimbos de data e hora.Modifique o site
cello.c
conforme necessário:#include <stdio.h> int main(void) { printf("Hello World from my very first patch!\n"); return 0; }
Gerar um patch usando o utilitário
diff
:$ 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
As linhas que começam com um
-
são removidas do código fonte original e substituídas pelas linhas que começam comO uso das opções
Naur
com o comandodiff
é recomendado porque se encaixa na maioria dos casos de uso habitual. Entretanto, neste caso em particular, somente a opção-u
é necessária. As opções particulares garantem o seguinte:-
-N
(ou--new-file
) - Manipula arquivos ausentes como se fossem arquivos vazios. -
-a
(ou--text
) - Trata todos os arquivos como texto. Como resultado, os arquivos quediff
classifica como binários não são ignorados. -
-u
(ou-U NUM
ou--unified[=NUM]
) - Retorna a saída sob a forma de linhas NUM (padrão 3) de contexto unificado. Este é um formato de fácil leitura que permite uma correspondência difusa ao aplicar o patch a uma árvore de origem alterada. -r
(ou--recursive
) - Compara recursivamente quaisquer subdiretórios que sejam encontrados.Para mais informações sobre os argumentos comuns para a utilidade
diff
, consulte a página do manualdiff
.
-
Salvar o patch em um arquivo:
$ diff -Naur cello.c.origina cello.c > cello-output-first-patch.patch
Restaurar o original
cello.c
:$ cp cello.c.origina cello.c
O original
cello.c
deve ser mantido, pois quando se constrói um RPM, é utilizado o arquivo original e não o modificado. Para maiores informações, veja Seção 3.2, “Trabalhando com arquivos SPEC”.
O procedimento a seguir mostra como remendar cello.c
usando cello-output-first-patch.patch
, construir o programa remendado e executá-lo.
Redirecionar o arquivo de patch para o comando
patch
:$ patch < cello-output-first-patch.patch patching file cello.c
Verifique se o conteúdo de
cello.c
agora reflete o adesivo:$ cat cello.c #include<stdio.h> int main(void){ printf("Hello World from my very first patch!\n"); return 1; }
Construir e executar o remendado
cello.c
:$ make clean rm cello $ make gcc -g -o cello cello.c $ ./cello Hello World from my very first patch!