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
$ cp -p cello.c cello.c.originaCopy to Clipboard Copied! Toggle word wrap Toggle overflow A opção
-pé usada para preservar o modo, a propriedade e os carimbos de data e hora.Modifique o site
cello.cconforme necessário:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gerar um patch usando o utilitário
diff:Copy to Clipboard Copied! Toggle word wrap Toggle overflow As linhas que começam com um
-são removidas do código fonte original e substituídas pelas linhas que começam com.O uso das opções
Naurcom 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 quediffclassifica como binários não são ignorados. -
-u(ou-U NUMou--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
$ diff -Naur cello.c.origina cello.c > cello-output-first-patch.patchCopy to Clipboard Copied! Toggle word wrap Toggle overflow Restaurar o original
cello.c:cp cello.c.origina cello.c
$ cp cello.c.origina cello.cCopy to Clipboard Copied! Toggle word wrap Toggle overflow O original
cello.cdeve 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
$ patch < cello-output-first-patch.patch patching file cello.cCopy to Clipboard Copied! Toggle word wrap Toggle overflow Verifique se o conteúdo de
cello.cagora reflete o adesivo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Construir e executar o remendado
cello.c:Copy to Clipboard Copied! Toggle word wrap Toggle overflow