Skip to content

Instantly share code, notes, and snippets.

@guicruzzs
Forked from selialkile/tutorial_pacote_debian.MD
Last active October 2, 2024 20:51
Show Gist options
  • Save guicruzzs/af08c53f1aa34897f624 to your computer and use it in GitHub Desktop.
Save guicruzzs/af08c53f1aa34897f624 to your computer and use it in GitHub Desktop.
Como criar pacotes debian

Tutorial: como criar pacotes debian

Diversos lugares na internet explicam de maneira complicada de como criar um pacote debian, vou passar um resumo de como fazer um pacote de forma simples.

Seguindo a estrutura do nosso aplicativo de testes:

aplicativo
aplicativo\meu_arquivo

Primeiro vamos instalar tudo que é necessário:

sudo apt-get install dh-make and debhelper devscripts dpkg-dev cdbs lintian
Para criar um pacote precisamos uma versão inicial, muitos tutoriais na internet explicam que tem que fazer um tar com o conteúdo, mas podemos fazer de forma mais simples.

Vamos alterar o nome da pasta do aplicativo ou criar um link simbólico para ele:

mv aplicativo aplicativo-1.0

ou

ln -s aplicativo aplicativo-1.0

Dessa forma já conseguimos acessar o diretório com a versão do nosso aplicativo.

cd aplicativo-1.0

Agora precisamos criar os arquivos básicos, para isso usamos o dh_make que fará toda a mágica:

 dh_make -e [email protected]  -s --createorig

 

O dh_make vai criar o básico do pacote, -e irá colocar o email informado nas descrições do pacote ( facilita o/ ), -s é a opção de pacote single ou seja, será gerado somente um pacote para o aplicativo mas isso não impede de futuramente criar mais de um pacote e por fim o --createorig que é o cara que cria o tar pra gente, dessa forma mesmo sem ter feito um tar com o código fonte ele já fará isso para nós. Esse passo é  conhecido com “debianização” do pacote.

Nesse ponto já podemos fazer um teste com o comando de build do pacote:

 dpkg_buildpackage 

Também podemos conferir o conteúdo do nosso pacote:

dpkg -c ../aplicativo_1.0-1_i386.deb

Ele não irá mostrar nenhum conteúdo, afinal não colocamos nada dentro do pacote só criamos a estrutura básica.

Toda a estrutura básica do pacote foi criada dentro de uma pasta aplicativo-1.0/debian onde vamos ver rápidamente sobre alguns dos arquivos chaves.

 

DH_*

Alem do dh_make existem diversos outros dh_* que fazem diversas ações dos pacotes, segue alguns:
 dh_install -> instala os arquivos informados pelos arquivos .install seguindo o formato: ORIG -> DEST

dh_installdirs -> cria os diretórios informados seguindo o formato: DEST/DEST2

dh_fixperms -> ajusta as permissões dos arquivos do pacote nos diretórios debuild.

Arquivos do Pacote Debian

 

Sobre a edição desses arquivos recomendo utilizar o VIM com highlights habilitado, quem não tiver o VIM:

Como root, instale o pacote vim-runtime, ou apenas digite:

$ cd ~ $ sudo apt-get install vim
Depois de instalado, precisamos criar um arquivo no diretório home do usuário.
$ echo ":syntax enable" >> .vimrc
Com isso seu VIM já estará ok.

 

changelog

Tanto no changelog quando nos outros arquivos é bom tomar muito cuidado ao editar, pois ele pode "quebrar" e não irá empacotar.

Nesse arquivo colocamos o histórico de alteração

Exemplo do arquivo:

aplicativo (1.0-1) unstable; urgency=low
* Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>

-- seu nome < [email protected]> Tue, 09 Aug 2011 14:54:06 -0300

A data é algo que muita gente erra e quebra o pacote, então altere com cuidado seguindo o padrão já existente.

 

control

O arquivo control tem a seguinte estrutura padrão:
Source: aplicativo
Section: unknown
Priority: extra
Maintainer: Seu Nome Completo <
 [email protected] >
Build-Depends: debhelper (>= 6)
Standards-Version: 3.9.1
Homepage: http://www.aplicativo.com.br/

Package: aplicativo Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends} Description: Descrição resumida do pacote Descrição extendida do pacote.

Nesse arquivo, Source contém as informações do código fonte, Package pra baixo são informações referentes aos pacotes que serão construidos. Por exemplo, ao invés de somente um pacote quisermos criar mais de um com conteúdos distintos:

Source: aplicativo
Section: unknown
Priority: extra
Maintainer: Seu Nome Completo <
 [email protected] >
Build-Depends: debhelper (>= 6)
Standards-Version: 3.9.1
Homepage: http://www.aplicativo.com.br/

Package: aplicativo
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Descrição resumida do pacote
Descrição extendida do pacote.

Package: aplicativo-extras
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Descrição resumida do pacote que tem os extras
Descrição extendida do pacote de extras...

copyright

O arquivo de copyright contém a licença utilizada neste software e no seu empacotamento.

rules

O arquivo rules é o arquivo que vai controlar a construção do pacote. Ele possui o formato de um Makefile e deve ser editado para atender às nossas necessidades ao gerar o pacote, por padrão ele não vem quase nada:
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
#
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
#
# Modified to make a template file for a multi-binary package with separated
# build-arch and build-indep targets  by Bill Allombert 2001

Uncomment this to turn on verbose mode.

#export DH_VERBOSE=1

This has to be exported to make some magic below work.

export DH_OPTIONS

%:     dh $@

Porém com isso ele irá executar todos os dh_* padrões, então é melhor sempre criar seu próprio rules com somente o básico do seu pacote, exemplo:

#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1
DESTDIR=$(CURDIR)/debian/tmp
LIBDIR=$(DESTDIR)/conteudo
clean:
      dh_clean
      rm -rf $(DESTDIR)
build:
      dh_testdir
      dh_prep
      dh_installdirs

install:

binary-indep: build install
      dh_testdir
      dh_testroot
      dh_install -X/usr/share/man --fail-missing
      dh_installman
      dh_installchangelogs
      dh_installdocs
      dh_lintian
      dh_link
      dh_compress
      dh_fixperms
      dh_makeshlibs
      dh_installdeb
      dh_shlibdeps
      dh_gencontrol
      dh_md5sums
      dh_builddeb

binary: binary-indep

Cuidado ao criar seu próprio rules já que "Com grandes poderes vem grandes responsabilidades", pois ele é um makefile e você pode colocar vários comandos la dentro mas de forma a não destruir os padrões do debian.

Se precisar utilizar algum comando do sh para pegar alguma variável ou até mesmo o describe do git, pode se utilizar $$ para fazer referência à comandos do sh e não variáveis do makefile:

echo $$(git describe) > debian/nome_pacote/version.txt

Pra facilitar, não vamos mexer nesse cara e usar o padrão.

OBS.: Esse arquivo é identado com TAB e não com espaços, para facilitar a edição é melhor usar o VIM pois ele já mostra se está com erro ou não.

Copiando os arquivos para os lugares corretos

Lembra dos dh_* ? Hora de usar esses poderes!

 

Vamos criar um arquivo aplicativo.install dentro do diretório debian que irá conter os arquivos que vamos copiar da nossa aplicação para o computador com o seguinte conteúdo:

meu_arquivo /opt/local/aplicativo

Vamos criar um arquivo aplicativo.dirs dentro do diretório debian que irá conter os diretórios da nossa aplicação com o seguinte conteúdo:

 /opt/local/aplicativo

Com isso já podemos realizar o build do pacote:

 dpkg_buildpackage 

E finalmente podemos conferir o conteúdo do nosso pacote:

 dpkg -c ../aplicativo_1.0-1_i386.deb

Pacote criado! o/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment