Problemas ao empacotar um .deb de autotools. (checkinstall, debhelper,…)

2

Atualmente, estou construindo um grande projeto que contém fontes escritas em poucos idiomas, como C, C ++ & Python. Eu recentemente consegui (dolorosamente) lidar com autotools para fazer uma instalação adequada. O próximo passo é criar .deb porque o nosso projeto deve ser executado no debian stretch.

Eu tentei várias maneiras de fazer isso, mas não consigo fazer isso funcionar da maneira correta.

Árvore .deb gerada pelo checkinstall:

    unpack/
├── etc
│   └── nina
│       ├── auto_blacklist.txt
│       ├── blacklist.txt
│       ├── conf
│       ├── keywords.txt
│       ├── rubbish_links.txt
│       └── whitelist.txt
└── usr
    ├── local
    │   ├── bin
    │   │   ├── geckodriver
    │   │   └── nina
    │   ├── lib
    │   │   └── python2.7
    │   │       └── dist-packages
    │   │           ├── nina.py
    │   │           ├── nina_py_installed_files.txt
    │   │           ├── Uinput_wrapping_module-2.0.egg-info
    │   │           └── uinput_wrapping_module.so
    │   └── share
    │       └── man
    │           └── man1
    │               └── nina.1.gz
    └── share
        └── doc
            └── nina
                ├── COPYING
                ├── doc
                │   ├── Doxyfile
                │   └── nina.1
                ├── README
                └── README.md

Árvore .deb gerada pelo debhelper (v9):

unpack/
├── etc
│   └── nina
│       ├── auto_blacklist.txt
│       ├── blacklist.txt
│       ├── conf
│       ├── keywords.txt
│       ├── rubbish_links.txt
│       └── whitelist.txt
└── usr
    ├── bin
    │   └── nina
    ├── lib
    │   └── python2.7
    │       └── dist-packages
    │           └── nina.py
    └── share
        ├── doc
        │   └── nina
        │       ├── changelog.Debian.gz
        │       └── copyright
        └── man
            └── man1
                └── nina.1.gz

Como você pode ver, não é exatamente o mesmo (sic). Estou mais ou menos entendendo o que o checkinstall faz: ele executa comandos make install e apenas obtém saídas de arquivos para colocá-lo onde está instalando na máquina MY . debhelper parece ser uma ferramenta mais adequada aqui. (instalando em /usr/lib e não /usr/local/lib , nos permite assinar pacotes e assim por diante) e eu prefiro usá-lo, mas ele não está funcionando como esperado.

E em enorme , mais no modo debhelper, é que ele está lidando com dependências especificadas em debian / control e outras coisas. Mas o checkinstall não funciona.

O que o debhelper não está fazendo:

  • Obtendo alguns binários (geckodriver) da fonte da internet e colocando-os em / usr / bin

  • instalando um módulo python caseiro

Essas ações são realizadas no meu Makefile.am, sobrescrevendo os métodos install-exec-local: (& resp. uninstall-local: ) e executando alguns comandos bash.

---

Então, minha pergunta é: como eu poderia manter as melhores partes dessas duas formas de embalagem para torná-las "perfeitas"?

    
por Neah-Ko 09.03.2017 / 08:48

2 respostas

2

O download de coisas da Internet é algo que uma compilação do pacote Debian não deveria estar fazendo. Se você usar algum ajudante "build in clean chroot", pode nem ser capaz de fazê-lo. No entanto, dpkg-buildpackage simples deve ser capaz de fazer isso. Se o seu sistema de construção automática fizer a coisa certa, então nada deve ser necessário; caso contrário, você precisará adicionar os comandos necessários a um comando override_dh_foo (consulte 'man dh' on this).

Para módulos Python, o que você precisa fazer é instalar os arquivos .py do seu sistema de compilação, também, respeitando $ DESTDIR. Se você fizer isso, o debhelper no modo dh deve ser apenas DTRT.

Se nada disso funcionou, por favor, produza uma versão mínima do pacote que exibe o problema; caso contrário, isso é um problema de bola de cristal.

    
por 09.03.2017 / 10:22
0

Eu reconsiderei meu Makefile.am graças a você. E finalmente conseguiu algo.

  • Como obter o geckodriver

Estou executando o script para obtê-lo em ./configure step e colocando-o como uma dependência de arquivo no pacote .deb, supondo que esteja no sistema de empacotamento da seguinte forma:

bindeptsdir = \
    $(prefix)/bin
bindepts_DATA = \
    /usr/local/bin/geckodriver
  • Instalando o módulo python

$ (DESTDIR) foi de fato a solução aqui, agora meu módulo python é instalado assim:

$(PYTHON) setup.py install \
    --root $(DESTDIR)

E ele funciona bem aparte do fato de que eu devo colocar isso no meu debian / rules: override_dh_usrlocal: else ele está gritando comigo porque eu estou instalando arquivos em /usr/local

Eu prefiro não, mas python está lidando com a instalação sozinho, e não consigo especificar o caminho da instalação. A outra solução foi especificar --prefix $(DESTDIR)$(prefix) em vez de --root... , mas está instalando arquivos em /usr/lib/python2.7/site-packages , que não está em pythonpath.

---

O resultado final de problemas do python funciona bem com o dpkg-buildpackage.

    
por 13.03.2017 / 16:34