Existe documentação nova e interessante sobre empacotamento:

Se você precisa criar rapidamente um pacote, use equivs:

  • leia primeiro ?como criar um pacote vazio

  • então leia como criar um ?pacote com alguns arquivos

Se você preferir obter bons conhecimentos sobre empacotamento no Debian:

Traduções: English - Italiano - 简体中文 - Brasileiro


Esta é uma abordagem pragmática para aprender como criar pacotes Debian.

Empacotar para o Debian não é tão difícil. Leia primeiro a ?introdução para empacotamento no Debian.

Se as informações abaixo não responderem às suas perguntas, procure no Guia de Novos Mantenedores e em Política Debian

O capítulo de gerenciamento de pacotes do Debian da Referência para Desenvolvedores contém muitas informações úteis para lidar com todos os tipos de problemas em que se passa com apt e dpkg .

Se você quiser criar um pacote Debian oficial, verifique se ele ainda não está empacotado.

Se alguém estiver trabalhando no pacote, você deve contatá-lo se você pretende fazer um pacote oficial em conjunto.

Para uma maneira um pouco mais moderna de gerenciar tudo isso, confira git-buildpackage. TODO: escreva esta página sobre git-buildpackage, em vez de quilt, para uma experiência menos barroca e mais familiar.

Compilação inicial

Antes de começar, existem alguns riscos dos quais você deve estar ciente:

ADVERTÊNCIAS:

Passos:

É melhor criar uma cadeia de chroot para criar a aplicação. Isso mitiga problemas de segurança e corrupção do sistema. Além disso, garante que as alterações locais na sua máquina não interferirão com a compilação.

If the package compiles, then it means you may have figured out all the dependencies. Don't worry, this will be checked later in a chroot environment. Try the application in a chroot environment (some things might be needed in the chroot jail - for example, proc may need to be mounted, sys to be mounted, etc.). Broken installation scripts are, unfortunately, very common and you probably don't want to run a test installation yet. You might prefer doing the tests in a qemu virtual machine in snapshot mode - changes are not permanent in snapshot mode and you can keep you development machine safe from malicious/broken makefiles.

''Debianização''

Após a primeira compilação, é hora de criar a parte específica Debian do pacote.

Debianize o pacote usando dh_make ou uma das outras ferramentas de empacotamento automático.

Arquivo debian/control: Adicione ao Build-Depends (às vezes até no Build-Depends-Indep) a lista de pacotes necessários para serem instalados para o aplicativo para compilar (lembre-se da lista feita anteriormente). Você deve deixar de fora os pacotes listados em /usr/share/build-essential/essential-packages-list ou /usr/share/build-essential/list e também excluir qualquer pacote listado como dependências por qualquer desses pacotes.

Arquivar debian/rules: se qualquer curvatura foi feita, então:

Revise cada um dos arquivos de modelo (debian/*.ex). Se o seu pacote precisar desse recurso, personalize o arquivo conforme necessário e renomeie-o sem o ".ex".

Exclua todos os modelos desnecessários. Não se preocupe, eles podem ser restaurados a qualquer momento com "dh_make -a".

Certifique-se de que todos os diretórios em que você colocará os arquivos serão listados no arquivo debian/dirs sem uma barra diagonal (/).

Certifique-se de que os arquivos estão instalados no local apropriado (em um diretório, não no sistema raiz). Tenha cuidado com o alvo da instalação do makefile do aplicativo. Se o aplicativo usar autoconf e automake, pode ser suficiente para definir a variável de ambiente DESTDIR, por exemplo, "make DESTDIR=$(CURDIR)/debian/packagename". (dh_make irá configurar isso automaticamente.)

Nota: muitas vezes o pacote upstream irá instalar arquivos em /usr/local. "NÃO INSTALE QUALQUER ARQUIVO AQUI".

Compilação inicial do pacote

TODO: adicionar notas

Construindo pacotes do Debian

Para garantir que um pacote Debian atenda todas as dependências de compilação e não seja influenciado por nada específico para o ambiente do usuário, os pacotes devem ser criados em um ambiente chroot. Ferramentas como pbuilder podem ser usadas para isso.

Ao trabalhar em um pacote, uma recompilação mais rápida pode ser feita com 'debuild'. Mas, então, todas as dependências de compilação devem ser satisfeitas na instalação onde o pacote foi construído. Todos os pacotes necessários podem ser instalados automaticamente com apt-get build-dep. Um exemplo completo para a construção do pacote foo parece assim:

  $ apt-get source foo
  $ cd foo-0.0.1
  $ sudo apt-get build-dep foo
  $ debuild -i -us -uc -b

Isso geralmente é suficiente para você criar pacotes de backport.

Testando e verificando o pacote

Todas os teste em chroot

Por que é uma boa idéia usar um chroot?

Testando o pacote

licensecheck -r *

TODO: adicione notas

Lintian

Teste todos os pacotes com lintian.

lintian package-version.changes

Piuparts

Teste todos os pacotes .deb com piuparts.

piuparts binpackage-version.deb

Pontos de verificação para qualquer pacote

/!\ Esta lista de verificações é obsoleta e check-all-the-things o substitui, exceto por algumas verificações documentadas no arquivo TODO.

sudo apt-get install lintian lintian4python libcrypt-ssleay-perl libwww-perl cppcheck devscripts pyflakes libperl-critic-perl desktop-file-utils mp3check checkmp3 mp3val fontforge-nox freetype2-demos gettext-lint jlint pngcheck jpeginfo vorbis-tools oggz-tools lacheck fdupes python-magic libxml2-utils similarity-tester moreutils pep8 blhc libconfig-model-perl libconfig-model-dpkg-perl bfbtester elfutils hlint adequate i18nspector epubcheck iwyu python-jpylyzer libb-lint-perl codespell duck
export BUILDPATH=/home/foo/path/to/foo-1.2.3
cd $BUILDPATH
lintian ../*.changes
lintian4py ../*.changes
cme check dpkg
cme check dpkg-control
cme check dpkg-copyright
debuild && debuild && debuild
uscan --verbose
licensecheck --check=. --recursive --copyright .
grep -i warn ../*.build
blhc --all ../*.build
cppcheck -j8 --quiet -f .
jlint.sh 2>&1 | fgrep -v 'Verification completed: '
pyflakes .
pep8 --ignore W191 .
perlcritic -1 .
suspicious-source
bfbtester -x 10 -a debian/*/bin debian/*/usr/bin debian/*/sbin debian/*/usr/sbin debian/*/usr/games
hlint .
codespell --quiet-level=3
find -iname \*.sh -print0 | xargs --no-run-if-empty --null -n1 sh -n
find -iname \*.sh -print0 | xargs --no-run-if-empty --null -n1 checkbashisms
find \( -iname \*.pm -o -iname \*.pl \) -print0 | xargs --no-run-if-empty --null -n1 perl -wc
find \( -iname \*.pm -o -iname \*.pl \) -print0 | xargs --no-run-if-empty --null -n1 perl -MO=Lint 2>&1 | grep -v ' syntax OK$'
find -iname \*.php\* -print0 | xargs --no-run-if-empty --null -n1 php -l -f
find \( -iname \*.c -o -iname \*.cxx -o -iname \*.cpp -o -iname \*.cc -o -iname \*.h -o -iname \*.hpp -o -iname \*.hh -o -iname \*.hxx \) -print0 | xargs --no-run-if-empty --null -n1 include-what-you-use
find -iname \*.desktop -print0 | xargs --no-run-if-empty --null -n1 desktop-file-validate
find -iname \*.mp3 -print0 | xargs --no-run-if-empty --null mp3check --error-check --anomaly-check
find -iname \*.mp3 -print0 | xargs --no-run-if-empty --null checkmp3
find -iname \*.mp3 -print0 | xargs --no-run-if-empty --null mp3val
find \( -iname \*.ttf -o -iname \*.otf -o -iname \*.sfd -o -iname \*.pfa -o -iname \*.pfb -o -iname \*.bdf -o -iname \*.pk -o -iname \*.ttc -o -iname \*.pcf \) -print0 | xargs --null --no-run-if-empty --max-args=1 fontlint
find \( -iname \*.ttf -o -iname \*.otf \) -print0 | xargs --no-run-if-empty --null -n1 ftvalid
find \( -name \*.po -o -name \*.pot \) -print0 | xargs --max-args=1 --no-run-if-empty --null msgfmt --check --check-compatibility --check-accelerators
find \( -name \*.po -o -name \*.pot \) -print0 | xargs --no-run-if-empty --null POFileChecker
find \( -name \*.po -o -name \*.pot \) -print0 | xargs --no-run-if-empty --null POFileSpell
find \( -name \*.mo -o -name \*.po -o -name \*.pot \) -print0 | xargs --no-run-if-empty --null i18nspector
find -iname *.png -print0 | xargs --no-run-if-empty --null pngcheck -q
find \( -iname \*.jpg -o -iname \*.jpeg \) -print0 | xargs --no-run-if-empty --null jpeginfo --check --quiet | fgrep -v "[OK]"
find \( -iname \*.jp2 -o -iname \*.j2k -o -iname \*.jpf -o -iname \*.jpx -o -iname \*.jpm -o -iname \*.mj2 \) | xargs jpylyzer --wrapper | xmllint --format - | egrep 'fileName|isValid' | tr -d \\n | sed 's_</isValidJP2>_&\n_g;s_ *<fileName>__g;s_</fileName> *__g;s_</\?isValidJP2>_ _g;s_False_is an invalid JPEG2000 file_g' | sed '/True *$/d'
find \( -iname \*.ogg -o -iname \*.oga -o -iname \*.ogv \) -print0 | xargs --no-run-if-empty --null ogginfo -q | grep -v 'Processing file ' | cat -s
find \( -iname \*.ogg -o -iname \*.oga -o -iname \*.ogv \) -print0 | xargs --no-run-if-empty --null oggz-validate
find -iname \*.xml -print0 | xargs --no-run-if-empty --null xmllint --noout
find -iname \*.tex -print0 | xargs --no-run-if-empty --null lacheck
find -iname \*.epub -print0 | xargs --no-run-if-empty --null -n1 epubcheck -quiet | egrep -v '^(Check finished with warnings or errors| *)$'
find -iname *.py -print0 | xargs --no-run-if-empty --null grep 'environ *\[.HOME.\]'
find -iname \*paypal\*.png -o -iname \*paypal\*.gif -o -iname \*flattr\*.png -iname \*flattr\*.gif
find \( -iname \*.png -o -iname \*.gif -o -iname \*.jpg -o -iname \*.jpeg \) -print0 | xargs --no-run-if-empty --null grep -iE 'inkscape|gimp'
find ! \( -iname \*.icns -o -iname \*.bmp -o -iname \*.ico -o -iname \*.png -o -iname \*.gif -o -iname \*.jpg -o -iname \*.jpeg -o -iname \*.mo -o -iname \*.gz -o -iname \*.zip -o -iname \*.pdf -o -iname \*.bz2 -o -iname \*.tar -o -iname \*.odt -o -iname \*.docx -o -iname \*.torrent -o -iname \*.pyc -o -iname \*.pyo -o -iname \*.o -o -iname \*.wav -o -iname \*.ttf -o -iname \*.ogg -o -iname \*.oga -o -iname \*.ogv -o -iname \*.xcf -o -iname \*.so -o -iname \*.so.\* -o -iname \*.gmo -o -iname \*.debug -o -iname \*.tga \) -print0 | xargs --no-run-if-empty --null isutf8
find ! -type d | xargs file  | grep ': *ELF ' | sed 's/: +*.*//' | xargs --no-run-if-empty eu-elflint --quiet --gnu-ld --strict
find -type f -iname \*.gz -print0 | xargs --no-run-if-empty --null gzip --test
find -type f -iname \*.bz2 -print0 | xargs --no-run-if-empty --null bzip2 --test
find -type f -iname \*.xz -print0 | xargs --no-run-if-empty --null xz --test
find \( -type f -iname \*.zip -o -iname \*.jar -o -iname \*.pk3 -o -iname \*.wz \) -print0 | xargs --no-run-if-empty --null unzip -t
find -type f -iname \*.lzma -print0 | xargs --no-run-if-empty --null lzma --test
find -type f -iname \*.lzo -print0 | xargs --no-run-if-empty --null lzop --test
find -type f -iname \*.lz -print0 | xargs --no-run-if-empty --null lzip --test
find -type f -iname \*.uu -print0 | xargs --no-run-if-empty --null uudecode -o /dev/null
grep -r '/tmp/' .
grep -r '/home' .
grep -r '/srv' .
grep -r '/opt' .
grep -r 'PATH' .
grep -r 'PERLLIB' .
grep -r 'x86_64-linux-gnu' .
grep -r 'site-packages' .
grep -rC4 'system *(' .
grep -rC4 'popen *(' .
grep -ri 'fixme' .
grep -ri 'todo' .
grep -ri 'hack' .
fdupes -r .
find -type f | sim_text -ipTt 75 | tac | column -t
apt-get install $(sed -n 's/^Package: //p' debian/control | tr '\n' ' ') ; debi ; apt-get -f install ; adequate $(sed -n 's/^Package: //p' debian/control | tr '\n' ' ')
duck
echo TODO: jslint puppet-lint acheck linkchecker ssl-cert-check

Esta página ainda está incompleta; Por favor, ajude adicionando informações a ela. Não esqueça que as informações aqui devem estar em uma forma concisa.

Exemplos