Há um novo subdiretório sob o diretório principal do programa (`gentoo-0.9.12'), ele é chamado `debian'. Há alguns arquivos nesse diretório. Nós iremos editar esses arquivos para customizar o comportamento do pacote. Os mais importantes são `control', `changelog', `copyright' e `rules', que são requeridos para todos os pacotes.
Esse arquivo contém vários valores que dpkg e dselect usaram para lidar com o pacote. Aqui está o arquivo control que o dh_make criou para nós.
1 Source: gentoo 2 Section: unknown 3 Priority: optional 4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr> 5 Standards-Version: 3.0.1 6 7 Package: gentoo 8 Architecture: any 9 Depends: ${shlibs:Depends} 10 Description: <insert up to 60 chars description> 11 <insert long description, indented with spaces>
(Incluí o número nas linhas.)
As linhas 1 a 5 são informações de controle para o pacote de código fonte. Linha 1 é o nome do pacote fonte.
Linha 2 é a seção da distribuição na qual o pacote vai. Como você pode ter notado, o Debian é dividido nas seções: main (principal - o software livre), non-free (não livre - os pacotes não totalmente livres) e contrib (software livre que depende de software não livre). Sob essas, há subseções lógicas que descrevem resumidamente que pacotes estão dentro. Temos a `admin' para programas de administração, `base' para as ferramentas básicas, `devel' para ferramentas de programadores, `doc' para documentação, `libs' para bibliotecas, `mail' para leitores e servidores de email, `net' para aplicativos e servidores de rede, `x11' para programas específicos do X11, e muito mais.
Vamos mudá-lo então para x11.
Linha 3 descreve quão importante é que o usuário instale esse pacote. Seção e prioridade são atualmente usadas apenas pelo dselect quando ele ordena os pacotes e seleciona padrões, e ele podem (e muito provavelmente serão) mudados pelos nossos mantenedores de FTP. Veja o manual de Política para um guia sobre o que configurar nos campos.
Como esse é um pacote de prioridade normal, vamos deixá-lo como opcional.
Linha 4 é o nome e o endereço de e-mail do mantenedor.
Linha 5 é a versão dos padrões de Política Debian que esse pacote segue (as duas maiores versões do pacote debian-policy instalado).
Se algum compilador não padrão ou outra ferramenta é necessária para se construir o pacote, você deve adicionar uma linha `Build-Depends' e listar os pacotes requeridos. Para maiores informações nisso, leia o Manual de Empacotamento (seção 8.7) e a documentação do pacote `build-essential'.
Linha 7 é o nome do pacote binário.
Linha 8 descreve as arquiteturas de CPU para as quais o pacote binário pode ser
compilado. Podemos deixar como "any" porque
dpkg-gencontrol(1)
irá preencher o valor apropriado para cada
máquina em que esse pacote se compile (veja a Referência do Desenvolvedor para
uma explicação sobre o que é portar pacotes). Se seu pacote é independente de
arquitetura (por exemplo, um shell ou script Perl, ou documento), mude isso
para "all", e leia depois em o
arquivo `rules', Seção 4.4 sobre usar a regra `binary-indep' ao invés da
`binary-arch' para construir o pacote.
A linha 9 mostra um dos mais poderosos recursos do sistema de empacotamento Debian. Pacotes podem relatar outros em vários modos. Além de Dependências (Depends:), outras relações são: Recomenda (Recommends:), Sugere (Suggests:), Pré-Depende (Pre-Depends:), Conflita (Conflicts:), Provê (Provides:) e Substitui (Replaces:).
As ferramentas de manejo de pacotes como dpkg, dselect ou APT (e seus
front-ends) normalmente se comportam da mesma maneira quando lidando com essas
relações; se não, isso será explicado. (veja dpkg(8)
,
dselect(8)
, apt(8)
, console-apt(8)
,
gnome-apt(8)
)
Isso é o que elas normalmente significam:
O pacote não irá ser instalado a menos que o pacote do qual ele depende esteja instalado. Use isso se seu programa absolutamente não irá rodar (ou irá causar paradas críticas) a menos que um pacote em particular esteja presente.
Dselect não instalará seu pacote a menos que o pacote que ele recomenda esteja instalado. Dpkg e APT podem deixar que você faça isso, no entanto. Use isso para pacotes que não são estritamente necessários mas que são tipicamente usados com seu programa.
Quando um usuário instalar seu programa, o dselect irá pedir para instalar os pacotes que ele sugere. Dpkg e APT não vão ligar muito. Use isso para pacotes que irão rodar bem com seu programa mas não são realmente necessários.
Esse é mais forte que Depends:. O pacote não irá ser instalado a menos que o pacote do qual ele pré depende esteja instalado e corretamente configurado. Use isso com muita moderação e só depois de discutir isso na lista de e-mail debian-devel. Leia: não use isso de qualquer modo. =)
O pacote não será instalado até que o pacote que está em conflito com ele tenha sido removido. Use isso se seu programa não irá rodar absolutamente (ou causará quebras severas) se um pacote em particular está presente.
Para alguns tipos de pacote onde há muitas alternativas, nomes virtuais foram definidos. Você pode pegar a lista completa no arquivo /usr/share/doc/debian-policy/virtual-package-names-list.text.gz. Use isso se seu programa proporciona uma função de um pacote virtual.
Use isso quando seu programa repõe arquivos de outro pacote, ou completamente substitui o outro pacote (usado em conjunto com Conflicts:). Arquivos do pacote nomeado serão removidos antes de instalar os do seu.
Todos esses campos tem sintaxe uniforme. Eles são uma lista de pacotes separados por vírgulas. Esses nomes de pacotes podem também ser listas de pacotes alternativos, separados pela barra vertical | (símbolo de pipe(cano)). Os campos podem restringir sua aplicabilidade para versões particulares de cada pacote nomeado. Esses versão são listadas em parênteses depois de cada nome de pacote individual, e eles devem conter uma relação da lista abaixo seguido do número de versão. As relações permitidas são: <<, <=, =, >= e >> para estritamente menor, menor ou igual, exatamente igual, maior ou igual e estritamente maior, respectivamente.
O último recurso que você precisa saber é $(shlibs:Depends). Ele vai ser
automaticamente gerado pelo dh_shlibdeps(1)
e preenchido pelo
dh_gencontrol(1)
com os nomes de qualquer biblioteca compartilhada
que o programa use, como libc6 ou xlib6g, então você não precisa especificá-las
você mesmo. Dito isso, podemos deixar a linha 9 do jeitinho que está.
A linha 10 é onde vai a lista de. Aqui é apenas `file' porque o gentoo pode usar alguns recursos desse programa/pacote.
Linha 11 é a breve descrição. A maioria das telas das pessoas tem 80 colunas então ela não deve ser maior que 60 caracteres. Vou colocar: "A fully GUI configurable GTK+ file manager" (Um gerenciador de arquivos feito em GTK+ totalmente configurável graficamente).
Linha 12 é onde vai a descrição longa. Ela deve ter um parágrafo que dá mais detalhes sobre o pacote. Coluna 1 de cada linha deve estar vazia. Não deve haver linhas em branco, mas você pode por um . (ponto) numa coluna para simular isso. Também, deve haver não mais que uma linha em branco depois da descrição longa..
Aqui está o arquivo control atualizado:
1 Source: gentoo 2 Section: x11 3 Priority: optional 4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr> 5 Standards-Version: 3.0.1 6 7 Package: gentoo 8 Architecture: any 9 Depends: ${shlibs:Depends} 10 Suggests: file 11 Description: A fully GUI configurable GTK+ file manager 12 gentoo is a file manager for Linux written from scratch in pure C. It 13 uses the GTK+ toolkit for all of its interface needs. gentoo provides 14 100% GUI configurability; no need to edit config files by hand and re- 15 start the program. gentoo supports identifying the type of various 16 files (using extension, regular expressions, or the 'file' command), 17 and can display files of different types with different colors and icons. 18 . 19 gentoo borrows some of its look and feel from the classic Amiga file 20 manager "Directory OPUS" (written by Jonathan Potter).
(Adicionei os números de linha.)
Esse arquivo contém a informação sobre os recursos externos do pacote, copyright e informações de licença. Seu formato não é ditado pela Política, mas o conteúdo é (seção 6.5). Dh_make cria um padrão, ele é assim:
1 This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from <fill in ftp site> 5 6 Upstream Author(s): <put author(s) name and email here> 7 8 Copyright: 9 10 <Must follow here>
(Adicionei os números de linha.)
As coisas importantes a serem adicionadas a esse arquivo são o lugar de onde você pegou o pacote e a licença e nota de copyright atuais. Você deve incluir a licença completa a menos que seja uma das licenças comuns de software livre como a GNU GPL ou LGPL, BSD ou a Artistic license, quando você pode apenas referir ao arquivo apropriado no diretório /usr/share/common-licenses/ que existe em todo sistema Debian. O Gentoo está licenciado sob a Licença Pública Geral GNU (GNU GPL - General Public License), então nós poderemos modificar o arquivo assim:
1 This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from: ftp://ftp.obsession.se/gentoo/ 5 6 Upstream author: Emil Brink <emil@obsession.se> 7 8 This software is copyright (c) 1998-99 by Emil Brink, Obsession 9 Development. 10 11 You are free to distribute this software under the terms of 12 the GNU General Public License. 13 On Debian systems, the complete text of the GNU General Public 14 License can be found in /usr/share/common-licenses/GPL file.
(Adicionei os números de linha.)
Esse é um arquivo requerido, que tem um formato especial descrito no Manual de Empacotamento (seção 3.2.3). Esse formato é usado pelo dpkg e pelos outros programas para obter o número de versão, revisão, distribuição e urgência de seu pacote.
Para você, também é importante, já que é bom ter documentadas todas as mudanças feitas. Ele irá ajudar as pessoas que pegarem seu pacote a ver se há qualquer problema não resolvido com o pacote sobre o qual eles devem saber instantaneamente. Ele irá ser salvo como `/usr/share/doc/gentoo/changelog.Debian.gz' no pacote binário.
Dh_make cria um arquivo padrão que é assim:
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100 6 7 Local variables: 8 mode: debian-changelog 9 End:
(Eu adicionei os números às linhas.)
Linha 1 é o nome do pacote, versão, distribuição e urgência. O nome deve ser o mesmo do nome do pacote fonte, distribuição deve ser ou `unstable' (instável) ou `experimental' (por agora), e urgência não deve ser mudada para nada maior que `low' (baixa). =)
Linhas 3 a 5 são as entradas do log, onde você documenta as mudanças feitas
nessa revisão do pacote (não as mudanças externas - há um arquivo especial para
esse propósito, criado pelos autores externos, instalado como
/usr/share/doc/gentoo/changelog.gz). Novas linhas devem ser inseridas apenas
antes da linha mais acima que começa com um asterisco (`*'). Você pode fazê-lo
com dch(1)
, emacs(1)
(linhas 7-9 contêm informações
de modo para o editor Emacs), ou qualquer outro editor de texto. Você terá
algo assim:
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 * This is my first Debian package. 5 * Adjusted the Makefile to fix $DESTDIR problems. 6 7 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100 8 9 Local variables: 10 mode: debian-changelog 11 End:
(Adicionei os números de linha.)
Quando você lança uma nova revisão, você precisa aumentar o número de versão. Você pode fazê-lo com `dch -i' ou explicitamente `dch -v <versão>-<revisão>` e então inserir os comentários usando seu editor preferido. Dica: como colocar a data no formato requerido facilmente? Use `822-date' ou `date -R'.
A informação de nova versão é adicionada no topo do changelog. O changelog fica assim depois:
1 gentoo (0.9.12-2) unstable; urgency=low 2 3 * Fixed a glitch in the menu file. 4 5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 22:15:39 +0100 6 7 gentoo (0.9.12-1) unstable; urgency=low 8 9 * Initial Release. 10 * This is my first Debian package. 11 * Adjusted the Makefile to fix $DESTDIR problems. 12 13 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100 14 15 Local variables: 16 mode: debian-changelog 17 End:
(Adicionei os números de linha.)
Você pode ler mais sobre novas versões/revisões de pacote mais tarde em Atualizando o pacote, Seção 6.4.
Agora precisamos dar uma olhada nas regras exatas que o
dpkg-buildpackage(1)
irá usar para criar o pacote. Esse arquivo é
atualmente outro Makefile, já que é executado com `make -f', mas diferente do
que está no código externo.
Cada arquivo `rules', como qualquer outro Makefile, consiste em várias regras especificando como manipular o código. Cada regra consiste de alvos, nomes de arquivos ou ações que devem ser carregadas (ex: `build:' ou `install:'). Regras que você quer executar são chamadas como argumentos na linha de comando (por exemplo, `./debian/rules build` ou `make -f rules install`). Depois do nome do alvo, você pode nomear a dependência, programa ou arquivo do qual essa regra depende. Depois disso, pode haver qualquer número de comandos (indentados com <tab>!), até que uma linha vazia é encontrada. Aí começa uma nova regra. Múltiplas linhas vazias, e linhas iniciadas com `#' (hash) são tratadas como comentários ou ignoradas.
Você está provavelmente confuso agora, mas isso estará mais claro depois de examinarmos o arquivo `rules' que o dh_make nos dá como padrão. Você deve também ler a entrada `make' no info (`info make`) para mais informações.
A parte importante sobre o arquivo rules criado pelo dh_make, é que ele é apenas uma sugestão. Ele funcionará para programas simples mas não para programas mais complicados, não tenha medo de retirar ou adicionar linhas dele para suprir suas necessidades. A única coisa que você não deve mudar são os nomes das regras, porque todas as ferramentas usam esses nomes, como é descrito no Manual de Empacotamento.
1 #!/usr/bin/make -f 2 # Made with the aid of dh_make, by Craig Small 3 # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. 4 # Some lines taken from debmake, by Christoph Lameter. 5 6 # Uncomment this to turn on verbose mode. 7 #export DH_VERBOSE=1 8 9 # This is the debhelper compatability version to use. 10 export DH_COMPAT=1 11 12 build: build-stamp 13 build-stamp: 14 dh_testdir 15 16 # Add here commands to compile the package. 17 $(MAKE) 18 19 touch build-stamp 20 21 clean: 22 dh_testdir 23 dh_testroot 24 rm -f build-stamp 25 26 # Add here commands to clean up after the build process. 27 -$(MAKE) clean 28 29 dh_clean 30 31 install: build-stamp 32 dh_testdir 33 dh_testroot 34 dh_clean -k 35 dh_installdirs 36 37 # Add here commands to install the package into debian/tmp. 38 $(MAKE) install DESTDIR=`pwd`/debian/tmp 39 40 # Build architecture-independent files here. 41 binary-indep: build install 42 # We have nothing to do by default. 43 44 # Build architecture-dependent files here. 45 binary-arch: build install 46 # dh_testversion 47 dh_testdir 48 dh_testroot 49 # dh_installdebconf 50 dh_installdocs 51 dh_installexamples 52 dh_installmenu 53 # dh_installemacsen 54 # dh_installpam 55 # dh_installinit 56 dh_installcron 57 dh_installmanpages 58 dh_installinfo 59 # dh_undocumented 60 dh_installchangelogs 61 dh_link 62 dh_strip 63 dh_compress 64 dh_fixperms 65 # You may want to make some executables suid here. 66 dh_suidregister 67 # dh_makeshlibs 68 dh_installdeb 69 # dh_perl 70 dh_shlibdeps 71 dh_gencontrol 72 dh_md5sums 73 dh_builddeb 74 75 binary: binary-indep binary-arch 76 .PHONY: build clean binary-indep binary-arch binary install
(Eu adicionei os números de linha.)
Você é provavelmente familiarizado com as linhas como a 1 de scripts shell ou Perl. Ela diz ao sistema operacional que esse arquivo é para ser processado com /usr/bin/make.
Linhas 12 a 19 descrevem a regra `build' (e seu filho `build-stamp'), que roda o Makefile da própria aplicação para compilar o programa.
A regra `clean', especificada nas linhas 21 a 29, limpam qualquer binário desnecessário ou coisas auto geradas, deixadas da construção do pacote. Essa regra precisa estar funcionando todo o tempo (mesmo quando a árvore de código é limpa!), então por favor use as opções de força (ex: para rm, a opção `-f'), ou ignore valores de retorno (com um `-' na frente de cada comando).
O processo de instalação, a regra `install', começa na linha 31. Ela basicamente roda a regra `install' do Makefile do próprio programa, mas instala no diretório `pwd`/debian/tmp - que é o porque de nós especificarmos $(DESTDIR) como o diretório de instalação root no Makefile do gentoo.
Como o comando sugere, a regra `binary-indep', na linha 41, é usada para construir pacotes independentes de arquitetura. Como não temos nenhum, nada será feito aqui. Se seu pacote é `Architecture: all', você precisa incluir todos os comandos para construir o pacote sob essa regra, e deixar a próxima regra (`binary-arch') vazia.
Na próxima regra - `binary-arch', nas linhas 45 até 73, nas quais nós rodamos vários pequenos utilitários do pacote debhelper que fazem várias operações nos arquivos do seu pacote para fazer o pacote conformar com a Política.
Os nomes começam com dh_, e o resto é a descrição de o que aquele utilitário em particular faz realmente. Ele é bastante auto-explicativo, mas aqui estão algumas explicações adicionais:
dh_testdir(1)
checa se você está no diretório correto (ex: o
diretório principal do fonte).
dh_testroot(1)
checa se você tem permissões de root que são
necessárias para alvos binary*, e clean.
dh_installmanpages(1)
copia todas as páginas de manual que pode
encontrar na árvore de diretórios do fonte do pacote (tome cuidado, ele é WIM).
dh_strip(1)
tira os cabeçalhos de debugging dos arquivos
executáveis e bibliotecas, para fazê-los menores.
dh_compress(1)
gzipa as páginas de manual e documentação com
tamanho acima de 4 kB.
dh_installdeb(1)
copia arquivos relacionados com o pacote (ex: os
scripts do mantenedor) sob o diretório debian/tmp/DEBIAN.
dh_shlibdeps(1)
calcula as dependências de bibliotecas
compartilhadas das bibliotecas e executáveis.
dh_gencontrol(1)
adiciona coisas ao arquivo control e o instala.
dh_md5sums(1)
gera checksums MD5 para todos os arquivos do pacote.
Para informações mais completas sobre o que cada um desses scripts dh_* faz, e quais suas opções, leia suas respectivas páginas de manual. Há alguns outros, possivelmente muitos e úteis scripts dh_*, que não foram mencionados aqui. Se você precisar deles, leia a documentação do debhelper.
A seção binary-arch é onde você deve realmente comentar algumas linhas que chamam recursos que você não precisa. Para gentoo, eu irei comentar linhas sobre testversion, emacsen, pam, init, cron, manpages, info, undocumented, suidregister, makeshlibs e perl, simplesmente porque o gentoo não precisa delas. Também, na linha 60, irei precisar adicionar `FIXES', porque esse é o nome do changelog externo.
As últimas duas linhas (junto com quaisquer outras linhas não explicadas são apenas algumas coisas mais ou menos necessárias, considerando as que você pode ler no manual do make, e no Manual de Empacotamento. Por agora, elas não são importantes para se saber.
jrodin@jagor.srce.hr
dockov@zaz.com.br
hellblade@linuxbr.com.br