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ção | Descrição |
---|---|
-m | Define as permissões de arquivo. |
-o | Define o proprietário do arquivo. |
-g | Define o grupo do arquivo. |
-d | Cria diretórios de destino caso não existam. |
-C | Essa 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. |
-v | Modo 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