Compilação cruzada

Definição

A compilação cruzada [1] é o processo de compilar um executável em uma plataforma diferente daquela para a qual ele se destina. A seguir, veremos como usar o ambiente Linux para compilar um programa que rode no Windows, Mac ou qualquer outra plataforma compatível com o MAME. Nas instruções a seguir, configuraremos um ambiente de compilação cruzada no Linux para compilar uma versão do MAME voltada para o Microsoft Windows. Apesar de o processo a seguir ser voltado para o Windows, ele pode servir também de modelo para compilar o MAME em outras plataformas compatíveis.

Vantagens

Dentre as várias vantagens é possível citar as mais relevantes:

  • Transformar o código-fonte em linguagem de máquina consome muitos recursos, e a plataforma de destino geralmente não tem todos os recursos disponíveis no computador usado para compilar, como poder de processamento e memória;

  • Ainda que o mesmo computador com dois sistemas operacionais instalados, como Linux e Windows, seja utilizado, o tempo gasto para compilar uma versão do MAME para Linux é muito menor do que para compilar a mesma versão no Windows. Compilar uma versão do MAME para o Linux leva cerca de 30 minutos, podendo variar para mais ou para menos, dependendo do poder de processamento do computador. Compilando o mesmo código-fonte no mesmo hardware, com o Windows, usando a mesma versão do GCC e G++, a tarefa pode levar algumas horas [2].

  • Com a compilação cruzada, o tempo final de compilação é aproximadamente o mesmo da versão nativa do Linux, economizando tempo e recursos. Manter o processador a 100% compilando o código-fonte por cerca de 30 minutos é uma coisa; fazer exatamente a mesma coisa por algumas horas a mais é uma perda de tempo e pode encarecer a conta de energia no final do mês.

  • Assim, o principal motivo para adotar a compilação cruzada é a economia de tempo e recursos.

Preparando o ambiente

Neste exemplo, a plataforma utilizada foi o Debian, mas pode ser qualquer outra. A vantagem do Debian é que se trata de uma distribuição muito estável do sistema operacional Linux. Por esse motivo, o Debian não utiliza a última versão de nenhum software, como o GCC, por exemplo. Geralmente, ele fica algumas versões atrás do último lançamento encontrado na internet, pois o foco é a estabilidade, e não empacotar a última versão de qualquer software.

Para compilar binários voltados ao sistema Windows, precisamos instalar os pacotes abaixo. Para outros sistemas operacionais ou dispositivos, o procedimento será semelhante, desde que sejam escolhidos os conjuntos de pacotes apropriados para a plataforma desejada.

Debian e Ubuntu

O comando a seguir instalara ferramentas adicionais, além das descritas na seção Debian e Ubuntu (incluindo dispositivos Raspberry Pi e ODROID). Note que o comando a seguir é formado por uma linha só:

sudo apt install g++-mingw-w64-x86-64-posix
gcc-mingw-w64-x86-64-posix
gcc-mingw-w64-x86-64-posix-runtime
gobjc++-mingw-w64-x86-64-posix
gobjc-mingw-w64-x86-64-posix
binutils-mingw-w64-x86-64
mingw-w64-common mingw-w64-tools mingw-w64-x86-64-dev

Como estamos fazendo uma compilação entre plataformas, é necessário usar a versão POSIX para o gcc, ar e g++. O POSIX vem de Interface Portável entre Sistemas Operacionais, regida pela norma IEEE 1003 [3]. Para configurar os atalhos do gcc, ar e g++, faça os comandos a seguir no terminal, note que cada comando sudo ocupa uma linha inteira:

sudo ln -s /usr/bin/x86_64-w64-mingw32-g++-posix /usr/x86_64-w64-mingw32/bin/x86_64-w64-mingw32-g++
sudo ln -s /usr/bin/x86_64-w64-mingw32-gcc-ar-posix /usr/x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc-ar
sudo ln -s /usr/bin/x86_64-w64-mingw32-gcc-posix /usr/x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc

Aviso

Não é mais possível compilar uma versão de 32 bits do MAME.

Fedora Linux

Instale os seguintes pacotes:

sudo dnf install mingw64-binutils mingw64-cpp mingw64-gcc mingw64-gcc-c++ mingw64-gcc-objc mingw64-gcc-objc++  mingw64-fontconfig mingw64-win-iconv mingw64-winpthreads mingw64-winpthreads-static

Seguido dos comandos abaixo:

sudo ln -s /usr/bin/x86_64-w64-mingw32-g++ /usr/x86_64-w64-mingw32/bin/x86_64-w64-mingw32-g++
sudo ln -s /usr/bin/x86_64-w64-mingw32-gcc-ar /usr/x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc-ar
sudo ln -s /usr/bin/x86_64-w64-mingw32-gcc /usr/x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc

Configurando as variáveis de ambiente

A variável MINGW64 é necessária para que os scripts utilizados na compilação do MAME saibam onde encontrá-los. O comando abaixo não deve ser executado com o sudo, pois nosso objetivo é aplicá-lo no ambiente da nossa conta comum, e não em uma conta com privilégios de administrador:

echo "export MINGW64="/usr/x86_64-w64-mingw32"" >> ~/.bashrc

Recarregue as configurações do seu terminal com o comando . .bashrc ou saia e retorne à sua conta. É necessário verificar a configuração para ter certeza de que a variável esteja definida corretamente no ambiente, executando o comando a seguir:

$ echo $MINGW64
/usr/x86_64-w64-mingw32

Se o seu ambiente não retornar nada, verifique se as instruções acima foram seguidas corretamente. Se a sua distribuição Linux — ou outra distribuição — utilizar o arquivo .bashrc, verifique no manual da sua distribuição de qual arquivo de configuração ela utiliza para armazenar as variáveis do ambiente e onde ele se localiza.

Compilando o MAME para Windows no Linux

Para iniciar a compilação do MAME para o Windows, execute o comando a seguir, lembrando que ele deve ser executado dentro da pasta raiz [4] do código-fonte do MAME:

make clean && make TARGETOS=windows CROSS_BUILD=1 SYMBOLS=1 SYMLEVEL=1 STRIP_SYMBOLS=1 SSE2=1 PTR64=1

Assim como na compilação nativa, é possível adicionar a opção -j no final do comando para acelerar o processo de compilação usando os núcleos do seu processador, conforme explicado com mais detalhes no capítulo Compilando o MAME:

make clean && make TARGETOS=windows CROSS_BUILD=1 SYMBOLS=1 SYMLEVEL=1 STRIP_SYMBOLS=1 SSE2=1 PTR64=1 -j5

Compilando o MAME SDL para Windows no Linux

Para compilar uma versão SDL do MAME instale os pacotes descritos no capítulo Debian e Ubuntu (incluindo dispositivos Raspberry Pi e ODROID).

Debian e Ubuntu

Infelizmente, será necessário compilar esses pacotes manualmente, e não abordaremos esse assunto aqui. Porém, lembre-se de que é possível compilar essa versão do MAME SDL usando o MINGW no Windows!

Adicione a opção OSD=sdl na sua linha de comando, exemplo:

make clean && make OSD=sdl TARGETOS=windows CROSS_BUILD=1 SYMBOLS=1 SYMLEVEL=1 STRIP_SYMBOLS=1 SSE2=1 -j5

Ao final da compilação será gerado um arquivo sdlmame.exe.

Fedora Linux

Instale os pacotes a seguir:

sudo dnf install mingw64-SDL2_ttf mingw64-SDL2 mingw64-SDL2-static

Use a opção OSD=sdl como mostra o exemplo a seguir:

make clean && make TARGETOS=windows CROSS_BUILD=1 OSD=sdl SYMBOLS=1 SYMLEVEL=1 STRIP_SYMBOLS=1 SSE2=1 PTR64=1 -j5

O processo de compilação será concluído com a criação de um arquivo chamado sdlmame.exe.