Skip to main content

206.1 Compilar e Instalar Programas pelo Código Fonte


Introdução


Vamos ver como instalar programas usando o código fonte. Vamos instalar o links que é um navegador via texto.

# Instale os pacotes necessários para se compilar um programa:
$ sudo apt install build-essential -y

# Entre no diretório abaixo:
$ cd /usr/src

# Baixe o código fonte:
$ sudo wget http://links.twibright.com/download/links-2.28.tar.gz

# Descompacte o arquivo:
$ sudo tar xvf links-2.28.tar.gz

# Entre no diretório:
$ cd links-2.28

# Configure o ambiente:
$ sudo ./configure --prefix=/usr/bin/links

# Após esse processo é gerado o arquivo 'Makefile':
$ ls -l Makefile
-rw-r--r-- 1 root root 22318 Feb 13 18:46 Makefile

# Compile o programa:
$ sudo make

# Com isso já temos os arquivos '.o' e o script:
$ ls -l links
-rwxr-xr-x 1 root root 4998400 Feb 13 18:49 links

# Agora vamos instalar o programa compilado:
$ sudo make install



# Se quiser desinstalar pode fazer:
$ sudo make uninstall

# Se quiser desfazer o make:
$ sudo make clean

O script chamado configure é um arquivo que vai obter informações da máquina e configurar o ambiente onde será compilado o código fonte.


Uma opção interessante do script configure é o --prefix= que informa onde vamos instalar o programa após ele ser compilado.



Makefile


Dentro do Makefile vamos ter diversas variáveis que foram criadas durante o processo de configuração do ambiente (usando o script configure). Além delas vamos ter também os targets, eles são as opções usadas com o comando make, por exemplo: make install, make clean, make uninstall e etc. Essas opções após o make são chamadas de targets e também ficam dentro do Makefile, vejamos alguns exemplos:

# Veja o target 'Clean':
clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \
clean-generic mostlyclean-am
clean: clean-am

# Veja o target 'install':
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-am

# Veja o target 'uninstall':
uninstall-am: uninstall-binPROGRAMS uninstall-man
.
.
.
uninstall: uninstall-am



Comando install


O comando install, localizado em /usr/bin/install é uma ferramenta de linha de comando para instalar arquivos em sistemas Unix-like, incluindo o Linux. Ele é usado para copiar arquivos do sistema de origem para um local de destino (igual o comando cp, com o diferencial de possuir opções adicionais para definir permissões para arquivos e dretórios arquivos).


A sintaxe básica para usaro o comando é a seguinte:

install [OPÇÕES] ARQUIVO DESTINO
OpçãoDescrição
-mDefine as permissões de arquivo.
-oDefine o proprietário do arquivo.
-gDefine o grupo do arquivo.
-dCria diretórios de destino caso não existam.
-CEssa opção é usada para comparar arquivos de origem e destino antes de copiar o arquivo de origem para o destino. Se o arquivo de destino já existir e for idêntico ao arquivo de origem, o arquivo de destino não será substituído.
-vModo verbose.

Vamos instalar um arquivo de teste:

# Crie um arquivo:
$ touch teste-install

# Crie os diretórios:
$ sudo install -m 0644 -o root -d /tmp/teste/bin/

# Instale ele em '/tmp':
$ sudo install -m 0700 -o root teste-install /tmp/teste/bin/

Não da para criar diretórios e copiar no mesmo comando!



Patch


O comando patch é usado para aplicar as mudançasde um arquivo de origem com um arquivo de destino. Ele é comumente usado para atualizar códigos-fontes de programas, corrigir bugs ou adicionar novos recursos a software existente. Se não usarmos eles, a saída para instalar novas atualizações de um programa seria reinstalar o programa do zero. Já com o comando patch podemos instalar apenas a parte que mudou, que foi atualizada.


O Patch nada mais é do que um diff entre os arquivos que vamos atualizar.


A sintaxe básica é a seguinte:

patch [OPÇÕES] ARQUIVO_DE_DESTINO < ARQUIVO_DE_PATCH

Vamos usar o próprio links como exemplo:

# Copie o arquivo abaixo:
$ sudo cp default.c default-new-patch.c

# Edite o arquivo abaixo:
$ sudo vim default-new-patch.c

#### Edite a linha 2059
### Vamos mudar de 'Keys for braille terminal'
### Para 'Teclas para terminal braille'


# Agora gere o arquivo de patch:
$ sudo diff -u default.c default-new-patch.c > links_patch

# Vamos instalar a atualização:
$ patch < links_patch
patching file default.c

# Agora refaça o 'make':
$ sudo make

# Instale a mudança:
$ sudo make install



# Caso queira reverter as mudanças do patch:
$ patch -R < links_patch
patching file default.c

# Agora refaça o 'make':
$ sudo make

# Instale a mudança:
$ sudo make install

Caso não estejamos dentro do diretório podemos usar a opção -pN onde N é o número de barras para chegar até a pasta. Por exemplo:

# O arquivo que vamos fazer a mudança é:
/usr/src/links-2.28/default.c

# Portanto, para usar com '-p' seria:
patch -p3 links_patch

-p1 = /usr
-p2 = /src
-p3 = /links-2.28
-p4 = /default.c

Caso o arquivo de patch não esteja no mesmo diretório.



Patch no Kernel


Vamos ver como aplicar um Patch no Kernel do Linux, podemos usar o comando patch ou outro comando chamado patch-kernel. Além de baixar o patch diretamente da página princial do Kernel.org ainda podemos obter mais versões aqui.

# Entre no diretório abaixo:
$ cd /usr/src

# Crie o diretório abaixo:
$ sudo mkdir patches-5.13

# Baixe o arquivo contendo a diferença:
$ sudo wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/patch-5.13.1.xz

# Mova o arquivo baixado para o diretório criado acima:
$ sudo mv patch-5.13.1.xz patches-5.13/

# Verifique a versão atual do Kernel:
$ uname -r
5.4.0-113-generic

# Baixe o código fonte do kernel atual:
$ sudo wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.13.tar.gz

# Descompate o arquivo:
$ sudo tar xvf linux-5.13.tar.gz

# Entre no diretório:
$ cd linux-5.13

# Aplique o Patch usando o comando 'patch' em modo de teste:
$ sudo unxz -dc ../patch-5.13.1.xz | patch -p1 --dry-run
checking file Makefile
checking file arch/x86/include/asm/kvm_host.h
checking file arch/x86/kvm/mmu/mmu.c
checking file mm/page_alloc.c
## Com esse comando podemos ver quais arquivos seriam modificados!

# Agora aplique com o comando 'patch-kernel':
$ scripts/patch-kernel /usr/src/linux-5.13 ../patches-5.13/
Current kernel version is 5.13.0 ( Opossums on Parade)
Applying patch-5.13.1 (xz)... done.
cannot find patch file: patch-5.13.2

Vale notar que esse comando patch-kernel aplica o patch de versões uma por uma.



Fontes importantes


https://www.gnu.org/software/make/manual/html_node/Standard-Targets.html

https://makefiletutorial.com/