# Portage (software)

Portage é o sistema gestor de pacotes padrão utilizado pela distribuição GNU/Linux Gentoo. O Gentoo geralmente é citado como uma "metadistribuição" devido a flexibilidade do Portage, que o torna capaz de gerenciar diversos sistemas operacionais. Em adição ao Linux, há outras implementações do Portage como ferramenta de gerenciamento para FreeBSD, Mac OS X e Solaris.

## Características

O Portage é similar ao ports, o sistema gestor de pacotes do BSD, na verdade ele foi desenhado com o ports do FreeBSD em mente. O Portage funciona de maneira apenas similar ao APT do Debian, porém o Portage é escrito em python, enquanto que o APT é escrito em C++, apesar das diferenças apenas começarem por aí. Embora o sistema como um todo seja conhecido como Portage, ele consiste de um conjunto de ferramentas, entre elas, o sistema ebuild, e o emerge. Estas duas ferramentas se relacionam de maneira similar, comparada ao rpm e yum, ou dpkg e apt. De modo que no processo de compilação a ferramenta ebuild que efetivamente realiza o trabalho de compilar e instalar, enquanto que o emerge é um front-end que resolve dependências e outras tarefas similares. Uma GUI baseada em Qt, conhecida como Kuroo, duas baseadas em GTK+: Porthole e Portato também estão disponíveis para interagir com o Portage.

### Ebuilds

O Gentoo, por padrão, não utiliza pacotes binários como fazem outros sistemas gestores de pacotes, como o RPM, por exemplo, ao invés ele emprega um formato conhecido como ebuild. Enquanto que RPMs são binários précompilados, ebuilds são shell scripts contendo variáveis e funções que descrevem aplicativos, e instruções de como obter, configurar, compilar, e instalá-los, um pouco parecido com o akin, os arquivos .spec distribuídos nos SRPMs. Há mais de 25,000 ebuilds disponíveis, a grande maioria disponibilizada através de mirrors do Gentoo. Ebuilds novas e atualizadas podem ser obtidas ao sincronizar o repositório local com um dos mirrors. Isto é feito entre outros modos, executando o comando emerge—sync. Recentemente, Gentoo começou a disponibilizar pacotes pré-compilados para muitos programas populares, em especial aqueles grandes demais para serem compilados em sistemas antigos, como o Mozilla Firefox e OpenOffice.org. Estes são instalados com o emerge, apenas adicionando um sufixo "-bin" ao nome do pacote, ao invés de usar o seu nome original.

### Emerge

A ferramenta de linha de comando emerge é o coração do Portage. O comando é customizado com muitas opções e parâmetros. A ferramenta emerge é a forma mais importante de acesso a outras características do Portage através da linha de comando.
O programa calcula e gerencia dependências, executa ebuilds e mantém a estrutura da árvore local do Portage e uma base de dados de pacotes instalados. As configurações de compilação podem ser modificadas através da variável de ambiente CFLAGS, baseadas nas especificações particulares do sistema e no anseio do usuário por otimizações. A utilidade emerge executa ebuilds em um ambiente sandbox. Deste modo o sistema é protegido de softwares executados pela ebuild e os binários resultantes são instalados apenas após uma compilação e uma instalação na sandbox bem-sucedidas.
As dependências instaladas, são afetadas pelas configurações de flag USE. Elas podem definir quais opcionais são incluidos ao instalar ou atualizar aplicativos. E comando emerge também pode ser utilizado para realizar o download e a instalação de arquivos binários.

### Flags USE

O sistema Portage oferece o uso de "flags USE", que permitem aos usuários indicar quais propriedades do softwares eles gostariam de incluir ou excluir enquanto montam pacotes. Por exemplo, há a flag USE para incluid suporte a DVD, disponível, quando pacotes são montados com a flag ativada. Estas flags afetam o modo como as dependências são calculadas, geralmente afetando que propriedades opcionais serão montadas em determinado pacote durante a sua compilação. Por exemplo, em pacotes que utilizam uma script de configuração, a flag USE propriedade seria equivalente a ./configure --with-propriedade.
A especificação de flags USE é a maneira usual de se configurar programas no Gentoo. Flags USE podem ser especificadas manualmente, ou através de ferramentas um pouco mais amigáveis ao usuário como Editor de Flags USE 'ufed' (USE flag editor, em inglês), que lista flags em conjunto com suas descrições. Há também, obviamente, uma lista completa de todas as flags USE utilizadas no Gentoo disponível online, ou localmente em sistemas Gentoo.

### Pacotes binários

O Gentoo possui um formato binário de pacotes, que consiste de um arquivo .tbz2, tar com uma compressão bzip2, com metadados adicionais. Esta característica permite a construção de pacotes binários em um sistema, utilizando a ferramenta buildpkg do Portage ou a quickpkg, isto permite uma instalação rápida em sistemas idênticos, apenas com o Portage e as ferramentas getbinpkg ou emerge -K). Muitas informações também podem ser obtidas online.

### Mascaramento

Mascaramento é como o Gentoo determina quais pacotes são desejáveis em um sistema. Ebuilds desenhadas para arquiteturas diferentes ou software experimental são geralmente mascarados, de modo que não será permitido a um sistema totalmente estável a instalá-los sem intervenção do próprio usuário.
Pacotes que geralmente só necessitam mais alguns testes são ditos mascarados por palavra-chave (keyword masked, em inglês), estes estão disponíveis para sistemas com a opção referente a palavra-chave na ACCEPT_KEYWORDS, especificada no arquivo make.conf. A maneira padrão para desmascarar um pacote individual mascarado por palavra-chave é adicionar uma entrada no arquivo /etc/portage/package.keywords/, contendo o nome do pacote procedido por um espaçamento em branco e da sua palavra-chave. Usuários podem criar subdiretórios também, permitindo uma organização personalizada. Por exemplo, se um pacote mascarado possuir várias dependências mascaradas, o usuário poderia criar um subdiretório com o nome do pacote originalmente mascarado, e colocar todos os arquivos de máscara do pacote e suas dependências neste subdiretório. Esta estrutura substitui uma mais antiga, de possuir um arquivo /etc/portage/package.keywords como uma lista de texto regular.
Pacotes com problemas conhecidos ou demasiadamente imaturos para serem candidatos a estável são duramente mascarados (hard masked, em inglês) pelo arquivo package.mask referente ao perfil sendo usado atualmente pelo sistema, tais arquivos se localizam no diretório /usr/portage/profiles, estes pacotes recebem comentários explicando a razão do mascaramento, está razão também é exibida ao tentar emergir tal pacote.

## Outras peculiaridades

Há um projeto em andamento, no esforço de padronizar e documentar o comportamento do Portage, de modo a permitir sistemas alternativos a interagir com a árvore principal e os pacotes do Gentoo. O projeto se chama Especificação do Gerenciamento de Pacotes PMS (Package Manager Specification), e deve permitir uma integração completa com outros gerenciadores como o Paludis e o pkgcore. Sua principal função é especificar o comportamento destes gerenciadores de pacotes, nos quais ebuilds do Gentoo podem funcionar. Há um rascunho completo disponível com relação ao projeto.

## Uso

Ao ser direcionado para instalar ou atualizar um pacote, o funcionamento normal do Portage consiste em:
* Baixar da internet o código fonte do pacote e de todas as suas dependências, caso o código fonte não tenha sido previamente baixado
* Compilar o pacote e suas dependências, executando a instalação em uma sandbox
* Instalar o pacote e suas dependências a partir da sandbox; caso o pacote tente instalar uma nova versão de um arquivo de configuração, o Portage dispõe de um sistema inteligente para gerenciar tal situação
* Opcionalmente, um tarball também pode ser gerado
Se o usuário já dispõe do tarball do pacote a ser instalado, o Portage pode ser informado para que utilize tal tarball, economizando tempo de compilação. Também existem ebuilds que não resultam em compilação, como por exemplo ebuilds de pacotes binários ou de dados.
A ferramenta mais importante para acessar as capacidades do Portage através da linha de comando é o emerge.

### Alguns comandos

* emerge --sync
    Atualiza a "árvore" do Portage.
* emerge --update --world
    Atualiza todos os pacotes instalados pelo usuário.
* emerge --update --world --pretend
    Mostra quais pacotes serão atualizados.
* emerge kde
    Instala ou atualiza os pacotes relacionados ao KDE.