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.

, , , , , , , ,

  1. #1 por Luis Lavena - 29 de dezembro de 2008 em 00:38

  2. #2 por Henrique Bastos - 29 de dezembro de 2008 em 02:52

    Hey Luis!

    Didn’t know rake-compiler. Seems that it goes a lot further.

    I’ll try it out. Thank you.

(não será publicado)