Como criar pacotes para o Arch Linux - parte II - pacotes svn e cvs

Há algum tempo eu fiz um tutorial mostrando como criar pacotes para o Arch Linux. O tutorial serve para a maioria dos pacotes, mas quando se trata de algo usando svn ou cvs o procedimento é um pouco diferente.

A diferença é, basicamente, em algumas linhas do PKGBUILD. É preciso prestar atenção nas variáveis conflicts, provides, svntrunk e pkgver.

De maneira geral um PKGBUILD para svn é assim:

# Contributor: Seu nome

pkgname=nome-do-pacote-svn
pkgver=versão
pkgrel=release
pkgdesc=”Descrição do pacote”
arch=(’arquitetura’)
url=”url do software”
depends=(’dependencias’)
license=(’Licensa’)
source=()
md5sums=()
provides=()
conflicts=()

build() {
intruções de compilação
}

O arquivo é bem simples e de fácil entendimento. É basicamente atribuição de variável. De qualquer forma vou fazer uma melhor descrição de cada campo.

# Contributor: Esta primeira linha do PKGBUILD não é obrigatória. Ela é usada apenas para mostrar quem criou o PKGBUILD e seu email (que será utilizado para troca de informações, sugestões, dúvidas etc). Apesar de não ser obrigatório, este campo é praticamente um padrão entre os empacotadores. Exemplo:

# Contributor: Hugo Doria <hugodoria at archlinux-br.org>


pkgname:
É aqui que você coloca o nome do pacote. Exemplo:

pkgname=billreminder-svn

ou

pkgname=billreminder-cvs

NOTA: Perceba que você precisa adicionar os sufixos svn ou cvs no nome do pacote. Isso serve para diferenciar os pacotes normais dos de versões em desenvolvimento.

pkgver: Aqui fica a versão do programa que está sendo empacotado. Como se trata de uma versão em desenvolvimento esta variável não tem número fixo e muda constantemente. Tente sempre colocar a data ou o número da revisão aqui (no final do tutorial há uma dica de como fazer isso).

pkgver=4098

pkgrel: Aqui fica o release do pacote. Em pacotes svn e cvs esta variável nem tem tanta importância. Ela geralmente será 1 já que o pkgver muda constantemente.

Pkgrel=1

pkgdesc: Aqui é a descrição do software. Exemplo do billreminder:

pkgdesc=“small and quick accounting application designed to allow for easy tracking of bills”

Só duas observações:

  • A descrição tem que ser em inglês.
  • E você não deve colocar o nome do pacote na descrição também. Seria errado colocar a descrição desta forma:

pkgdesc=“Billreminder is a small and quick accounting application designed to allow for easy tracking of bills”.

Foi decidido que o nome do pacote não entraria na descrição do mesmo para facilitar a visualização no pacman e não causar duplicidade.

arch: aqui é a arquitetura para a qual o software está disponível. Você deve por cada uma entre aspas simples. Exemplo:

arch=(’i686′ ‘x86_64′)

url: Aqui você coloca o endereço da página do programa que você está empacotando.

url=”http://billreminder.sourceforge.net/”

depends: Esta é uma das partes mais importantes do PKGBUILD. É aqui que você vai colocar todas as dependências necessárias para que o programa funcione. Cada dependência deve ficar entre aspas simples e você pode adicionar quantas dependências forem necessárias.

Supondo que você esteja criando um pacote para um programa que dependa do python, firefox, e thunderbird a variável ficaria assim:

depends=(’python’ ‘firefox’ ‘thunderbird’)

E no caso do billreminder:

depends=(’python-pysqlite’ ‘python-notify’ ‘dbus-python’ ’setuptools’ ‘desktop-file-utils’ ‘pygobject’ ‘pygtk’ ‘pil’ ‘perlxml’)

Para descobrir quais dependências um determinado programa tem você pode visitar o site do mesmo, usar o comando ldd ou o namcap (uma ferramenta própria do Arch para isso).

makedepends: Aqui você coloca as dependências necessárias para se criar o pacote. Por exemplo, para se criar um pacote de uma versão cvs é preciso, claro, que o próprio cvs esteja instalado. Exemplos:

makedepends=(’cvs’)

ou

makedepends=(’subversion’)

NOTA: Não coloque aqui as dependências necessárias para que o software funcione. Faça isso na variável depends.

License: Aqui você coloca licensa do programa. O Arch se preocupa bastante com isso e você deve prestar muita atenção aqui. Exemplos:

license=(’MIT’)

ou

license=(’GPL’)

source: aqui fica o caminho para o source do pacote. Como em um pacote svn ou cvs não existe um arquivo de source em si esta variável deve ficar em branco. Exemplo:

source=()

md5sums: Segue o mesmo princípio da variável acima.

md5sums=()

NOTA: Mesmo vazias estas duas variáveis devem estar presentes no PKGBUILD.

provides: Esta variável serve para definir que o “pacote-svn” provê  “pacote” também. O billreminder-svn, por exemplo, provê billreminder. Isto serve para que programas que precisem do billreminder, por exemplo, possam reconhecer que ele está instalado no sistema. Dessa forma dependências quebradas são evitadas. ;)

Exemplo:

provides=(’billreminder’)

conflicts: Aqui você diz quais os pacotes que conflitam com o seu. Um meupacote-svn conflita, por natureza, com meupacote. Exemplo:

conflicts=(’billreminder’)

_svntrunk: Aqui você coloca a url da árvore svn que você quer baixar

Exemplo:

_svntrunk=https://billreminder.svn.sourceforge.net/svnroot/billreminder

_svnmod: Aqui você coloca o diretório onde será armazenado o conteúdo do trunk

Exemplo:

_svnmod=billreminder

NOTA: O _ no início das variáveis indica é um padrão que é usado para indicar que elas são variáveis customizadas, ou seja, que não são parte da estrutura real de um PKGBUILD. Você pode criar quantas quiser, mas só quando for realmente necessário.

build(): Aqui dentro você vai colocar todos os comandos necessários para se compilar o pacote. Geralmente você coloca os mesmos comandos que usaria para compilar o pacote normalmente.

Se você iriar ./configure; make; make install então é isso que você vai colocar dentro da função build(). Se você usa ./arquivo.sh –install-and-do-it-now, então é isso que você deve colocar.

De uma maneira geral o procedimento para svn/cvs/git/bzr é:

  • entrar no diretório src
  • fazer checkout do trunk
  • rodar os comandos de construção (configure, make e make install, por exemplo)
  • remover arquivos temporários

Segue um exemplo de PKGBUILD de um pacote svn:

# Contributor: Hugo Doria <hugodoria@gmail.com>
# Use versionpkg to update.

pkgname=billreminder-svn
pkgver=335
pkgrel=1
pkgdesc=”Small and quick accounting application designed to allow for easy tracking of bills”
arch=(’i686′ ‘x86_64′)
url=”http://billreminder.sourceforge.net/”
depends=(’python-pysqlite’ ‘python-notify’ ‘dbus-python’ ’setuptools’ ‘desktop-file-utils’ ‘pygobject’ ‘pygtk’)
makedepends=(’subversion’)
license=(’MIT’)
provides=(’billreminder’)
conflicts=(’billreminder’)
source=()
md5sums=()

_svntrunk=https://billreminder.svn.sourceforge.net/svnroot/billreminder
_svnmod=billreminder

build() {

# Entra no diretório src. A variável $startdir, como o nome diz,
# sempre indica o caminho inicial do pkgbuild.

cd ${startdir}/src

# Checa se existe o $_svnmod/.svn.
# Se existir ele entrar no diretório e faz o update. Se não, ele faz tudo.

if [ -d ${_svnmod}/.svn ]; then
(cd ${_svnmod} && svn up -r ${pkgver})
else
svn co ${_svntrunk} –config-dir ./ -r ${pkgver} ${_svnmod}
fi

# Mensagem para indicar que o checkout terminou e que vai começar o make

msg “SVN checkout done or server timeout”
msg “Starting make…”

# Faz uma cópia do $svnmod e entra nela. A construção é feita de lá.

cp -r ${_svnmod} ${_svnmod}-build
cd ${_svnmod}-build/trunk

# Roda o comando necessário para se instalar o pacote. Aqui poderia ser, por exemplo: ./configure; #make; make install

python setup.py install –root=${startdir}/pkg

# Remove arquivos temporários

rm -rf $startdir/src/${_svnmod}-build

}

DICAS:

1. Para descobrir o número da revisão do svn (que você pode usar na variável pkgver) faça:

source PKGBUILD
svn info $_svntrunk

2. Sempre use versionpkg ao invés de makepkg para construir pacotes svn e cvs. O versionpkg tenta pegar a revisão mais atual automaticamente.

3. PKGBUILDs de pacotes cvs, git e bzr seguem o mesmo principio. Você pode ver exemplos aqui:

http://wiki.archlinux.org/index.php/Arch_CVS_%26_SVN_PKGBUILD_guidelines

Referências:

5 Responses to “Como criar pacotes para o Arch Linux - parte II - pacotes svn e cvs”

  1. Leandro Says:

    Tem nem o que comentar! =D

    Não se espera menos de um devel, né ?

  2. Rafael Poseddon Says:

    é, lembro quando li em seu Orkut algo parecido com isso:

    ‘Um dia ainda farei parte do Desenvolvimento do Arch’

    algo +/- assim!
    e agora, tá aeee..hehe

    Boooa!!


    Rafa F.

  3. Douglas Says:

    É licença (com Ç) e não “licensa”.

  4. Julião Says:

    Hugo, você sabe se há como adicionar mirrors no PKGBUILD de forma que quando é feito o makepkg ele use outro mirror automaticamente caso o principal falhe?

    Se não há (eu não encontrei pelo menos), sabe se há planos de adicionar essa preciosa funcionalidade?

    Abraços, parabéns pelo artigo.

  5. AUR - Arch Linux User Repository | Hugo Doria Says:

    [...] bem, gostou tanto da ferramenta que começou a construir seus próprios pacotes (aprenda aqui e aqui) e agora quer disponibilizá-los no AUR. Como fazer? [...]

Leave a Reply