Como construir um pacote Debian / Ubuntu a partir da fonte?

116

Eu tenho o código-fonte de um programa (retirado de cvs / svn / git / ...) e gostaria de construir um pacote Debian / Ubuntu para ele. O pacote está presente nos repositórios, mas:

  • É uma versão mais antiga (sem os recursos de que preciso)
  • Preciso de opções de compilação ligeiramente diferentes do padrão.

Qual é a maneira mais fácil de fazer isso? Estou preocupado com algumas coisas

  • Como posso verificar se listei todas as dependências corretamente? (Posso obter algumas dicas olhando de que dependia a versão anterior, mas podem ter sido adicionadas novas dependências.)
  • Como posso evitar que o sistema de atualização instale a versão anterior no repo em uma atualização?
  • Como posso evitar que o sistema instale uma versão mais recente (quando ela sair), sobrescrevendo meu pacote personalizado?
Ryszard Szopa
fonte
Similar em AU: askubuntu.com/questions/28372/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

78

você pode usar o pacote especial "checkinstall" para todos os pacotes que ainda não estão no debian / ubuntu.

Você pode usar "uupdate" ( apt-get install devscripts) para construir um pacote a partir da fonte com fontes debian existentes:

Exemplo para libdrm2:

apt-get build-dep libdrm2
apt-get source libdrm2
cd libdrm-2.3.1
uupdate ~/Downloads/libdrm-2.4.1.tar.gz
cd ../libdrm-2.4.1
dpkg-buildpackage -us -uc -nc
Paweł Gościcki
fonte
Obrigado! Eu acabei de usar isso para portar o Subversion 1.6.6 para uma instalação do Ubuntu que tem apenas 1.6.5 como sua versão mais recente disponível, e funcionou perfeitamente. Me salvou algumas horas de mexer! :)
Carlos Villela
Você poderia dar um pouco mais de contexto sobre esses comandos? Onde fica libdrm-2.3.1exatamente? Também de onde libdrm-2.4.1.tar.gzveio (minha suposição inicial é que é o binário compilado do aplicativo que queremos empacotar em um deb, mas substituindo a versão existente, correto?)
wheeler
Se você obtiver o erro You must put some 'source' URIs in your sources.list, descomente as linhas deb-src em seu/etc/apt/sources.list
Christian
27

Primeiro, a pergunta do título: Assumindo que o diretório debian já está lá, esteja no diretório fonte (o diretório que contém o diretório debian) e execute dpkg-buildpackage. Gosto de executá-lo com estas opções:

dpkg-buildpackage -us -uc -nc

o que significa não assine o resultado e não limpe.

Como posso verificar se listei todas as dependências corretamente?

Obter as dependências é uma arte negra. A maneira "oficial" é verificar se o pacote é compilado apenas com o sistema básico, os pacotes "essenciais para compilar" e as dependências de compilação que você especificou. Não sei uma resposta geral para dependências regulares, apenas avance :)

Como posso evitar que o sistema de atualização instale a versão anterior no repo em uma atualização? Como posso evitar que o sistema instale uma versão mais recente (quando ela sair), sobrescrevendo meu pacote personalizado?

Meu conhecimento pode estar desatualizado neste, mas para abordar ambos: Use dpkg --set-selections. Supondo que nullidentd seja o pacote que você deseja manter, execute como root

echo 'nullidentd hold' | dpkg --set-selections

Como alternativa, já que você está compilando a partir do código-fonte, você pode usar uma época para definir o número da versão artificialmente alto e nunca mais ser incomodado. Para usar uma época, adicione uma nova entrada ao arquivo debian / changelog e coloque 99: na frente do número da versão. Dado meu exemplo nullidentd, a primeira linha do seu changelog atualizado seria:

nullidentd (99:1.0-4) unstable; urgency=low

O link do Bernard é bom, especialmente se você tiver que criar o diretório debian - também é útil a referência de desenvolvedores e a página de recursos gerais . O link de Adam também parece bom, mas não estou familiarizado com ele.

Daniel Bungert
fonte
1
"dpkg --set-selections" ainda funciona, mas um método melhor hoje em dia seria "aptitude hold nullidentd".
Mark Baker,
6

Para o que você quer fazer, você provavelmente quer usar o código fonte debian diff, então seu pacote é semelhante ao oficial, exceto pela versão original usada. Você pode baixar o código-fonte diff de packages.debian.org , ou pode obtê-lo junto com o .dsc e o arquivo-fonte original usando "apt-get source".

Então você descompacta sua nova versão do código fonte, muda para aquele diretório e aplica o diff que você baixou fazendo

zcat ~/downloaded.diff.gz | patch -p1
chmod +x debian/rules

Em seguida, faça as alterações que deseja para as opções de compilação e construa o pacote fazendo

dpkg-buildpackage -rfakeroot -us -uc
Mark Baker
fonte
3
  • coloque o diretório "debian" do pacote original no seu diretório de origem
  • use " dch " para atualizar a versão do pacote
  • use "debuild" para construir o pacote
zowers
fonte
2

Eu acredito que este é o pacote Debian 'bíblia'.

Bem, é o guia do novo mantenedor do Debian, então muitos deles não serão aplicáveis, mas eles cobrem o que vai aonde.

Bernard
fonte
1

Aqui está um tutorial para construir um pacote Debian.

Basicamente, você precisa:

  1. Configure sua estrutura de pastas
  2. Crie um arquivo de controle
  3. Opcionalmente, crie scripts postinst ou prerm
  4. Execute dpkg-deb

Normalmente faço tudo isso no meu Makefile, então posso apenas digitar make para cuspir o binário e empacotá-lo de uma vez.

Adam Pierce
fonte
1

Como posso verificar se listei todas as dependências corretamente?

Esta pbuilderé uma excelente ferramenta para verificar as dependências de construção e dependências configurando um sistema de base limpo em um ambiente chroot. Compilando o pacote dentro do pbuilder, você pode facilmente verificar as dependências de construção e, testando-o em um ambiente pbuilder, você pode verificar as dependências.

thiton
fonte
1

Se você deseja uma maneira rápida e suja de instalar as dependências de compilação, use:

apt-get build-dep

Isso instala as dependências. Você precisa de linhas de fontes em seu sources.list para isso:

deb-src http://ftp.nl.debian.org/debian/ squeeze-updates main contrib non-free

Se você está fazendo backport de pacotes de teste para estável, saiba que as dependências podem ter mudado. O comando apt-get build-deb instala dependências para os pacotes fonte em seu repositório atual.

Mas é claro, dpkg-buildpackage -us -uc mostrará a você todas as dependências desinstaladas.

Se você quiser compilar com mais frequência, use o cowbuilder.

apt-get install cowbuilder

Em seguida, crie uma área de construção:

sudo DIST = squeeze ARCH = amd64 cowbuilder --create

Em seguida, compile um pacote de origem:

apt-get source cowsay

# do your magic editing
dpkg-source -b cowsay-3.03+dfsg1              # build the new source packages
cowbuilder --build cowsay_3.03+dfsg1-2.dsc    # build the packages from source

Observe onde o cowbuilder coloca o pacote resultante.

Boa sorte!

Allard Hoeve
fonte