Como fazer um snap de código Python e Gtk3 funcionar no Ubuntu no Wayland

Se programarem em Python, certamente mais tarde ou mais cedo vão querer que o vosso programa seja distribuido, não apenas para os amigos, mas para toda a gente. Uma das formas mais simples de o distribuir é torna-lo num snap. Os snaps são uma tecnologia de contentores que isola num único ficheiro o nosso programa e tudo o que é necessário para o correr em qualquer distribuição Linux que suporte snaps. Podem obter mais informação sobre como fazer snaps (e outras coisas) nestes tutoriais do Ubuntu.

Se quiserem dar janelas e botões ao vosso programa Python vão ter que optar por uma GUI, ou interface gráfico de utilizador. O Python por defeito usa o tkinter que é uma biblioteca gráfica interessante e simples de usar, mas se querem ter o aspecto das janelas do Gnome na vossa aplicação, a opção natural é o Gtk, e na sua versão moderna, o Gtk3.

Embora seja relativamente simples fazer um snap para uma aplicação Python, pois existe um plugin python que ajuda, já o Gtk3 exige que, pelo menos, se incluam nas dependências do snap alguns pacotes e um desktop helper, o desktop-gtk3:


...
parts:
yourapp:
source: .
source-type: git
# See 'snapcraft plugins'
plugin: python
stage-packages:
- python3-gi
- libcanberra-gtk3-module
- gir1.2-gtk-3.0
after: [desktop-gtk3]

Acabado o código do snap, que no código acima não está completo, corremos o snapcraft e após o processo de building, somos presenteados com um snap. Se o experimentarmos no Ubuntu 16.04 ele corre sem problemas, e até no Ubuntu 17.10 em Xorg. Mas o Ubuntu 17.10 vem com o Wayland por defeito, e qual não é o nosso espanto quando depois de instalarmos o snap percebemos que ele não corre no Wayland. Ou melhor, pode até correr uma parte que foi o que me aconteceu a mim, e depois crasha com uma falha de segmentação.

Mas mais, podem, antes disso, durante a construção do snap ter um outro problema: version `GLIBC_2.25' not found e se o tiverem ficam já a saber que têm de criar o snap no Ubuntu 16.04 por uma questão de retro-compatibilidade na compilação dos ficheiro binários.

Mas usar o Ubuntu 16.04 não vai ser suficiente para resolver a segfault. Depois de muitas horas de frustração e diálogo com outros fabricadores de snaps (Daniel Llewellyn e Ken VanDine) no forum snapcraft, foi-me dada a explicação de que a versão do wayland dos pacotes para Ubuntu 16.04 entra em conflito com versões mais recentes, que é o que temos, na 17.10, e daí a falha de segmentação.

A única solução (provavelmente temporária) para esta situação é recorrer à construção manual de um snap dentro de um contentor LXD ou de uma máquina virtual adicionando primeiro ao contentor a PPA do Gnome 3.26.

Ou seja, ao correr o contentor, fazer:

add-apt-repository -y ppa:ubuntu-desktop/gnome-3-26
apt-get update && apt-get upgrade -y

e em seguida podem mudar do utilizador root no contentor para o utilizador sem previlégios com su ubuntu, e fazer clone ao repositório dentro do contentor. Finalmente para termos o snap é necessário correr o snapcraft no contentor.

E pronto,  vamos ter de fazer o upload do snap para a loja manualmente em vez de usar o snapcraft.io , mas pelo menos temos um snap de Python e Gtk3 que funciona no wayland no Ubuntu 17.10.

Anúncios

One thought on “Como fazer um snap de código Python e Gtk3 funcionar no Ubuntu no Wayland

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s