O sistema de pacotes do NetBSD é um conjunto de instrumentos que permitem compilar e instalar de maneira simples uma grande quantidade de softwares de domínio público para os sistemas Unix. Em geral bastam um ou dois comandos para instalar qualquer pacote configurado e pronto para funcionar.
O primeiro contato com os pacotes gera um pouco de confusão porque aparentemente há vários comandos que fazem a mesma coisa. Na realidade a questão é muito simples. Há dois modos de se instalar um programa.
Compilar as fontes do programa em nosso sistema. Esta é a tarefa da coleção de pacotes que é capaz de fazer o download automático das fontes, compilá-las e instalar e configurar o programa e a documentação com um ou dois comandos. Como se não bastasse, ainda é capaz de determinar automaticamente as dependências e instalar os pacotes necessários. O sistema de pacotes não é instalado no sistema de base pela razão de que sofre freqüentes atualizações, para manter-se de acordo com as novas versões dos programas a instalar. O sistema dos pacotes é descrito de modo completo e exaustivo no site do NetBSD.
Instalar uma versão pré-compilada e pré-configurada do programa em um formato adequado. É essa a tarefa dos "pkgtools", uma série de programas instalados com a base do sistema. Este método é mais veloz mas menos flexível que o precedente. Os pkgtools também estão em condição de reconhecer e gerir (listar, desinstalar, etc.) os programas instalados com o sistema dos pacotes. Trata-se, por assim dizer, de ferramentas complementares. Se decidimos instalar exclusivamente programas em forma pré-compilada, não é necessário instalar a coleção de pacotes.
Os dois métodos ilustrados acima são os mais "cômodos", que aproveitam o trabalho de configuração feito por alguém. Se o programa que nos interessa não está incluído na coleção dos pacote, ninguém nos impede de compilá-lo a mão e instalá-lo no sistema. Nesse caso, é boa norma fazer um pequeno esforço a mais e criarmos nós mesmos os pacotes, de modo que outros possam beneficiar-se do nosso trabalho.
Antes de poder instalar um pacote é necessário instalar a coleção de pacotes, como se descreve em detalhe no site do NetBSD. Em substância, trata-se de:
Fazer o download da última versão das fontes da coleção, que incluem todos os arquivos de configuração, de ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/tar_files/. O nome do arquivo a obter é: pkgsrc.tar.gz.
Remover a coleção anterior, se presente, com
# cd /usr # rm -rf pkgsrc
Instalar a nova coleção com
# tar -xzvpf pkgsrc.tar.gz -C /usrA execução do comando acima dura um certo tempo porque o número dos arquivos a extrair é notável. Ao fim da operação o framework para a instalação dos pacote está em seu lugar. Fica para decidir apenas quais pacotes instalar no sistema.
Nota: imagino que neste ponto esteja claro que com a operação anterior foi instalado no sistema o conjunto dos arquivos de configuração necessários para a instalação individual dos programas, mas não os próprios programas nem as suas fontes. Basicamente agora o sistema dispõe da lista dos programas instaláveis automaticamente e as instruções para instalá-los.
Uma vez instalada a coleção dos pacotes, com um browser de HTML, como o Lynx ou o Netscape, podem-se ler os detalhes e as descrições de todos os pacotes disponíveis. Por exemplo:
$ cd /usr/pkgsrc $ lynx README.html
A coleção dos pacotes é atualizada muito freqüentemente. No site de ftp encontra-se uma nova cópia quase toda semana. Para atualizar a coleção no próprio computador é necessário seguir as instruções dadas para a instalação.
Ás vezes, além da coleção dos pacotes é necessário atualizar também os programas de instalação (pkgtools). É fácil compreender se está sendo necessário realizar a atualização: quando se tenta instalar um pacote o sistema de pacotes avisa que as pkgtools devem ser atualizadas. Por exemplo:
# make ===> Validating dependencies for gqmpeg-0.6.3 Your package tools need to be updated to 2000/02/02 versions. The installed package tools were last updated on 1999/01/01. Please make and install the pkgsrc/pkgtools/pkg_install package. *** Error code 1
O método de atualização mais simples é:
# cd /usr/pkgsrc/pkgtools/pkg_install # make install
Feito isso, pode-se retomar a instalação do pacote original (aquele que tinha dado lugar à mensagem de erro.)
Nota: tecnicamente a mensagem de erro indica que a versão dos programas de instalação está contida em pkg_install-20000202.tar.gz, que se pode encontrar no site de ftp em packages/distfiles/LOCAL_PORTS. O pkg_install instala-se como qualquer outro pacote (pkgsrc/pkgtools/pkg_install).
Para determinar exatamente a versão exigida, examinar o arquivo pkgsrc/mk/bsd.pkg.mk e procurar a linha com
PKGTOOLS_REQD = 20000202(a data 20000202 é só um exemplo).
A título de exemplo, tentemos instalar o programa addnerd, que serve para adicionar usuários ao sistema de maneira automática (mais ou menos como faz o programa adduser em outros sistemas). A primeira coisa é irmos para o diretório /usr/pkgsrc/sysutils/addnerd.
Se dispomos de uma conexão à Internet o Makefile está preparado para fazer automaticamente o download do pacote, e podemos pular para a seção seguinte.
Em caso contrário é preciso obter o pacote fonte e copiá-lo no diretório /usr/pkgsrc/distfiles. Examinando o Makefile, encontra-se o nome do pacote a obter (DISTNAME = addnerd-1.6). O nome completo do pacote é addnerd-1.6.tar.gz.
O mesmo resultado pode-se obter de modo mais simples com os comandos:
# cd /usr/pkgsrc/sysutils/addnerd # make fetch-list
que, ademais, também mostram os endereços dos sites dos quais pode-se fazer o download do programa.
Para compilar o pacote escrever
# cd /usr/pkgsrc/sysutils/addnerd # make
O comando precedente descarrega o pacote da Internet (se ele ainda não estiver presente no diretório dos distfiles), extrai as fontes, aplica os patches necessários para poder compilá-lo sob o NetBSD e, por fim, compila o pacote.
Para instalá-lo
# make install
A instalação do pacote é registrada pelo sistema. Pode-se verificar escrevendo pkg_info -a. Com a instalação completada, pode-se fazer um pouco de limpeza com
# make clean # make clean-depends
O segundo comando é mostrado somente a título de exemplo. Nesse caso não estavam instalados pacotes dependentes e, portanto, não era necessário fazer a faxina.
Como expliquei na introdução, o sistema dos pacotes foi concebido para instalar programas na forma do código-fonte. Entretanto, ele também é habilitado a instalar pacotes pré-compilados, gerados por qualquer um utilizando a própria coleção. Nesse caso, a instalação é mais veloz (não é necessário compilar o programa a instalar).
Os programas pré-compilados distinguem-se geralmente daqueles que estão na forma de fonte por terem a extensão .tgz ao invés de .tar.gz.
Nota: na realidade a extensão dos tarballs de fontes não é sempre .tar.gz. O sistema de pacotes, todavia, é capaz de gerir também extensões diferentes como (.zip, .bz2, etc.).
Não é estritamente necessário fazer manualmente o download de um pacote binário para poder instalá-lo. O pkg_add também é capaz de fazer-lhe o download autonomamente, quando são utilizados URL FTP (o uso de HTTP é possível mas desaconselhado). Por exemplo, pode-se especificar o nome do pacote com:
ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/tcsh-6.09.00.tgz
Se não se conhece o número de versão do pacote disponível no site de FTP, também é possível omitir esta informação da linha de comando e o pkg_add utilizará automaticamente a última versão disponível no servidor de FTP. Por exemplo:
# pkg_add ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/tcsh
É possível também configurar a variável ambiental PKG_PATH com uma lista de caminhos e URLs separados por ; e omitir o caminho (path) no comando pkg_add:
# PKG_PATH="/cdrom;/usr/pkgsrc/packages/All;ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/" export PKG_PATH # pkg_add tcsh
O comando precedente instala o primeiro pacote binário de tcsh encontrado nos caminhos especificados.
A título de exemplo, vejamos como procede a instalação do programa texinfo em forma pré-compilada. A instalação do pacote binário é muito simples:
Copiar o gtexinfo-3.12.tgz em um diretório temporário.
Executar o comando
# pkg_add -v gtexinfo-3.12.tgz
Aferir a instalação feita com o comando
# pkg_info
Remover o arquivo gtexinfo-3.12.tgz do diretório temporário.
Os pacotes pré-compilados são muito cômodos de usar porque exigem tempo e esforço mínimos para a instalação. Todavia, os pacotes em forma de código-fonte são mais flexíveis ainda porque permitem a personalização de eventuais opções de configuração e de instalação. A instalação é mais longa mas, em todo caso, não se instalam pacotes a toda hora...
Quando se instala um pacote binário com o comando pkg_add, convém como primeira coisa a fazer examiná-lo com o comando pkg_info. Por exemplo:
# pkg_info -f jpeg-6b.tgz
Em particular convém observar o primeiro comando CWD para ver onde será instalado o pacote. Se o diretório base não é o desejado, será necessário usar a opção -p do pkg_add. Por exemplo, o pacote jpeg-6b.tgz vai ser instalado em /usr/pkg, enquanto em minha opinião, deveria ir para /usr/X11R6. (Em geral convém extrair em /usr/X11R6 todos os pacotes da hierarquia X). Portanto é preferível extraí-lo com:
# pkg_add -p /usr/X11R6 -v jpeg-6b.tgz
Os principais comandos para a administração do sistema de pacotes são
Utilitário para a instalação de pacotes pré-compilados.
Utilitário para a desinstalação de pacotes pré-compilados. Os nomes dos pacotes podem ser especificados com ou sem o número de versão. O pkg_delete determina automaticamente o número de versão do pacote instalado. Podem ser utilizados caracteres curinga à condição de serem destacados do interpretador de comandos (a shell). Por exemplo:
# pkg_delete "*emacs*"A opção -r permite a remoção recursiva dos pacotes. Primeiro remove todos os pacotes que exigem o indicado e depois remove o próprio pacote. Por exemplo:
# pkg_delete -r jpegremove o pacote jpeg e todos os que o utilizam. Pode ser útil para efetuar a atualização de um pacote.
Utilitário para a visualização de informações sobre pacotes de software instalados e a instalar.
Utilitário para a criação de pacotes de software. Este é o programa usado para a criação de pacotes pré-compilados. É chamado automaticamente pelo sistema de pacotes e jamais é necessário executá-lo manualmente.
Programa utilitário para a execução de várias funções administrativas no sistema de pacotes.
O autor desta seção (Guia rápido para a criação de pacotes) é Jason R. Fink
Esta seção descreve um método simples e veloz para a criação de pacotes simples para a coleção de pacotes do NetBSD. Para ulteriores aprofundamentos remete-se à documentação oficial contida no documento Packages.txt.
Os principais instrumentos a utilizar para a construção de um simples pacote a ser acrescentado à coleção dos pacotes do NetBSD são três:
url2pkg |
um protótipo de pacote |
pkglint |
O programa utilitário url2pkg pode ser instalado da coleção de pacotes. Trata-se de uma ferramenta que permite ao construtor de pacotes preparar e verificar velozmente as estruturas de base da construção de um pacote.
A escolha do protótipo é deixada ao desenvolvedor. Packages.txt mostra um exemplo de construção de pacotes na seção 11 'A simple example of package: bison'. Note-se que muitos dos pacotes da coleção não têm nada de complicados.
O utilitário pkglint pode ser instalado a partir da coleção de pacotes. Trata-se de um instrumento para se aferir a correção dos pacotes.
Os passos iniciais são muito simples, contanto que se tenha o discernimento de verificar se o programa se compila corretamente no NetBSD a partir das fontes. Caso contrário a construção do pacote poderia complicar-se notavelmente. Note-se que usualmente é possível gerar "patches" para aplicar às fontes e incluir no pacote para resolver os problemas de compilação (ou, mais em geral, de compatibilidade), mas esse tópico ultrapassa os objetivos desta simples introdução.
A primeira coisa a fazer é utilizar o url2pkg.
O processo seguinte detalha os passos a seguir para os arquivos de um novo pacote.
Criar um novo diretório para o novo pacote, escolhendo uma posição apropriada em pkgsrc. Deixar o novo diretório inicialmente vazio.
Entrar no novo diretório.
Executar o comando
$ url2pkg
Nesse ponto o programa pede para inserir uma URL: inserir a URL solicitada e pressionar Enter.
Uma sessão do editor vi se inicia para criar o Makefile para o novo pacote. É necessário inserir o nome e a categoria a que pertence o pacote, além do endereço de e-mail da pessoa que cuidará da manutenção do próprio pacote.
Salvar o arquivo e sair.
url2pkg faz automaticamente o download do pacote e o deposita no subdiretório work
Enfim url2pkg gera o arquivo MD5.
Com isso fica concluída a seção do url2pkg. Note-se que o url2pkg não preenche nenhum arquivo à exceção do Makefile. Além disso gera um PLIST vazio.
Agora que o Makefile foi gerado, é necessário criar os arquivos restantes aproveitando um pacote para usar como protótipo. Escolher um pacote existente e copiar os seguinte arquivos do subdiretório pkg, modificando-os oportunamente.
Uma descrição do novo pacote em poucas linhas.
Uma descrição do pacote em uma linha. Não é necessário citar o nome do próprio pacote: ele será adicionado automaticamente pelas várias ferramentas pkg_* quando forem invocadas.
Este arquivo descreve a posição dos arquivos a instalar no sistema. Para um pacote não muito complexo (por exemplo um executável e uma ou duas páginas de manual) deveria ser suficiente dar uma olhada no Makefile e nos scripts de instalação para compreender onde pôr os arquivos a instalar.
Agora que todos os arquivos exigidos estão prontos, é chegado o momento de verificar a correção dos pacotes com o programa pkglint. Acontece freqüentemente que uma seção do Makefile deva ser deslocada, modificada ou acrescida de informações adicionais. É bom executar logo o pkglint para que se encontre de imediato aquilo que deverá ser mudado. Vejamos agora um exemplo de output do pkglint obtido no Packages.txt:
$ pkglint OK: checking pkg/COMMENT. OK: checking pkg/DESCR. OK: checking Makefile. OK: checking files/md5. OK: checking patches/patch-aa. looks fine.
Em caso de erro é geralmente simples levantar as causas. Eis um exemplo de mensagem de erro obtida durante a construção de um pacote:
extract suffix not requiredA mensagem indica simplesmente que não era necessário definir no Makefile o sufixo para a extração.
Nesse ponto, ultrapassada a verificação do pkglint, é aconselhável efetuar um "ciclo" completo de fetch (download), compilação e instalação. Para um desenvolvimento correto é necessário antes deletar o subdiretório work e os distfiles já descarregados (que geralmente encontram-se em /usr/pkgsrc/distfiles). Desse modo garante-se que o teste efetuado será completo.
Em primeiro lugar é necessário criar um "tarball" (arquivo tar comprimido) da árvore de diretórios do próprio pacote (compreendido o subdiretório work). Por exemplo:
$ tar -czf packagename.tgz package_dir
Sucessivamente o arquivo deve ser copiado em um local acessível aos gerenciadores da coleção de pacotes do NetBSD. Se isso não é possível, convém contatar os responsáveis para perguntar se existem outros métodos que se podem usar para tornar o arquivo disponível.
O método preferido para informar os responsáveis pela coleção de pacotes do NetBSD é usar o utilitário send-pr, especificando a categoria "pkg", incluindo o nome, a versão e a URL do pacote, além de uma breve descrição do mesmo.
Pode-se utilizar tanto a versão do send-pr incluída no NetBSD quanto a disponível online no endereço http://www.NetBSD.org/cgi-bin/sendpr.cgi?gndb=netbsd.
Como já foi dito, este breve guia limita-se a considerar pacotes simples que instalam um número limitado de arquivos no sistema NetBSD, com a suposição adicional de que os próprios pacotes não tenham dependências de outros pacotes.
Para um aprofundamento posterior aconselha-se a leitura do já citado Packages.txt.