Cross compile Raspberry Pi – Gere binários em qualquer lugar!

Compilação nativa do Qt no Raspberry é uma roleta russa. Passei 4 dias tentando uma configuração específica. Na última tentativa, um erro ocorreu após 14 horas e 40 minutos de compilação. Óbvio que não é viável compilar diretamente no Raspberrry quando se tratar de algo de tamanha complexidade. Cross compile é sem dúvidas a melhor opção.

Ao final, não levei mais de 10 minutos para ter o Qt compilado utilizando 6 dos meus 8 processadores, mas ainda assim não consegui a compilação desejada. Enfim, continua sendo útil. Vamos ao processo, para Raspbian 32bits.

Do mesmo modo do artigo anterior, essa compilação é para embedded, considerando a ausência de servidor gráfico e desktop. Compilando dessa maneira, você terá acesso ao framebuffer e também poderá acessar diretamente a aplicação por VNC.

Estrutura para o cross compile

Primeiro devemos ter uma estrutura para o cross compile. Nem adianta muito eu definir as dependências, pois certamente você pode ter outras diferentes. Por essa razão, recomendo apenas que siga os passos e supra as dependências conforme elas forem aparecendo.

Crie o diretório onde tudo acontecerá. Como precisei escrever em outra partição, tenho um diretório com meu nome na raiz do sistema. Crie em seu home, em uma mídia externa ou onde desejar, só não se esqueça de relacionar os paths adequadamente.

mkdir /djames/qt-src
cd /djames/qt-src

Crie o sysroot

Nem tente fazer com sshfs, eu tentei por diversas vezes, mas devido à necessidade de modificar alguns links, acaba sendo melhor evitar o problema com o sistema no Raspberry.

mkdir sysroot/{lib,usr,opt} -p
rsync -avz pi@devel1:/lib sysroot
rsync -avz pi@devel1:/usr/include sysroot/usr
rsync -avz pi@devel1:/usr/lib sysroot/usr
rsync -avz pi@devel1:/opt/vc sysroot/opt

Aí alguém fez de boa vontade um singelo script Python para fazer os devidos relacionamentos dos links no sysroot. Baixe-o e execute-o.

wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
chmod 700 sysroot-relativelinks.py
python3 sysroot-relativelinks.py sysroot

Toolchains e Qt source

Agora precisamos baixar a toolchain e os fontes do Qt para compilação. Recomendo fortemente que use a versão desse artigo; comecei pelo 5.13.1 e fui baixando até a 5.9, então desisti e fui subindo para as mais atuais com o novo procedimento (esse que estou descrevendo aqui).

git clone https://github.com/raspberrypi/tools
git clone git://code.qt.io/qt/qtbase.git -b 5.12.1

Após baixado, será necessário fazer umas mdificações no qmake.conf do mkspecs da respectiva plataforma. O arquivo a editar e o procedimento é o descrito a seguir, mas não erre dentro do editor Vi senão você vai acabar tendo que reiniciar o Raspberry desligando na energia (sério). Se já tiver experiência com Vi, então será tranquilo.

vi qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf

#E estando com o arquivo editado, faça como abaixo
:1,$s/-lGLESv2/-lbrcmGLESv2/g
:1,$s/-lEGL/ok/g
:wq

Compilar o Qt

Agora entre no diretório criado no download dos fontes (qtbase) e já esteja como root. Não ache que será transparente, já estar como root evitará digitar “sudo” toda a hora.

sudo su
cd qtbase
./configure -no-opengl -release -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=/djames/qt-src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot /djames/qt-src/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix /djames/qt-src/qt5pi -hostprefix /djames/qt5 -no-use-gold-linker -linuxfb -v
make -j6 #troque pelo numero de processadores que deseja dedicar
make install

Instalar o Qt

Compilando dessa forma traz uma vantagem; além de ter o Qt para o Raspberry, também haverá uma cópia no seu computador X86, que permitirá gerar o binário e enviar o resultado pronto para execução no Raspberry.

Quanto fizer o make install, será criado (um nível abaixo do qtbase) o diretório qt5pi. Já para o Qt cross compilado a manter no sistema, escolhi /djames/qt5.

O que devemos copiar para o Raspberry é o qt5pi. Para isso, precisamos criar previamente a estrutura de diretórios necessária e então copiar com rsync. Do seu computador mesmo, execute remotamente os comandos no Raspberry assim:

ssh pi@devel1 "sudo mkdir /usr/local/qt5pi"
ssh pi@devel1 "sudo chown pi:pi /usr/local/qt5pi"
rsync -avz qt5pi pi@devel1:/usr/local

O último comando faz a cópia.

Após esse processo, já pode se divertir programando em Qt para o Raspberry. Se precisar de mais parâmetros do QPA (sugiro que leia o artigo anterior), pode dar uma olhada na documentação nesse link.

Instalar o Qt via apt-get no Raspberry

Sim, é possível. Eu fiz isso em um dos sistemas, consegui algumas plataformas interessantes: eglfs, linuxfb, minimal, minimalegl, offscreen, xcb.

Considerando o cross compile, tenho ainda a opção de VNC, portanto, estou plenamente satisfeito. Agora é só chegar o material do Baú da Eletrônica pra começar a diversão e os vídeos!

Fazendo a conexão ssh com a flag -X, pude executar remotamente um programa de teste usando a plataforma xcb:

cross compile Raspberry Pi

É a forma menos dolorida de ter o Qt para desenvolvimento, mas a grande vantagem de cross compile é que fica fácil enviar só o programa e suas dependências para o Raspberry, de forma que seu cliente não terá um ambiente de desenvolvimento instalado no sistema de produção.

Por enquanto é isso, mas em breve trago uma novidade bacana do nosso parceiro Baú da Eletrônica, que está dando 30% de desconto em todo o site (exceto ferramentas) do dia 13 ao dia 20 de Setembro de 2019 (data para constar no histórico).

O material está recém chegou, farei um vídeo um pouco diferente do padrão. Estou bastante apreensivo quanto a forma que será recebido pelos inscritos no canal, mas se você é do tipo curioso, se inscreva em nosso canal DobitAoByteBrasil no Youtube e clique no sininho para receber notificações. No mínimo lhe darei argumento para fazer uma bela crítica! – Mas se gostar, deixe seu like!

Até a próxima!

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

2 comentários em “Cross compile Raspberry Pi – Gere binários em qualquer lugar!

Fechado para comentários.