Você está na página 1de 10

Eventualmente os desenvolvedores de soluções lançam

correções ("patches") para os seus produtos – seja para


corrigir bugs, aprimorar questões de segurança, incluir alguma
funcionalidade necessária etc.

Dessa forma, eles criam arquivos de "patch" contendo somente


o que foi alterado e/ou incluído na nova versão e disponibiliza-
os aos usuários para que possam aplicá-las em seus
programas. Ou seja, o usuário não precisa baixar novamente
todos os códigos-fonte para instalar a nova versão – basta
utilizar o patch para aplicar tudo o que foi alterado.

Para visualizar esta questão na prática, vamos entrar no


subdiretório lighttpd-1.4.52 e realizar o procedimento de
instalação do programa. Para isto, como já sabemos, vamos
primeiramente executar o seu script "configure": 

[root@curso7:/usr/src/lighttpd-1.4.52/]# ./configure

configure: error: bzip2 headers not found, install them or build


without --with-bzip2

Note que o script acusou a inexistência de cabeçalhos bzip2 e,


devido a isto, o arquivo "Makefile" ainda não foi gerado. Isso
reforça o já dito: a instalação de programas a partir dos seus
códigos-fonte não resolve dependências. Não esqueça disto no
dia do exame!

Como estamos utilizando o CentOS para compor esses


exemplos, vamos utilizar o yum para instalar o pacote
necessário:

[root@curso7:/usr/src/lighttpd-1.4.52/]# yum install bzip2-


devel   

Com o pacote requerido já posicionado no sistema,


executamos novamente o script "configure" para que seja
criado o script "Makefile". Agora, basta seguir o procedimento
normal:

# Compilação

[root@curso7:/usr/src/lighttpd-1.4.52/]# make

# Instalação

[root@curso7:/usr/src/lighttpd-1.4.52/]# make install 

Como o script "configure" foi executado sem a utilização da


opção --prefix=, os arquivos do programa são posicionados
sob a hierarquia /usr/local, com o executável posicionado
em /usr/local/sbin, bibliotecas em /usr/local/lib, documentações
em /usr/local/share/man etc.

Com o programa já instalado, vamos executá-lo passando-lhe


a opção –h:

[root@curso7:/usr/src/lighttpd-1.4.52/]# lighttpd –h

lighttpd/1.4.52 - a light and fast webserver

usage:

-f     filename of the config-file

-m   module directory (default: /usr/local/lib)

-i     graceful shutdown after of inactivity

-1    process single (one) request on stdin socket, then exit

-p    print the parsed config-file in internal form, and exit


-t    test config-file syntax, then exit

-tt    test config-file syntax, load and init modules, then exit

-D    don't go to background (default: go to background)

-v     show version

-V     show compile-time features

-h     show this help

Podemos gerar um "patch" bem simples para, por exemplo,


alterar a descrição da opção –v. Ao contrário de exibir "show
version", será exibido "SHOW VERSION". Ou seja, estaremos
aplicando uma "correção" no programa.

Para isto, o primeiro passo é descobrir em qual arquivo esta


string ("show version") encontra-se posicionada:

[root@curso7:/usr/src/lighttpd-1.4.52/]# grep –r "show version"


*

src/server.c:" -v         show version\n" \

Note que o arquivo é nomeado como "server.c" e encontra-se


no subdiretório src. Desta forma, vamos até lá e, em seguida,
criaremos uma cópia deste arquivo, nomeando-a como
"servernew.c":

[root@curso7:/usr/src/lighttpd-1.4.52/src/]# cp server.c
servernew.c

Após abrir o arquivo "servernew.c", basta localizar a linha que


contenha a string "show version" e realizar a alteração. Após
salvar e sair da edição do arquivo, lançamos o
comando diff junto à opção –u, redirecionando a saída para o
arquivo "lighttpd.path" (que será criado). O comando diff irá
salvar neste arquivo as diferenças que foram encontradas
entre os arquivos "server.c" e "servernew.c":

[root@curso7:/usr/src/lighttpd-1.4.52/src/]# diff -u server.c


servernew.c > lighttpd.patch

[root@curso7:/usr/src/lighttpd-1.4.52/src]# cat lighttpd.patch

--- server.c    2018-11-29 02:07:46.000000000 -0200

+++ servernew.c 2019-11-28 13:13:03.798873060 -0300

@@ -646,7 +646,7 @@

 " -t         test config-file syntax, then exit\n" \

 " -tt        test config-file syntax, load and init modules, then exit\
n" \

 " -D         don't go to background (default: go to background)\n"


\

-" -v         show version\n" \

+" -v         SHOW VERSION\n" \

 " -V         show compile-time features\n" \

 " -h         show this help\n" \

 "\n"

Para aplicar o "patch" aos códigos-fonte do programa, basta


utilizar o comando patch:
[root@curso7:/usr/src/lighttpd-1.4.52/src/]# patch <
lighttpd.patch

patching file server.c

Neste momento, após abrirmos o arquivo "server.c", já


poderemos notar que a alteração já foi devidamente aplicada:

 " -f   filename of the config-file\n" \

" -m   module directory (default: "LIBRARY_DIR")\n" \

" -i   graceful shutdown after of inactivity\n" \

" -1         process single (one) request on stdin socket, then exit\
n" \

" -p         print the parsed config-file in internal form, and exit\
n" \

" -t         test config-file syntax, then exit\n" \

" -tt        test config-file syntax, load and init modules, then exit\
n" \

" -D         don't go to background (default: go to background)\


n" \

" -v         SHOW VERSION\n" \

" -V         show compile-time features\n" \

" -h         show this help\n" \

Em seguida, após voltar ao subdiretório lighttpd-1.4.52, vamos


lançar os comandos make e make install: 
[root@curso7:/usr/src/lighttpd-1.4.52/]# make

[root@curso7:/usr/src/lighttpd-1.4.52/]# make install

Para conferir o sucesso da operação, lançamos novamente o


programa lighttpd junto à opção –h:

[root@curso7:/usr/src/lighttpd-1.4.52/]# lighttpd –h

lighttpd/1.4.52 - a light and fast webserver

usage:

 -f   filename of the config-file

 -m   module directory (default: /usr/local/lib)

 -i   graceful shutdown after of inactivity

 -1         process single (one) request on stdin socket, then exit

 -p         print the parsed config-file in internal form, and exit

 -t         test config-file syntax, then exit

 -tt        test config-file syntax, load and init modules, then exit

 -D         don't go to background (default: go to background)

 -v         SHOW VERSION

 -V         show compile-time features

 -h         show this help

Caso seja necessário remover o "patch" aplicado, basta utilizar


o comando patch junto à opção –R e, em seguida, compilar e
instalar novamente o programa:

[root@curso7:/usr/src/lighttpd-1.4.52/src/]# patch –R <


lighttpd.patch

patching file server.c

[root@curso7:/usr/src/lighttpd-1.4.52/]# make && make install

[root@curso7:/usr/src/lighttpd-1.4.52/src/]# lighttpd –h

lighttpd/1.4.52 - a light and fast webserver

usage:

 -f   filename of the config-file

 -m   module directory (default: /usr/local/lib)

 -i   graceful shutdown after of inactivity

 -1         process single (one) request on stdin socket, then exit

 -p         print the parsed config-file in internal form, and exit

 -t         test config-file syntax, then exit

 -tt        test config-file syntax, load and init modules, then exit

 -D         don't go to background (default: go to background)

 -v         show version

 -V         show compile-time features


 -h         show this help

Quando aplicamos o "patch", estávamos localizados no


subdiretório /usr/src/lighttpd-1.4.52/src – e de lá, fizemos todo o
procedimento. Entretanto, observe o seguinte cenário:

# Gerando a cópia do arquivo "server.c" (estando em


/usr/src/lighttpd-

# 1.4.52/src/)

[root@curso7:/usr/src/lighttpd-1.4.52/src/]# cp server.c
newserver.c

Após criarmos a nova cópia, vamos editá-la e novamente


alterar a linha "show version", mas desta vez para "SHOW-
version".

Vamos agora criar o arquivo de "patch" a partir do


diretório /usr/src – nomeando-o como "lighttpd2.patch". Além
disso, vamos informar os caminhos completos até os arquivos
"server.c" e "newserver.c":

[root@curso7:/usr/src/lighttpd-1.4.52/src/]# cd /usr/src

[root@curso7:/usr/src/]# diff -u
/usr/src/lighttpd-1.4.52/src/server.c
/usr/src/lighttpd-1.4.52/src/newserver.c > ./lighttpd2.patch

Tentativa de aplicação do "patch":

[root@curso7:/usr/src/]# patch < lighttpd2.path

can't find file to patch at input line 3

Perhaps you should have used the -p or --strip option?


The text leading up to this was:

--------------------------

|--- /usr/src/lighttpd-1.4.52/src/server.c      2019-11-28


14:57:02.564089255 -0300

|+++ /usr/src/lighttpd-1.4.52/src/newserver.c   2019-11-28


15:27:17.342011126 -0300

--------------------------

File to patch:

Veja que não conseguimos realizar o procedimento – ou seja,


o sistema não está conseguindo encontrar o arquivo onde este
"patch" deverá ser aplicado.

Para solucionarmos esta questão, vamos informar ao


comando patch para que ele não considere o diretório corrente
em direção ao arquivo – mas sim, comece o procedimento a
partir do diretório lighttpd-1.4.52. Para isso, três barras iniciais
precisarão ser retiradas do processo:

                                                                                                            
1     2     3
                                                                                                            
/usr/src/lighttpd-1.4.52/src/

Desta forma, lançamos o comando patch junto à opção –P,


informando em seguida o valor 3 – representando a quantidade
de barras a serem descartadas:
[root@curso7:/usr/src/]# patch –p3 < lighttpd2.patch

patching file lighttpd-1.4.52/src/server.c

Veja que agora conseguimos realizar o processo. Após entrar


no subdiretório lighttpd-1.4.52, vamos novamente executar os
comandos make e make install. Em seguida, testamos a
alteração:

[root@curso7:/usr/src/lighttpd-1.4.52/]# lighttpd –h

lighttpd/1.4.52 - a light and fast webserver

usage:

 -f   filename of the config-file

 -m   module directory (default: /usr/local/lib)

 -i   graceful shutdown after of inactivity

 -1         process single (one) request on stdin socket, then exit

 -p         print the parsed config-file in internal form, and exit

 -t         test config-file syntax, then exit

 -tt        test config-file syntax, load and init modules, then exit

 -D         don't go to background (default: go to background)

 -v         SHOW-version

 -V         show compile-time features

 -h         show this help

Você também pode gostar