Friday, February 28, 2014

Tutorial: Qt 5.2 no RaspberryPi (Outdated)


Depois de apanhar um bocado, consegui fazer um programa escrito em Qt5 funcionar no Raspberry Pi com aceleração de hardware via OpenGLES 2.0. A principal dificuldade é que não há pacotes prontos no repositório oficial do Raspbian Wheezy. O Arch Linux possui uma versão recente do Qt5.2 em seus repositórios mas não foi compilada especificamente pro Pi, então faltam os plugins de plataforma da QPA. Mas tem várias alternativas pra rodarmos o Qt5 acelerado.

Do jeito mais simples pro mais complicado, podemos:
  • Utilizar uma tarball pré-compilada, fornecida por Heater, um membro da comunidade;
  • Utilizar o repositório do Sebastien Noel;
  • Atualizar a distribuição Raspbian para a versão Jessie; ou
  • Compilar o Qt5 nós mesmos.
Compilar o Qt5 para o Pi requer que compilemos no próprio dispositivo, ou a utlização de uma cadeia de ferramentas de compilação cruzada (cross-compiler), o que é bem complicado. Compilar o Qt5 no Pi requer mais de dois dias, um swapfile grande, e um hd externo, além de muita paciência. Então descartaremos essa possibilidade.

Importante: todos os comandos listados a seguir devem ser executados como root (use sudo -i para entrar em modo root). Algumas operações requerem espaço considerável no disco, então recomenda-se um cartão SD de 8GB. Fique atento ao espaço disponível em / com o comando df. Não se esqueça de expandir o sistema de arquivos na configuração inicial!

Utilizando a tarball do Heater

Existe um pacote do Qt5.2 pré-compilado fornecido por um membro da comunidade. Mais detalhes sobre o pacote podem ser encontrados nesse post. O processo de instalação é muito simples, apenas extrair o pacote, so é preciso configurar algumas variáveis de ambiente depois.

Vamos baixar o arquivo, extraí-lo, e remover o pacote para economizar espaço:
 wget https://dl.dropboxusercontent.com/u/81267937/qt5.2-rpi.tgz
 tar xvzf qt5.2-rpi.tgz
 rm qt5.2-rpi.tgz

E mover o diretório base do Qt para /opt, criando os symlinks necessários em /usr/local.
 mv qt5 /opt
 ln -s /opt/qt5 /usr/local/qt5

Agora precisamos configurar as variáveis de ambiente. Fazemos isso de forma sistêmica editando /etc/profile. Adicione essas linhas ao final do arquivo:
 export PATH=${PATH}:/usr/local/qt5/bin
 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/qt5/lib
 export QT_PLUGIN_PATH=/usr/local/qt5/plugins

Tudo deve estar pronto! Reinicie o Pi para colocar as novas configurações em vigor.

Utilizar o repositório do Sebastien Noel (twolife.be)

Para facilitar a vida, recomendo utilizar a imagem que disponibilizei aqui. Estará desatualizada assim que o Rapbian Jessie sair oficialmente, mas pelo que pude testar é estável e funciona muito bem.

dist-upgrade para o Raspbian Jessie 

Essa forma pode parecer mais simples, mas como é um repositório de testes não há garantias de estabilidade, o update demora bastante e provavelmente vai remover pacotes que talvez você utilize. Recomenda-se fazer um backup antes de atualizar a distribuição, sempre! Nossa sorte é que o Pi não pode ser brickado, basta flashear o cartão SD novamente, mas é trabalhoso reconfigurar todo o sistema.

Primeiro, atualizamos o sistema de forma normal, com
 apt-get update && apt-get upgrade  

Em seguida, vamos atualizar a lista de repositórios. Edite o arquivo /etc/apt/sources.list e substitua todas as ocorrências de wheezy por jessie. E  atualizamos a distibuição:
 apt-get update && apt-get upgrade && apt-get dist-upgrade

Isso deve demorar. E de vez em quando apt engatilha um pedido de confirmação, então fique atento! Quanto tudo estiver pronto, reinicie o Pi (comando reboot). Se não aparecer nenhum problema, já podemos instalar o Qt5! Assim:
 apt-get install qt5-base qtdeclarative5-*

Compilando e executando um programa

Agora que já temos uma build do Qt em mãos, podemos compilar e testar um programa! Uma boa alternativa é a demo Qt5 Cinematic Experience do grupo QUIt Coding, que demostra várias capacidades da biblioteca e ainda tem uma versão otimizada para o RaspberryPi! Para obter o código da aplicação:
 wget http://quitcoding.com/download/Qt5_CinematicExperience_rpi_1.0.tgz
 tar xvzf Qt5_CinematicExperience_rpi_1.0.tgz
 rm Qt5_CinematicExperience_rpi_1.0.tgz

Esse exemplo não pode ser compilado out-of-source, pela versão dos arquivos de projeto. Então o qmake é executado na mesma pasta:
 cd Qt5_CinematicExperience_rpi_1.0
 qmake
 make

Se tudo correr bem, já podemos rodar a demo. Do console de texto, podemos utilizar o plugin de plataforma eglfs (EGL Fullscreen) para executar o programa direto do framebuffer em tela cheia:
 ./Qt5_CinematicExperience -platform eglfs

Só nos resta aproveitar a performance nativa do Qt5 e a excelente GPU do Raspberry. Boa programação!
Um pouco difícil de ver pela claridade, mas esse deve ser o resultado final...