<p> Esse tutorial explica como criar um toolchain com GCC+Newlib para ser usado na compilação de programas usando a arquitetura ARM, tornando assim possível a compilação de programas para um grande número de CPUs com arquitetura ARM. Você precisará desse recurso se pretende compilar eLua para as CPUs com arquitetura ARM. Esse tutorial é semelhante a muitos outros encontrados na Internet (particularmente o <ahref="http://www.gnuarm.com/">gnuarm</a>, que serviu de base para esse tutorial), no entanto, este possui um maior detalhamento e mostra alguns "dicas" que você poderá utilizar quando estiver compilando a Newlib.</p>
<p><strong>AVISO: Eu não sou um especialista no processo de montagem de CGC/newlib/binutils. Tenho certeza de que existem melhores formas de realizar o que estou descrevendo aqui, no entanto, apresento apenas uma maneira rápida de construir um toolchain, não tenho nenhuma intenção de me aprofundar no processo de montagem. Se você encontrar algum erro, por favor entre em <ahref="http://www.eluaproject.net/en/Contact">contato comigo</a> e farei as correções necessárias. Acrescento ainda, que esse tutorial não possui nenhum tipo de garantia.</strong></p>
<h2>Pré-requisitos</h2>
<p>Para construir seu toolchain você precisará de:</p>
<ul>
<li>Um computador rodando Linux: Eu uso Ubuntu 8.04, mas qualquer Linux irá fazer, desde que você saiba como encontrar o equivalente do "apt-get" para a sua distribuição. Não entrarei em detalhes sobre isso, pesquise no Google e você encontrará o que precisa. Assumimos também que o Linux já tem uma "base" nativa toolchain instalada (gcc/make e afins). Isto é verdadeiro para o Ubuntu depois da instalação. No entanto, você precisa verificar a sua distribuição específica.</li>
<li>GNU binutils: faça o download <ahref="http://ftp.gnu.org/gnu/binutils/">aqui</a>. No momento em que elaborava este tutorial, as versões mais recentes eram 2.18, que por algum motivo desconhecido não compilava no meu sistema, por isso estou usando a versão 2,17.</li>
<li>GCC: versão 4.3.0 ou superior é recomendada. No momento em que escrevia este tutorial, a versão mais recente era a 4.3.1, a qual usarei para este tutorial. Faça o download <ahref="http://gcc.gnu.org/mirrors.html">aqui</a> depois de escolher um bom servidor de mirror.</li>
<li>Newlib: enquanto preparava este tutorial, a versão mais recentes era a 1.16.0. Faça o download do <ahref="ftp://sources.redhat.com/pub/newlib/index.html">diretório FTP Newlib</a>.</li>
<li>Além disso, o tutorial assume que você esteja usando o bash como seu shell. Se você usar qualquer outra coisa, talvez você precise ajustar alguns comandos do shell específico.</li>
</ul>
<p>Você ainda precisará de outros programas e bibliotecas a fim de montar o toolchain. Para instalá-los:</p>
<p>Em seguida, defina onde pretende instalar o seu toolchain. Eles geralmente são instalados no diretório /usr/local/, logo, assumiremos o diretório /usr/local/cross-arm para este tutorial. Para agilizar a digitação, defina este caminho como padrão na variável de ambiente:</p>
<p>Nesta etapa vamos montar uma "base" GCC (ou seja, uma GCC sem nenhuma lib, a qual usaremos, a fim de criar todas as bibliotecas para o nosso objetivo). Mas primeiro temos que fazer uma rápida modificação nos arquivos de configuração. Fora desse ambiente, o pacote GCC 4.3.1/newlib não compilará corretamente, dando um erro muito estranho "Link tests are not allowed after GCCNOEXECUTABLES". Após uma procura no google, encontrei a solução para isso:</p>
<p> Estou usando "joe" aqui, como meu editor de texto Linux favorito, você pode usar qualquer outro editor de texto. Agora encontre a linha que tenha o string "AC_LIBTOOL_DLOPEN" e adicione um "#" no inicio da linha:</p>
<p>No meu sistema, a última linha acima (sudo make install-gcc) termina com erros, devido a impossibilidade de encontrar a binutils recentemente compilada. Se isso acontece para qualquer tipo de comando "make install", aqui está uma maneira rápida de resolver isso:</p>
<p>Mais uma vez, este etapa é tão fácil quanto descompactar, configurar, compilar. Mas eu preciso que a minha biblioteca seja do menor tamanho possível (em contraposição, tão rápida quanto possível) e eu só queria manter o que é necessário no executável, por isso, acrescentei os flags "-ffunction-sections -fdata-sections" para permitir que o linker execute "dead code stripping":</p>
<li><code>--disable-newlib-supplied-syscalls</code>: isto merece uma página própria, mas não vou fazê-lo aqui. Para uma explicação, por exemplo, ver <ahref="http://openhardware.net/Embedded_ARM/NewLib_Stubs/">esta página</a></li>
<li><code>-DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__</code>: compila Newlib otimizando o tamanho, não a performance (estes são específicos da Newlib).</li>
<li><code>-Os -fomit-frame-pointer</code>: indica para GCC otimizar o tamnho, não a velocidade.</li>
<li><code>-D__BUFSIZ__=256</code>:
novamente específico da Newlib, este é o tamanho default do buffer alocado para arquivos abertos via fopen(). O padrão é 1024, cujo tamanho considerei muito para eLua, logo estou usando 256 aqui. Certamente, você pode mudar este valor.</li>
<p>Finalmente, no último passo deste tutorial, completamos a construção do GCC. Nesta etapa, várias bibliotecas de suporte do compilador são montadas (sendo a mais importante a libgcc.a). Felizmente este á o mais simples dos passos de compilação da NewLib:</p>
Agora você pode finalmente desfrutar do seu toolchain para ARM, e compile eLua com ele :) Se você precisar de mais explicações, ou se as instruções acima não funcionaram para você, sinta-se a vontade para entrar em <ahref="http://www.eluaproject.net/en/Contact">contato comigo.</a>.</p>