4.5. Usando a Coleção de Ports
Anterior | Capítulo 4. Instalando Aplicativos: Pacotes e Ports | Próxima

## 4.5. Usando a Coleção de Ports

A Coleção de Ports é um conjunto de arquivos `Makefiles`, patches e arquivos de descrição. Cada conjunto desses arquivos é usado para compilar e instalar um aplicativo individual no FreeBSD, e é chamado de port.

Por padrão, a própria coleção de ports é armazenada como um subdiretório de `/usr/ports`.

Antes que um aplicativo possa ser compilado usando um port, a Coleção de Ports deve primeiro ser instalada. Se ela não foi instalada durante a instalação do FreeBSD, use um dos seguintes métodos para instalá-la:

Procedimento 4.1. Método Portsnap

O sistema básico do FreeBSD inclui o Portsnap. Esta é uma ferramenta rápida e fácil de usar para recuperar a coleção de ports e é a escolha recomendada para a maioria dos usuários. Este utilitário se conecta a um site do FreeBSD, verifica a chave segura e faz o download de uma nova cópia da Coleção de Ports. A chave é usada para verificar a integridade de todos os arquivos baixados.

1. Para baixar um snapshot compactado da coleção de ports em `/var/db/portsnap`:

       # portsnap fetch

2. Ao executar o Portsnap pela primeira vez, extraia o snapshot em `/usr/ports`:

       # portsnap extract

3. Após o primeiro uso do Portsnap ter sido concluído, como mostrado acima, o `/usr/ports` pode ser atualizado conforme necessário executando:

       # portsnap fetch
       # portsnap update

   Ao usar `fetch`, a operação `extract` ou `update` pode ser executada consecutivamente, da seguinte forma:

       # portsnap fetch update

Procedimento 4.2. Método Subversion

Se for necessário mais controle sobre a árvore de ports ou se as mudanças locais precisarem ser mantidas, o Subversion pode ser usado para obter a coleção de ports. Consulte O Subversion Primer para uma descrição detalhada do Subversion.

1. O Subversion deve ser instalado antes de poder ser usado para fazer o check-out da árvore de ports. Se uma cópia da árvore de ports já estiver presente, instale o Subversion desta forma:

       # cd /usr/ports/devel/subversion
       # make install clean

   Se a árvore de ports não estiver disponível, ou o pkg estiver sendo usado para gerenciar pacotes, o Subversion poderá ser instalado como um pacote:

       # pkg install subversion

2. Faça o check out de uma cópia da árvore de ports:

       # svn checkout https://svn.FreeBSD.org/ports/head /usr/ports

3. Conforme necessário, atualize o `/usr/ports` após o check out inicial do Subversion:

       # svn update /usr/ports

A coleção de ports contém diretórios para categorias de software. Dentro de cada categoria estão subdiretórios para aplicativos individuais. Cada subdiretório de aplicativo contém um conjunto de arquivos que informa ao FreeBSD como compilar e instalar esse programa, chamado de esqueleto do ports. Cada esqueleto de port inclui esses arquivos e diretórios:

- `Makefile`: contém instruções que especificam como o aplicativo deve ser compilado e onde seus componentes devem ser instalados.

- `distinfo`: contém os nomes e checksums dos arquivos que devem ser baixados para compilar o port.

- `files/`: este diretório contém quaisquer patches necessários para o programa compilar e instalar no FreeBSD. Esse diretório também pode conter outros arquivos usados ​​para compilar o port.

- `pkg-descr`: fornece uma descrição mais detalhada do programa.

- `pkg-plist`: uma lista de todos os arquivos que serão instalados pelo port. Ele também informa ao sistema de ports quais arquivos devem ser removidos após a desinstalação.

Alguns ports incluem `pkg-message` ou outros arquivos para lidar com situações especiais. Para obter mais detalhes sobre esses arquivos e sobre os ports em geral, consulte o FreeBSD Porter's Manual.

O port não inclui o código-fonte real, também conhecido como `distfile`. A etapa de extração da compilação de um port salvará automaticamente o código-fonte transferido por download para `/usr/ports/distfiles`.

### 4.5.1. Instalando Ports

Esta seção fornece instruções básicas sobre o uso da Coleção de Ports para instalar ou remover software. A descrição detalhada dos targets disponíveis do `make` e das variáveis ​​de ambiente está disponível em ports(7).

### Atenção:

Antes de compilar qualquer port, certifique-se de atualizar a Coleção de Ports conforme descrito na seção anterior. Como a instalação de qualquer software de terceiros pode introduzir vulnerabilidades de segurança, recomenda-se primeiro verificar https://vuxml.freebsd.org/ para problemas de segurança conhecidos relacionados ao port. Alternativamente, execute `pkg -f` antes de instalar um novo port. Esse comando pode ser configurado para executar automaticamente uma auditoria de segurança e uma atualização do banco de dados de vulnerabilidades durante a verificação diária do sistema de segurança. Para obter maiores informações, consulte pkg-audit(8) e periodic(8).

O uso da coleção de ports pressupõe uma conexão de Internet ativa. Também requer privilégios de superusuário.

Para compilar e instalar o port, mude para o diretório do port a ser instalado e, em seguida, digite `make install` no prompt. Mensagens indicarão o progresso:

    # cd /usr/ports/sysutils/lsof
    # make install
    >> lsof_4.88D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
    >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
    ===>  Extracting for lsof-4.88
    ...
    [extraction output snipped]
    ...
    >> Checksum OK for lsof_4.88D.freebsd.tar.gz.
    ===>  Patching for lsof-4.88.d,8
    ===>  Applying FreeBSD patches for lsof-4.88.d,8
    ===>  Configuring for lsof-4.88.d,8
    ...
    [configure output snipped]
    ...
    ===>  Building for lsof-4.88.d,8
    ...
    [compilation output snipped]
    ...

    ===>  Installing for lsof-4.88.d,8
    ...
    [installation output snipped]
    ...
    ===>   Generating temporary packing list
    ===>   Compressing manual pages for lsof-4.88.d,8
    ===>   Registering installation for lsof-4.88.d,8
    ===>  SECURITY NOTE:
          This port has installed the following binaries which execute with
          increased privileges.
    /usr/local/sbin/lsof
    #

Como o `lsof` é um programa que é executado com privilégios aumentados, um aviso de segurança é exibido quando é instalado. Quando a instalação estiver concluída, o prompt será retornado.

Algumas shells mantêm um cache dos comandos que estão disponíveis nos diretórios listados na variável de ambiente `PATH`, para acelerar as operações de pesquisa do arquivo executável desses comandos. Os usuários do shell `tcsh` devem digitar `rehash` para que um comando recém-instalado possa ser usado sem especificar seu caminho completo. Use `hash -r` para o shell `sh`. Consulte a documentação do shell para mais informações.

Durante a instalação, é criado um subdiretório de trabalho que contém todos os arquivos temporários usados ​​durante a compilação. A remoção desse diretório economiza espaço em disco e minimiza a possibilidade de problemas mais tarde ao atualizar para a versão mais recente do port:

    # make clean
    ===>  Cleaning for lsof-88.d,8
    #

### Nota:

Para evitar esta etapa extra, use `make install clean` ao compilar o port.

#### 4.5.1.1. Personalizando a instalação de ports

Alguns ports fornecem opções de compilação que podem ser usadas para habilitar ou desabilitar componentes do aplicativo, fornecer opções de segurança ou permitir outras personalizações. Os exemplos incluem o www/firefox, security/gpgme, e mail/sylpheed-claws. Se o port depender de outros ports que tenham opções configuráveis, ela poderá pausar várias vezes para interação do usuário, pois o comportamento padrão é solicitar ao usuário que selecione opções de um menu. Para evitar isso e fazer toda a configuração em um lote, execute `make config-recursive` dentro do diretório do port. Em seguida, execute `make install [clean]` para compilar e instalar o port.

### Dica:

Ao usar `config-recursive`, a lista de ports a serem configurados é reunida pelo target `all-depends-list`. É recomendado executar o `make config-recursive` até que todas as opções dos ports dependentes tenham sido definidas, e as telas de opções de ports não apareçam mais, para ter certeza de que todas as opções das dependência foram configuradas.

Há várias maneiras de revisitar o menu de opções de compilação de um port para adicionar, remover ou alterar essas opções após a compilação de um port. Um método é efetuar `cd` no diretório que contém o port e digitar `make config`. Outra opção é usar o `make showconfig`. Outra opção é executar `make rmconfig`, o que removerá todas as opções selecionadas e permitirá que você comece de novo. Todas essas opções, e outras, são explicadas detalhadamente em ports(7).

O sistema de ports usa o fetch(1) para fazer o download dos arquivos com o código-fonte, que suportam várias variáveis ​​de ambiente. As variáveis ​​`FTP_PASSIVE_MODE`, `FTP_PROXY` e `FTP_PASSWORD` podem precisar ser definidas se o sistema FreeBSD estiver por trás de um firewall ou proxy FTP/HTTP. Veja fetch(3) para a lista completa de variáveis ​​suportadas.

Para usuários que não podem estar conectados à Internet o tempo todo, o `make fetch` pode ser executado dentro do `/usr/ports`, para buscar todos os distfiles, ou dentro de uma categoria, como `/usr/ports/net`, ou dentro do diretório de um port especifico. Observe que, se um port tiver alguma dependência, executar este comando em uma categoria ou diretório de um port especifico não buscará os distfiles de ports de outra categoria. Em vez disso, use `make fetch-recursive` para também buscar os distfiles para todas as dependências de um port.

Em casos raros, como quando uma organização tem um repositório local de distfiles, a variável `MASTER_SITES` pode ser usada para substituir os locais de download especificados no `Makefile`. Ao usar, especifique o local alternativo:

    # cd /usr/ports/directory
    # make MASTER_SITE_OVERRIDE= \
    ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch

As variáveis ​​`WRKDIRPREFIX` e `PREFIX` podem substituir os diretórios de trabalho e de destino padrão. Por exemplo:

    # make WRKDIRPREFIX=/usr/home/example/ports install

irá compilar o port em `/usr/home/example/ports` e instalar tudo sob `/usr/local`.

    # make PREFIX=/usr/home/example/local install

irá compilar o port em `/usr/ports` e instalá-lo em `/usr/home/example/local`. E:

    # make WRKDIRPREFIX=../ports PREFIX=../local install

vai combinar os dois.

Estes também podem ser definidos como variáveis ​​ambientais. Consulte a página de manual do seu shell para obter instruções sobre como definir uma variável de ambiente.

### 4.5.2. Removendo Ports Instalados

Ports instalados podem ser desinstalados usando `pkg delete`. Exemplos para usar este comando podem ser encontrados na página de manual pkg-delete(8).

Alternativamente, o `make deinstall` pode ser executado no diretório do port:

    # cd /usr/ports/sysutils/lsof
    make deinstall
    ===>  Deinstalling for sysutils/lsof
    ===>   Deinstalling
    Deinstallation has been requested for the following 1 packages:

    	lsof-4.88.d,8

    The deinstallation will free 229 kB
    [1/1] Deleting lsof-4.88.d,8... done

Recomenda-se ler as mensagens quando o port for desinstalado. Se o port tiver algum aplicativo que dependa dele, essas informações serão exibidas, mas a desinstalação continuará. Nesses casos, talvez seja melhor reinstalar o aplicativo para evitar dependências quebradas.

### 4.5.3. Atualizando os Ports

Com o tempo, novas versões de software ficam disponíveis na coleção de ports. Esta seção descreve como determinar qual software pode ser atualizado e como executar a atualização.

Para determinar se versões mais recentes dos ports instalados estão disponíveis, verifique se a versão mais recente da árvore de ports está instalada, usando o comando de atualização descrito em Procedimento 4.1, “Método Portsnap” ou Procedimento 4.2, “Método Subversion”. No FreeBSD 10 e posterior, ou se o sistema foi convertido para pkg, o seguinte comando listará os ports instalados que estão desatualizadas:

    # pkg version -l "<"

Para o FreeBSD 9.`X` e menor, o seguinte comando listará os ports instalados que estão desatualizados:

    # pkg_version -l "<"

### Importante:

Antes de tentar uma atualização, leia o `/usr/ports/UPDATING` da parte superior do arquivo até a data mais próxima da última vez em que os ports foram atualizados ou o sistema foi instalado. Este arquivo descreve vários problemas e etapas adicionais que os usuários podem encontrar e precisar executar ao atualizar um port, incluindo coisas como alterações de formato de arquivo, alterações nos locais de arquivos de configuração ou incompatibilidades com versões anteriores. Anote quaisquer instruções que correspondam a qualquer um dos ports que precisam de atualização e siga estas instruções ao executar a atualização.

#### 4.5.3.1. Ferramentas para atualizar e gerenciar ports

A coleção de ports contém vários utilitários para executar a atualização real. Cada um tem seus pontos fortes e fracos.

Historicamente, a maioria das instalações usava o Portmaster ou o Portupgrade. O Synth é uma alternativa mais recente.

### Nota:

A escolha da melhor ferramenta para um determinado sistema depende do administrador do sistema. Recomenda-se a prática de fazer backup de seus dados antes de usar qualquer uma dessas ferramentas.

#### 4.5.3.2. Atualizando Ports Usando o Portmaster

O ports-mgmt/portmaster é um utilitário muito pequeno para atualizar os ports instalados. Ele é projetado para usar as ferramentas instaladas com o sistema base do FreeBSD sem depender de outros ports ou bancos de dados. Para instalar este utilitário como um port:

    # cd /usr/ports/ports-mgmt/portmaster
    # make install clean

O Portmaster define quatro categorias de ports:

- Port Root: não tem dependências e não é uma dependência de outros ports.

- Port Trunk: não tem dependências, mas outros ports dependem dele.

- Port Branch: tem dependências e outros ports dependem dele.

- Port Leaf: tem dependências, mas nenhum outro port depende dele.

Para listar essas categorias e procurar atualizações:

    # portmaster -L
    ===>>> Root ports (No dependencies, not depended on)
    ===>>> ispell-3.2.06_18
    ===>>> screen-4.0.3
            ===>>> New version available: screen-4.0.3_1
    ===>>> tcpflow-0.21_1
    ===>>> 7 root ports
    ...
    ===>>> Branch ports (Have dependencies, are depended on)
    ===>>> apache22-2.2.3
            ===>>> New version available: apache22-2.2.8
    ...
    ===>>> Leaf ports (Have dependencies, not depended on)
    ===>>> automake-1.9.6_2
    ===>>> bash-3.1.17
            ===>>> New version available: bash-3.2.33
    ...
    ===>>> 32 leaf ports

    ===>>> 137 total installed ports
            ===>>> 83 have new versions available

Este comando é usado para atualizar todos os ports desatualizados:

    # portmaster -a

### Nota:

Por padrão, o Portmaster faz um backup do pacote antes de excluir o port existente. Se a instalação da nova versão for bem-sucedida, o Portmaster excluirá o backup. O uso de `-b` instrui o Portmaster a não excluir automaticamente o backup. Adicionar `-i` inicia o Portmaster no modo interativo, solicitando a confirmação antes de atualizar cada port. Muitas outras opções estão disponíveis. Leia a página de manual para o portmaster(8) para obter detalhes sobre seu uso.

Se forem encontrados erros durante o processo de atualização, adicione `-f` para atualizar e recompilar todos os ports:

    # portmaster -af

O Portmaster também pode ser usado para instalar novos ports no sistema, atualizando todas as dependências antes de compilar e instalar o novo port. Para usar essa função, especifique o local do port na coleção de ports:

    # portmaster shells/bash

Maiores informações sobre ports-mgmt/portmaster podem ser encontradas no `pkg-descr`.

#### 4.5.3.3. Atualizando Ports Usando o Portupgrade

O ports-mgmt/portupgrade é outro utilitário que pode ser usado para atualizar ports. Ele instala um conjunto de aplicativos que podem ser usados ​​para gerenciar ports. No entanto, ele depende do Ruby. Para instalar o port:

    # cd /usr/ports/ports-mgmt/portupgrade
    # make install clean

Antes de executar uma atualização usando esse utilitário, é recomendável verificar a lista de ports instalados usando o `pkgdb -F` e corrigir todas as inconsistências relatadas.

Para atualizar todos os ports desatualizados instalados no sistema, use o `portupgrade -a`. Como alternativa, inclua `-i` para ser solicitado da confirmação de cada atualização individual:

    # portupgrade -ai

Para atualizar apenas um aplicativo especifico em vez de todos os ports disponíveis, use `portupgrade `pkgname``. É muito importante incluir `-R` para primeiro atualizar todos os ports requeridos pelo aplicativo fornecido:

    # portupgrade -R firefox

Se `-P` estiver incluído, o Portupgrade procura pacotes disponíveis nos diretórios locais listados em `PKG_PATH`. Se nenhum estiver disponível localmente, ele buscará pacotes de um site remoto. Se os pacotes não puderem ser encontrados localmente ou buscados remotamente, o Portupgrade utilizará os ports. Para evitar completamente o uso do ports, especifique `-PP`. Este último conjunto de opções diz ao Portupgrade para cancelar se nenhum pacote estiver disponível:

    # portupgrade -PP gnome3

Para obter apenas os distfiles do port, ou pacotes, se `-P` for especificado, sem compilar ou instalar nada, use `-F`. Para mais informações sobre todas as opções disponíveis, consulte a página de manual do `portupgrade`.

Maiores informações sobre o ports-mgmt/portupgrade podem ser encontradas no `pkg-descr`.

### 4.5.4. Ports e o Espaço em Disco

A utilização da coleção de ports irá ocupar espaço em disco ao longo do tempo. Depois de compilar e instalar um port, executar `make clean` dentro do diretório de um port limpará o diretório temporário de `trabalho`. Se o Portmaster for usado para instalar um port, ele removerá automaticamente esse diretório, a menos que `-K` seja especificado. Se o Portupgrade estiver instalado, este comando removerá todos os diretórios de `trabalho` encontrados na cópia local da coleção de ports:

    # portsclean -C

Além disso, arquivos de distribuição de código-fonte desatualizados se acumulam no `/usr/ports/distfiles` ao longo do tempo. Para usar Portupgrade para excluir todos os distfiles que não são mais referenciados por nenhum port:

    # portsclean -D

O Portupgrade pode remover todos os distfiles não referenciados por qualquer port atualmente instalado no sistema:

    # portsclean -DD

Se o Portmaster estiver instalado, use:

    # portmaster --clean-distfiles

Por padrão, esse comando é interativo e solicita que o usuário confirme se um distfile deve ser excluído.

Além desses comandos, o ports-mgmt/pkg_cutleaves automatiza a tarefa de remover os ports instalados que não são mais necessários.

Anterior | Acima | Próxima
4.4. Usando o pkg para o gerenciamento de pacotes binários | Principal | 4.6. Compilando Pacotes com o Poudriere

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.