Atualização: 10/04/2019

Documentação

Está documentação tem como intuito ajudar os usuários do banana! Se você possui alguma sugestão para incrementar nesta documentação entre em contato.


Índice

  1. Prefácio

  2. Modo de Utilização

  3. Desenvolvimento

  4. Compilação um caminho correto

  5. Segurança

                                                      
    O Inicio                                                    
+--------------+                                              
| Programa     |                                              
| Compilado    |          +-------------+                     
+--------------+          | Copiar Docs |-----------+         
      |                   +--+----------+           |         
      |                      |            +----------------+  
      |                      |            | Zippar Manuais |  
      |                      |            +----+-----------+  
      +--- -----+        +-----------+         |              
      |Fake Root|--------| Diretório |         |              
      +---------+        | Info/     |    +------------+      
                         +-----------+    | Enfeites   |      
                                          +------------+      
                         +------------+        |              
                         |Gerar Pacote|--------+              
                         +------------+                       
          +---+               |                               
          |Fim|---------------+                               
          +---+

O projeto BananaPKG

O bananaPKG foi iniciado com suas ferramentas de baixo nível indenpendentes. Porém na versão 1.5, passou a ser uma ferramenta única que tem suas chamadas (create, install, upgrade, remove, search)


Você pode conferir a sintaxe no indice: Modo de utilização

BananaPKG é fork de qual gerenciador?

Nenhum. O bananaPKG foi criado do zero, porém teve inspiração nos utilitários installpkg, upgradepkg, removepkg da distribuição Slackware que também é escrito do zero e em Shell Script.

Em qual linguagem é escrito o BananaPKG

O BananaPKG foi criado na linguagem de programação Shell Bash. Feito para ser simples, fácil e agradável de se utilizar... Em poucos passos você já pode criar os seus pacotes e passar para seus amigos.

BananaPKG é de alto nível?

Não! BananaPKG é uma ferramenta de baixo nível, com ela você pode Criar, Instalar, Atualizar, Remover e procurar pacotes do seu sistema.

Ou seja, ela serve para gerenciar os pacotes e cuida-los. Se caso você seja um bom programador de Shell e queira fazer uma extensão de alto nível que resolva dependências, há uma array/lista no arquivo info/desc que contém as dependências do pacote.

Essa array foi criada e pensada para um uso futuro para quem deseja fazer uma extensão. Por padrão o projeto não terá oficialmente uma extensão para esta finalidade.

Qual o formato do pacote?

O formato de pacote próprio é o .mz. Como inicialmente o BananaPKG foi criado para suprir a necessidade da distribuição Linux mazonOS, que é uma distribuição criada do zero e não possuia um gerenciador de pacotes, acabou que o formato ficou e vai continuar como .mz.

Este formato é um simples arquivo compactado com o utilitário tar e comprimido com o utilitário xz. Mas sinta-se a vontade para modificar ao seu gosto a extensão se assim necessitar...

O programa está bem modularizado e um bom programador em Shell consegue fazer a modificação para sua necessidade.

Posso passar os pacotes que criei para amigos?

Com toda certeza. Mas para quem ser o receptor do pacote vai precisar utilizar o BananaPKG também. Isso devido ao fato que o pacote que ele gera depende do instalador para tratar o pacote antes de instalar.

Ou seja toda a estrutura é própria!


Modo de utilização

Parâmetos Resumidos:

-V, version
	Exibe a versão do banana

-h, help
	Exibe ajuda e sai

-c, create
	Cria um pacote

-r, remove
	Remove um pacote

-y
	Está opção é aliada ao parâmetro -r, remove. Ela serve para auto confirmar a remoção do pacote	
	você pode declarar em /etc/banana/banana.conf a variável AUTO_YES para auto remover,
	sem ter que passar este parâmetro. Você pode utilizar -y antes ou depois do argumento (pacote).
	Exemplo:
	banana remove -y leafpad OU banana remove leafpad -y

-i, install
	Instala um pacote

-u, upgrade
	Atualiza um pacote

update
    Opção para Atualizar o Bananapkg via Internet.

-s, search
	Procura um pacote no sistema localmente, está opção é válida somente para pacotes que foram
	criados e instalados com o banana.

-ol, one-line
	Está opção é aliada ao parâmetro -s, search. Ativando está opção a saída na tela fica em
	somente em uma linha programa-versão-build.

-pl, print
    Imprimi lista do pacote instalado localmente.
    Está lista contém toda a hierarquia do pacote, aonde foram instalados.
    Puxado de /var/lib/banana/

Para maiores informações sobre cada parâmetro leia abaixo.

Como criar um pacote

USO: banana [create] [nome_do_pacote-versão-build.mz

-c, create Criação de pacote(s)

Para ingressar nesta jornada de empacotador, você ira necessitar entender o conceito básico do Fakeroot. Mas o que é Fakeroot?

Fakeroot

Fakeroot significa Raiz Falsa, para entendermos o conceito precisamos saber como é instalado um programa por de trás dos panos.

Ao grosso modo ao instalar um programa ele possui toda a estrutura dos diretórios, como usr/ etc/... Está estrutura é solta na raiz / do sistema, logo podemos saber que a instalação será feita.

Isso se tratando de softwares convencionais, os opcionais como Firefox/Telegram etc... Normalmente ficam em um diretório a parte em opt/ e normalmente já são pré-compilados.

Quando compilamos e fizemos um make install é feito o passo que falamos acima, é solto basicamente toda a estrutura do programa pré compilado na raiz /.

É ai que entra o fakeroot, vamos enganar o sistema dizendo um diretório especifico ao invés de instalar na raiz. Este diretório falso é essencial, pois podemos manipular todo o programa pre-compilado antes da instalação.

Assim fizemos os nossos enfeites que vamos abordar mais adiante.

Para um exemplo, supondo que rodei toda a base ./configure && make e ao invés de por make install somente botaria em make install DESTDIR=/Um/Diretorio

Voltando... Você irá necessitar seguir um passo a passo para ter êxito. O primeiro passo é criar um diretório chamado info/ e um arquivo dentro do diretório chamado desc.

Esse arquivo desc é de muita importância para o pacote. É atráves dele que toda conferência do pacote é feita nos outros utilitários.

Você pode criar manualmente ou automaticamente com a opção -g, generate. Está opção irá criar o diretório info/ e o arquivo desc pronto para edição.

Você poderá passar no mesmo parâmetro do -g, generate o nome-versão-build do pacote! Assim fica mais fácil para o preencimento do resto das informações posteriormente. Lembre-se de sempre seguir o padrão: firefox_quantum-55.0.1_2-1

Exemplo

banana -g firefox_quantum-55.0.1_2-1

banana generate qt5-5.2-1

banana -g sublime_text-3.9.2-1
Nota!

Não se preocupe se você ter vários arquivos dentro de info/ como rm.sh e pos.sh. Eles não serão sobreescritos se você executar o banana -g, generate.

O único arquivo que é gerado é o desc, tome cuidado para não sobreescrever o mesmo se já estiver preenchido. Se não você terá que preencher tudo novamente.

O arquivo desc tem um série de variáveis que precisam ser editadas, sendo que todas menos a array/lista dep precisa ser preenchida, ás variáveis são:

Exemplo

# Nome do mantenedor do pacote
maintainer=''

# Nome do pacote
pkgname=''

# Versão do Software
version=''

# Versão de construção do pacote (build)
build=''

# Licença
license=''

# SMALL Description of Software, NO Trespassing |
#=============RULER=====================================================|
desc=" "
#=======================================================================|

# URL SOFTWARE
url=''

# What packages do your package need to run?
# This array is optional.
dep=(" ")

Preencha todas as variáveis em letras minúsculas, lembre-se de por no campo pkgname o nome correto do programa e no campo version a versão correta do programa.

Todos estes campos são usados não só para imprimir na tela para o usuário, mas também para conferencias importantes :) Decifrando os campos:

maintainer
Este campo necessita ter o nome do mantenedor do pacote seguido do seu email, o ideal é ser neste e somente neste formato: Jefferson Rocha

pkgname
Este campo você necessita preencher com o nome do pacote, este campo é conferindo na hora que você cria o pacote, necessita estar igual ao que você vai chamar na linha de comando.

version
Campo de versão do programa, este campo é conferido na hora da criação do pacote, necessita estar igual ao que você vai criar.

build
Este campo é o de construção númerico! Cada vez que você mexer e gerar um novo pacote com o mesmo pacote você precisa incrementar este campo! Ele é conferido na hora da atualização do pacote juntamente com a versão. Então é um campo muito importante também!
Lembre-se de usar somente números inteiros como (1, 2, 3, 4) etc... e não números quebrados como (0.1, 0.2, 0.3). Números quebrados não serão aceitos.

license
Neste campo você deve preencher com a licença do software. DIFICILMENTE terá um software sem licença. Pesquise antes de anexar a este campo... É muito importante.

Mas como devo anexar a licença? Use sempre abreviações, Por exemplo:

MIT               = MIT
GNU GPL Versão 2  = GPL2
GNU GPL Versão 3  = GPL3
GNU GPL Versão 2+ = GPL2+
Siga sempre está lógica.

desc
Neste campo você precisa ter um pouco de mais cuidado, ele é o campo de descrição do programa. Você necessita seguir a régua que tem em cima do campo e não deverá ultrapassar o pipe '|', caso sua descrição seja muito longa vá fazendo a quebra de linha antes do pipe '|'. Exemplo:

#=============RULER=====================================================|
desc="Esta descrição é um exemplo prático de como fazer a descrição você
pode ver que eu necessitei quebrar a linha para baixo, mas isso não é um
problema.
É simples, antes do pipe eu quebro para baixo e continuo com a descrição
normalmente ;)
Lembre-se de usar aspas duplas neste campo, pois se você usar aspas sim-
ples tipo Don't não terá poblemas."
#=======================================================================|

url
Qual o site do projeto do software que você está empacotando? Adicione aqui!

dep
Se caso o programa que você gerou o pacote necessitar de dependências o que é quase certeza, você precisa por neste campo. Ele nada mais é que um array, digamos que o meu pacote imaginário tenha 3 dependências (X, Y, Z), fariamos:

dep=("X" "Y" "Z")

Scripts do diretório info/

Após você ter preenchido todo o arquivo desc você talvez necessite fazer alguns incrementos no seu pacote. Alguns software necessitam fazer uma série de passo a passo para atingir o seu objetivo, dentre estes objetivos: Adicionar links simbólicos, adicionar grupo, usuários etc...
É o caso por exemplo do programa rsync que exige que antes de instalar o mesmo tenha o grupo rsyncd e o usuário rsyncd. Para isto existem três scripts RECONHECIVEIS pelo bananapkg: pre.sh pos.sh rm.sh. Com estes scripts você pode fazer ainda mais a manipulação do seu pacote.

pre.sh

Este script é manipulado pelo banana install e é executado na pré instalação do pacote, ou seja antes do pacote ser instalado. Toda rotina que você precisa antes do software estar instalado você poderá adicionar neste script! Como um exemplo vamos criar um usuário e grupo:

Exemplo

cat > "pre.sh" << 'EOF'
# Adicionando grupo ao rsyncd
groupadd -g 48 rsyncd

# Adicionando usuário
useradd -c "rsyncd Daemon" -d /home/rsync -g rsyncd -s /bin/false -u 48 rsyncd
EOF

pos.sh

Este script também é manipulado pelo utilitário banana install e é executado na pós instalação do pacote, tudo que você necessitar fazer na pós instalação é crucial por neste script.

Supondo que eu precisasse na pós-instalação do pacote criar um link simbólico para o firefox em /usr/bin, devemos criar um script pre.sh e adicionar informações lá dentro! Lembrando que deve ser dentro do diretório info/. Uma rotina clássica:

Exemplo

cat > "pos.sh" << 'EOF'
# Script para criar link simbólico do firefox para firefox-quantum
ln -sf /usr/bin/firefox /usr/bin/firefox-quantum
EOF

rm.sh

O script rm.sh é executado na remoção do pacote e utilizado pelo utilitário burnpkg. Este script é essencial para uma limpeza mais profunda que o pacote deixou. Se você adicionou algumas rotinas no pre.sh/pos.sh de criações.

Você precisa reverter tudo neste script. Afinal não queremos deixar sujeira na máquina do destinátario não é?

Vamos a um exemplo clássico, adicionamos logo acima no script pre.sh e pos.sh a criação de Adicionar o grupo rsyncd e o usuário rsyncd. No script pos.sh criamos o link simbólico do firefox, então precisamos reverter isso para removê-los.

Exemplo

cat > "rm.sh" << 'EOF'
# Removendo usuário rsyncd, como o grupo rsyncd foi criado especialmente para
# este usuário, não é necessário remover o grupo, por padrão o grupo será removido
# automaticamente.
userdel rsyncd

# Removendo link-simbólico, criado no script pos.sh
unlink /usr/bin/firefox-quantum
EOF
Nota!

Assinatura GPG

Por padrão o bananapkg assina os pacotes na criação dos mesmos como o gpg. Este método garante que aquele pacote foi realmente empacotado pelo Fulaninho.

Garantindo assim mais segurança ao empacotador e aos usuários que venham utilizar o mesmo.

É de extrema importância você ter sua chave GPG, nesta parte do tutorial vamos ensinar você a como você pode gerar a mesma com gpg.

Se caso você já tenha sua chave GPG você poderá ir para o final desta receita.

Criando a chave GPG

Em poucas etapas você pode criar sua chave GPG! Siga todo o passo a passo, não vamos cobrir muitos detalhes sobre, pois vai além do escopo desta documentação.

Após rodar o comando gpg --gen-key, siga todas etapas! Na parte aonde ele gera entropia você pode usar o cat em /dev/urandom em 2 ou mais terminais diferentes, assim garantindo uma boa entropia.

Também é sábio você digitar um texto, mexer bastante em seu mouse. Tudo isso vai ajudar na entropia.

Exemplo


# mkdir /root/.gnupg
# echo "pinentry-mode loopback" >> ~/.gnupg/gpg.conf

Com isso evitamos alguns WARNINGS.
Para criar agora a sua chave use:

# Gerando sua chave
$ gpg --gen-key

# Exportando sua chave para um arquivo externo

$ gpg --armor --output pubkey.txt --export 'name'

##### Exportando sua chave privada
# Identifique sua chave privada. Você precisa saber
# O ID da sua chave, esta informação está no SEGUNDO campo.

$ gpg --list-secret-keys

# Exporte sua chave privada para um arquivo externo.

$ gpg --export-secret-keys MINHAID > NOME-private.asc

# Se um dia você estiver em uma outra máquina e necessitar
# IMPORTAR sua chave gpg, use:

$ gpg --import NOME-private.asc

Aviso de chave não confiável

Caso exiba um erro na criação do pacote que a chave não é confiável você terá que ralizar os procedimentos abaixos:

# Peça para editar sua chave.
gpg --edit-key "seu_email@dominio.com"

# Irá abrir o console onde você deverá entrar com os comandos:
trust

 1 = I don't know or won't say
 2 = I do NOT trust
 3 = I trust marginally
 4 = I trust fully
 5 = I trust ultimately
 m = back to the main menu

# Selecione a opção 5, você dira que tem total confiança na chave.
5

# Pressione y para confirmar
y

# E salve as alterações... logo após pressione 'q' para sair.
save
q (para sair do gpg)

SUA CHAVE PRIVADA NÃO DEVERÁ SER PASSADA PARA NINGUEM!
Não se esqueça da importância da sua chave, faça backup em algum lugar seguro como um pendrive ou qualquer outra midia.

Pronto! Agora você já pode assinar seus pacotes ;) Lembre-se o quanto é importante proteger sua chave privada! E também ter uma senha forte no seu usuário comum e root.

Criando pacote, assinando e verificando assinatura do pacote.

Verificar Assinatura.

O banana não faz a verificação das assinaturas automaticamente. Quem deverá ser encarregado deste objetivo é o próprio usuário!

Recomendamos antes de fazer a instalação dos pacotes você fazer a verificação da assinatura. Este método vai lhe garantir uma maior segurança.

Para fazer uma verificação, os dois arquivos Pacote e Arquivo com Assinatura devem estar no mesmo diretório! Perceba que toda informação do empacotador responsável esta sendo exibido na tela.

Exemplo

$ gpg --verify acpid-2.0.30-1.mz.sig
gpg: assumindo dados assinados em `acpid-2.0.30-1.mz'
gpg: Signature made Qua 03 Abr 2019 01:32:33 -03 using RSA key ID 75BF6894
gpg: Good signature from "Jefferson Luiz da Rocha Carneiro
(Esta é minha chave GPG Real. slackjeff.com.br) "

Se for impresso nas informações Good signature é sinal que o pacote não foi alterado.
Se caso for Bad signature NÃO instale o pacote, entre em contato com o empacotador. Possivelmente algo foi alterado no pacote.

Como instalar/atualizar um pacote

USO: banana [install/upgrade] [Nomedopacote-Versão-Build.mz]

-i, install Instalação de pacote(s)

-u, upgrade Upgrade do(s) pacote(s)

O parâmetro -i faz a instalação e atualização dos pacotes! A instalação é burra, ou seja ela não verifica versões, já se você usar a opção para atualizar o pacote ele faz a checkagem do nome, versão e build do pacote.

Se a versão for uma versão superior ele remove toda a hierarquia da versão anterior e instala a nova versão, isso é válido também para o build, se caso o build for maior ele faz o mesmo processo. Por isto o build é tão importante também!

Se caso a Versão ou Build que você deseja "atualizar" for uma versão inferior ele não faz nada. É importante saber que se o pacote não estiver instalado o programa vai alertar e não vai instalar.
Supondo que queira atualizar a versão do leafpad da 1.0 para versão 2.0:

Exemplo

# banana upgrade leafpad-2.0-1.mz

Ou se caso você tem um leafpad com o build maior que tem no sistema!

# banana -u leafpad-2.0-2.mz
Nota!

Como remover um pacote

USO: banana [remove] [nome_do_pacote] ou [nome_do_pacote-versão]

-r, remove Remove pacote(s)

-r, remove

O parâmetro -r ou remove serve para remover os pacotes, supondo que queira remover o pacote leafpad

# banana remove leafpad

Se você ter mais de um pacote com o mesmo nome no sistema mas com versões diferentes não será póssivel remover o pacote somente com o parâmetro -r, remove. Ele irá fazer a listagem do(s) pacote(s) com suas respectivas versõe(s) e será imprimido na tela.

Exemplo clássico, supondo que tenho o leafpad com 2 versões diferentes no sistema a versão 1.0 e 2.0:

Exemplo

# banana remove leafpad
[FOUND] leafpad-1.0
[FOUND] leafpad-2.0

Então para fazer remoção neste caso eu precisarei passar o nome do pacote traço versão, ficando nomepacote-versão. Vamos supor que queira remover a versão do leafpad 2.0:

Exemplo

# banana remove leafpad-2.0

O parâmetro -y

Para auto-confirmar sua escolha e não precisar passar o (y|Y|ENTER) para confirmar a remoção você pode passar o parâmetro -y, não importando sua posição, exemplo:

Exemplo

# banana remove -y leafpad

A posição do parâmetro -y pode ser em qualquer lugar!

# banana remove leafpad -y

Se você sabe exatamente o que está fazendo, você pode sempre auto afirmar para remover o pacote. Existe uma variável no arquivo de configuração em /etc/banana/banana.conf chamada AUTO_YES, basta ligar com a opção 1.

Nota!

Como Procurar um pacote

USO: banana [search] [nome_do_pacote] ou [nome_do_pacote-versão]

-s, search Procura pacote(s) no sistema

Com a opção -s ou search você pode procurar pacotes no seu sistema localmente, você pode passar um ou mais nome de pacote para o banana fazer a procura.

Ele faz uma listagem simples do diretório /var/lib/banana/desc/ se o pacote existir ele retornara toda info do pacote como> mantenedor, nome do pacote, versão, descrição etc...
Se você tem conhecimento de expressão regular REGEX, você pode usar na pesquisa, não é permitido usar glob/wildcards do shell para está finalidade, por padrão é desabilitado.

Exemplo

Supondo que eu tenha somente uma instalação do nano no sistema, posso fazer uma pesquisa normal.

banana -s nano

Se eu tiver 3 versões e queira só puxar versões do nano acima da versão 2 até a versão 3

banana -s 'nano-[2-3]+.*'

Ou se eu lembro que o pacote começa com flat mas não sei o resto, posso fazer uma listagem de tudo que comece com flat e depois (qualquer-coisa) que serão listados todos pacotes que iniciam com flat.

banana -s '^flat.*'

Se por acaso desejo listar somente um range de nomes que começam de a Á c, poderia fazer:

banana -s '^[a-c].*'

Ou se você precisa de um range especifico com versões especificas:

banana -s '^[a-b].*-[1-2].*'


O parâmetro -ol, one-line

Este parâmetro faz ao inverso da impressão da pesquisa normal, se você precisa de algo mais enxuto está é a opção correta para você.

Exemplo

banana search nano gedit one-line
[FOUND] nano-3.2-1
[FOUND] gedit-3.22.1-1

ou

banana search one-line nano gedit
[FOUND] nano-3.2-1
[FOUND] gedit-3.22.1-1

ou

banana search nano gedit -ol
[FOUND] nano-3.2-1
[FOUND] gedit-3.22.1-1

banana search -ol nano gedit
[FOUND] nano-3.2-1
[FOUND] gedit-3.22.1-1
Nota!

Desenvolvimento

/var/lib/banana/{list,desc,remove}

Na criação dos pacotes é gerado 3 diretórios que são essenciais para o funcionamento das ferramentos e funciona como um banco de dados. Estes diretórios ficam em /var/lib/banana/ e tem 3 variações, neste tópico você vai saber o que estes diretórios contém e por que é tão essencial.

/var/lib/banana/list
Este diretório é o banco de dados para as listas de instalação dos pacotes. Quando um pacote é "extraido" na / ele fica descontrolado, por isso na criação do pacote é criado uma lista para o usuário ter o controle de tudo que o pacote X instalou no sistema. Esta lista é usado especialmente pela ferramenta de remoção burnpkg e nada além disso. Na hora da remoção de um determinado software o burnpkg consulta este diretório!

/var/lib/banana/desc
Este diretório é o banco de dados para a descrição dos pacote que o empacotador cria no fakeroot no diretório info/desc. Na hora da extração com o parâmetro -i, install esse arquivo desc é movido para /var/log/desc com o nome do programa-versao-build.desc! Este diretório é especial pois contém todo o formulário e identidade do(s) pacote(s) e suas especificações como (mantenedor, programa, versão, build, descrição, dependencias) entre outras informações.

/var/lib/banana/remove
Este diretório é usado diretamente pelo parâmetro -r, remove , ele armazena scripts de instruções extras para remoção que o empacotador inseriu. Quando o parâmetro remove é invocado e se tudo ocorreu certo, antes de começar realmente a remoção ele chama o Script de remoção deste diretório, e depois consulta o /var/log/list para começar a remoção realmente.

core.sh

É a biblioteca de funções aonde todo o funcionamento principal das ferramentas estão! Até a versão 1.5 estas ferramentas eram a parte e se chamavam: burnpkg para remover pacotes, createpkg para criar pacotes e plantpkg para instalar pacotes.
No trabalho que foi feito na nova versão todo programa foi reformulado e exportado tudo para estão biblioteca que fica localizada em /usr/libexec/banana/.

help.sh

O módulo help.sh agrupa os módulos de documentação interna do banana. Foi criado a partir da versão 2.1.2, ela fazia parte do core.sh mas por uma questão de velocidade foi melhor exportar externamente os módulos e tornar um só para está finalidade.

Arquivo de configuração em /etc/banana

Arquivos de configurações estão localizados em /etc/banana/, é neste diretório que você pode encontrar o arquivo de configuração banana.conf. Existem variáveis para você preencher e mudar o estado de como o programa é executado, são elas:

AUTO_YES

Está chave é a alma gêmea do parâmetro -r, remove. Quando você vai remover programa(s) ele pede confirmação do mesmo. Para não ter que ficar confirmando ou passando o parâmetro -y para auto confirmar é só alterar o estado desta chave.

Com isto o programa vai fazer a tomada de decisão certa e auto confirma a remoção do(s) programa(s).

MAINTAINER

Por uma questão de praticidade foi criado está chave que é a alma gêmea do -g, generate. Para não ter que passar o nome do mantenedor do pacote no arquivo desc manual toda vez que você for empacotar, você pode preencher com o seu nome e email neste campo, exemplo:

MAINTAINER='Jefferson Rocha < root@slackjeff.com.br >'

Feito isto sempre quando você for empacotar o campo será preenchido.

GPG_SIGN

Está chave serve para ligar/desligar a assinatura gpg na parte da criação do pacote.
Utilize 0 = Para desligar e 1 = Para ligar.

Por padrão está chave está ligada.


Compilação um caminho correto

Compilar um software não é fácil! Exige muita leitura e boas práticas que você deve seguir para chegar no objetivo de uma maneira correta. Este tópico visa abranger algumas boas práticas que você deve levar em consideração na hora de compilar um software.

Não se esqueça que compilação e empacotamento não é brincadeira, é uma função honrosa e a mais especial de uma distribuição! Leia com atenção, pesquise e pratique muito.

Quais parâmetros devo usar na compilação?

A primeira coisa que você precisa fazer é ler no código fonte do programa o README, INSTALL ou qualquer outro documento que exista. Qualquer programador de quintal necessita disponibilizar como fazer a instalação do seu software, afinal nínguem tem vidência.

Após você ter feito a leitura podemos prosseguir, normalmente os softwares são criados com as ferramentas do GNU e existe algum tipo de script para configuração, se os mesmos não forem criados com as ferramentas GNU, deve existir algum script que faz a configuração pré-compilação...

Este script de configuração faz toda a configuração básica e verifica se todas as dependências estão supridas para o software ser compilado!

Note que há uma diferença entre as dependências da compilação e do software em si. As vezes existem dependências para compilar o software mas após ter compilado não será mais necessário o mesmo instalado em sua máquina...
Isto é uma questão de teste os quais você "compilador/empacotador" terá que testar!

Estes scripts também tem suas opções de help, o qual você pode verificar o que você pode habilitar/desabiliar na compilação! Isto fará todo efeito no software, por exemplo, se eu pedir para desabilitara interface gráfica do mplayer eu poderia passar algum parâmetro para o script dele chamado configure.

Assim a interface não estaria presente quando o usuário fosse instalar. No ffmpeg por exemplo para ativar o ffplay que é um módulo presente no ffmpeg que toca áudio e vídeos, se não for passado o parâmetro --enable-ffplay o mesmo não estará presente após instalado.

Por isso você deve ficar bem atento as opções que os softwares apresentam na compilação, afinal compilação é isso... O programador te dá as peças para você mesmo montar.

Normalmente os parâmetros que usamos como uma "receita" de bolo para uma instalação mais ideal seria como o exemplo com o configure:

Exemplo

./configure                   \
    --prefix=/usr             \
    --sysconfdir=/etc         \
    --localstatedir=/var      \
    --libdir=/usr/lib         \
    --mandir=/usr/share/man   \
    --docdir=/usr/share/doc

Estes parâmetros básicos vão garantir que a localização do software não sujem o seu sistema:

--prefix=/usr

Garante que toda hierarquia do software como binários serão entregues em /usr/bin, suas bibliotecas em /usr/lib e os arquivos de desenvolvimento em /usr/include.

Se caso você não especifique o --prefix normalmente a hierarquia fica em /usr/local, isso não é o correto e em TODOS os casos nenhuma distribuição aceitaria o pacote neste formato.

--sysconfdir=/etc

Esse parâmetro irá garantir que toda configuração do software será entregue em /etc.

--localstatedir=/var

Garante que todos os arquivos variáveis do software será entregue em /var

--libdir=/usr/lib

Garante que todas bibliotecas do programa irão para /usr/lib.

--mandir=/usr/share/man

Garante que todo manual do software fique em /usr/share/man, normalmente não será preciso especificar este parâmetro já que setamos o --prefix em /usr, na compilação já entendido que a hierarquia precisa ser está. Mas mal não faz também fazer a setagem manual.

Outra coisa que você precisa confirmar é se no seu sistema qual o ideal que pode variar, no mazonOS a localização para manuais seria /usr/share/man, já na distribuição Slackware /usr/man. Então fica a seu critério fazer a avaliação.

--docdir=/usr/share/doc

Garante que toda a documentação sera entregue em /usr/share/doc/PROGRAMA-VERSÃO, normalmente este parâmetro é extra também já que especificamos o --prefix em /usr.

Aqui também pode ter variações, na mazonOS fica em /usr/share/doc já na distribuição Slackware em /usr/doc.

Está é uma receita de bolo para uma boa compilação... Lembre-se de sempre fazer a leitura para ver quais parâmetros extras você pode passar!.

Nota!

Enfeites do pacote

Você faz o fakeroot por alguns motivos, entres eles o enfeite do pacote! Mas isso se o software necessitar, um software que executa em linha de comando terá poucos enfeites.

Mas o que é o enfeite do pacote?

O enfeite pode ser tudo que o usuário final vai ver ou não! É a etapa final que o pacote precisa para ficar organizado. Um exemplo clássico seria o Gimp por exemplo, que é um editor de imagens gráfico e irá precisar aparecer no menu do usuário! Normalmente o arquivo se chama PROGRAMA.desktop, e estará presente em usr/share/applications, você deve se certificar que este arquivo existe.

Se não existir você irá precisar criar toda a hierarquia de usr/share/applications e adicionar o nome do PROGRAMA.desktop e usar como base uma chamada tipo:

Exemplo

[Desktop Entry]
Version=1.0
Type=Application
Name=Leafpad
Comment=Aqui vai um PEQUENO comentário do que faz o Leafpad
Exec=leafpad
Icon=/usr/share/icons/gnome/48x48/apps/leafpad
Terminal=false
StartupNotify=false

Name

O nome do programa que você está empacotando! Usamos o exemplo de Leafpad

Comment

Um pequeno comentário vai aqui, este comentário será exibido na hora que o usuário passa o mouse em cima do ícone.

Exec

A chamada do executável, você terá que ver dentro do fakeroot qual a hierarquia do executável! no caso o binário do leafpad vai para /usr/bin/leafpad. Desta maneira ficará global para todos usuários...

Você pode fazer a chamada simplesmente com 'leafpad'. Você pode passar alguns parâmetros extras também na chamada quando o usuário clicar no ícone! Consulte o manual do programa para ver as funcionalidades que podem ser passadas no programa.

Icon

O ícone é o que é exibido no menu! Normalmente vem sem caminho absoluto, porém é um erro! SEMPRE passe o caminho absoluto do ícone para ter a certeza que o ícone será exibido. Em alguns casos o ícone fica sem aparecer o que é uma faha do empacotador.

Verifique no seu fakeroot qual a localizaçao do ícone e lembre-se de setar no .desktop o caminho absoluto já com a /.

Terminal

Está é uma boa funcionalidade! O programa que você está empacotando vai ser executado no terminal? Exemplo clássico é um script em Shell ou Python por exemplo que executa via modo texto, mas você quer que tenha um ícone e o programa abra e rode em um terminal...

Se está opção ser marcada como true você está especificando que será executado em um terminal, caso contrário utilize o false

StartupNotify

Está opção se habilitada irá exibir uma notificação de inicialização do programa. Normalmente deixamos desabilitado está opção a não ser que o software realmente precise desta opção ativada.

Arrumando alguns arquivos de DOC

Após o enfeite acima, você irá precisar ainda do código fonte para verificar se existem arquivos em plain text que tem informações do programa! Exemplos básico:

AUTHORS COPYING HACKING INSTALL LICENSE NEWS README

Se existir arquivos que não necessariamente precisam ser os nomes acima, você precisa enviar estes arquivos para o seu fakeroot! Exemplo:

Exemplo

cp -a \
AUTHORS COPYING HACKING INSTALL LICENSE NEWS README \
DIRETÓRIO_PACOTE_FAKEROOT/usr/share/doc/PACOTE-VERSÃO/
Nota!

Strip Now

Após a compilação você necessita tirar a inclusão de símbolos nos objetos do binário, o comando que ajudará em reduzir o binário em até 60% será o comando strip!

Você deve verificar se o binario já está ou não estripado, para isto utilize o comando file:

Exemplo

# file usr/bin/nano
usr/bin/nano: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, not stripped

Perceba que existe um campo que está como "not stripped", ou seja ele ainda não está estripado, vamos verificar o tamanho do arquivo para tirar a conclusão depois, para isto utilizamos o comando du com os parâmetros -sh:

Exemplo

# du -sh usr/bin/nano
264K usr/bin/nano

O binário está com o tamanho 264K, e ainda não está estripado, então vamos estripar para reduzir ainda mais o tamanho, para isto utilizamos o comando strip com o parâmetro -s e seguida vamos usar o du -sh para ver o tamanho novamente:

Exemplo

# strip -s usr/bin/nano

# du -sh usr/bin/nano
112K usr/bin/nano

Perceba que não reduziu muito o tamanho, mas em software maiores a diferença é incrivel! Olha só com um programa como do filezilla:

Exemplo

# du -sh usr/bin/filezilla
168M usr/bin/filezilla

# strip -s usr/bin/filezilla

# du -sh usr/bin/filezilla
5,5M usr/bin/filezilla

O binário de 168M reduziu para 5,5M! Será que faz diferença? é essencial usar o strip em binários, JAMAIS se esqueça pois isso faz toda diferença no tamanho do pacote.


O Diferencial

A segurança é primordial em qualquer área! Um gerenciador de baixo nível normalmente não tem muitas camadas de segurança. E isto por se tratar de um utilitário que não tem muita inteligência.

Com o banana é diferente, a segurança vem em primeiro lugar. É por isso que a cada vez adicionamos mais camadas de segurança, para o usuário saber que recebeu o determinado pacote intacto e sem alterações!

Para isto contamos com alguns métodos.


VOLTAR