Como cross-compilar o ruby e suas extensões para o windows a partir de um unix

Enquanto eu desenvolvia a extensão Orca-Ruby para controlar a API Orca do PowerBuilder a partir do Ruby e montar um build system customizado para as necessidades da Myfreecomm, me deparei com a capciosa tarefa de cross-compilar o Ruby para o Windows.
Cross-compilar o Ruby sem as extensões, até que não é tão complicado, pois seu script de compilação possui algumas facilidades para realizar esta tarefa. Mas para as nossas ambições, as extensões eram importantes.
O problema acontece porque os scripts de compilação do ruby, contam com o próprio ruby recém compilado para compilar as extensões. E isto não pode acontecer normalmente quando se trata de cross-compilação, pois o ruby recém compilado não funciona no sistema que o compilou.
Para contornar este problema, é preciso fazer com que o script que compila as extensões funcione normalmente utilizando o ruby instalado no host, que no meu caso é um OS X.
A idéia é simples, mas alguns detalhes no script de compilação do ruby impedem que isso ocorra da maneira fácil. Por isso alguns ajustes são necessários, e para automatizar o processo e impactar o mínimo possível no código fonte do ruby, resolvi criar um Makefile para realizar a tarefa.
Para ser mais objetivo e evitar detalhar o Makefile no post, criei um projeto no github para simplificar. Clone o repositório:
>git clone git://github.com/henriquebastos/crosscompileruby.git
Pode ser necessário editar o Makefile e definir os valores das variáveis HOST e BUILD para refletir o seu ambiente.
Para saber exatamente quais comandos serão executados e entender os ajustes feitos, você pode rodar o comando make -n (dry-run). Para cross-compilar o ruby execute o comando make. Para “instalar” o ruby, ou seja, criar um diretório que poderá ser copiado para uma máquina windows, execute make install.
Lembrando que para cross-compilar o ruby, você precisará do compilador Mingw32. Quem usa Mac pode instalar o pacote do Macports:
>sudo port install i386-mingw32-gcc
Caso alguém tenha qualquer dúvida ou encontre algum bug, é só deixar um recado ou acertar o código.
Abraços.

COMPARTILHE ESTE ARTIGO

Share on facebook
Share on linkedin
Share on twitter
Share on email

3 respostas

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *