Red Hat Training

A Red Hat training course is available for RHEL 8

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.

Nota

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

  1. 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.

  2. 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;
    }
  3. 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 com .

    O uso das opções Naur com o comando diff é 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 que diff 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 manual diff.

  4. Salvar o patch em um arquivo:

    $ diff -Naur cello.c.origina cello.c > cello-output-first-patch.patch
  5. 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.

  1. Redirecionar o arquivo de patch para o comando patch:

    $ patch < cello-output-first-patch.patch
    patching file cello.c
  2. 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;
    }
  3. 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!