<p>Se você chegou a conclusão que fica melhor gerar o seu próprio arquivo binário <b>eLua</b>
(ao invés de <ahref="downloads.html">baixá-lo</a>), então será necessário verificarmos algumas coisas antes:
</p>
<ul>
<li>você está usando Linux. É possível a compilação em windows, no entanto, ainda não foi testada. Usamos Ubuntu e o comando que utilizamos é o "apt-get". Caso você esteja com uma distro que possua um gerenciador de pacotes diferente, você terá que alterar o comando "apt-get" para um compatível com a sua distro.</li>
<li>você possui um toolchain (compilador, linker e bibliotecas de assembler e C padrão) para o seu hardware. Dê uma olhada na página
<ahref="toolchains.html">toolchains</a> para obter ajuda. É importante observar que, mesmo que você já tenha um toolchain compilado, diferenças nos parâmetros de configuração da NewLib (principalmente os --disable-newlib-supplied-syscalls flags) podem gerar problemas e impedir que <b>eLua</b> seja gerada na sua máquina.</li>
<li>você configurou a sua plataforma corretamente. Leia o próximo parágrafo para obter instruções de como configurar a geração de <b>eLua</b>.</li>
<li>Python - Este deve estar previamente instalado. Caso contrário, execute o apt-get para instalá-lo:
<li>o diretório "bin" do seu toolchain (normalmente algo como /usr/local/cross-arm/bin, onde /usr/local/cross-arm é o diretório de sua instalação toolchain) e deve estar definido no $PATH.
</li>
<li>se você está gerando para a plataforma i386, precisará também do "nasm":
<p>Para cada plataforma, <b>eLua</b> assume um nome para os componentes do toolchain, como relacionado abaixo.
</p>
<p>Se seu toolchain utiliza nomes diferentes, entã você terá que modificar a definição do toolchain no SConstruct. Leia as <ahref="toolchains.html">instruções</a> para maiores detalhes.</p>
<h3>Configurando a imagem gerada</h3>
<p><b>eLua</b> possui um sistema de geração de sua imagem bastante flexível, e que pode ser usado para selecionar os componentes desejados que farão parte do arquivo binário de <b>eLua</b> e também para configuração(estática) durante a compilação. Para usá-lo, será necessário editar somente um único arquivo (<i>platform_conf.h</i>)
localizado no diretório da plataforma que está sendo utilizada (<i>src/platform/<platform
name>/platform_conf.h)</i>. Os parâmetros de configuração estão descritos em detalhes nos próximos parágrafos.</p>
<aname="components"><h2>Configurando os componentes</h2></a>
<p>Um <b>componente</b>é um recurso que pode ser habilitado para adicionar funcionalidade a <b>eLua</b>, sem modificar sua API (rotinas usadas pelos programadores para escrever programas em <b>eLua</b>). Segue abaixo um exemplo da configuração de um componente em <i>platform_conf.h</i>:
<td>Estabelece a função de recepção XMODEM. Se habilitada, você pode usar o comando "recv" do shell para receber um arquivo Lua (tanto código fonte quanto código précompilado) e executá-lo no seu hardware. Funciona somente com conexões RS-232 (apesar de que, em teoria, é possível fazê-lo funcionar em qualquer tipo de protocolo de transporte).
<ahref="building.html#static">Dependências da configuração de dados estáticos:</a><b>CON_UART_ID, CON_UART_SPEED, CON_TIMER_ID</b>
<td>Etabelece a função de gerar um shell de <b>eLua</b> (veja <ahref="using.html">usando eLua</a> para detalhes sobre o shell). Caso o shell não esteja habilitado, o código busca o arquivo chamado <i>/rom/autorun.lua</i> e executa-o. Se este arquivo não for encontrado, um interpretador Lua é iniciado automaticamente no seu hardware.<br>
Para habilitar o shell usando uma conexão serial:
<p><pre><code>#define BUILD_SHELL
#define BUILD_CON_GENERIC</code></pre></p>
Para habilitar o shell usando uma conexão TCP/IP:
<td>Habilita o sistema de arquivos <b>eLua</b> somente para leitura. Veja a <ahref="arch_romfs.html">documentação ROMFS</a> para maiores detalhes sobre como usar este sistema de arquivos.
<td>Habilita o suporte ao terminal ANSI. Este recurso permite que <b>eLua</b> interaja com terminais que suportem sequências ANSI (mais detalhes <ahref="arch_con_term.html">aqui</a>). Atualmente, este recurso funciona somente em conexões R-232, apesar desta não ser uma obrigação estrita. Você precisa habilitar este recurso, caso seja necessário usar o <ahref="refman_gen_term.html">term module</a>.
<ahref="building.html#static">Dependências da configuração de dados estáticos:</a><b>CON_UART_ID, CON_UART_SPEED, CON_TIMER_ID, TERM_LINES, TERM_COLS</b></td>
<td>Habilita o suporte para o TCP/IP. Você precisa habilitar este recurso, caso seja necessário usar o <ahref="refman_gen_net.html">net
module</a>. Além disso, sua plataforma deve implementar o suporte para as funções uIP (veja a documentação <ahref="arch_platform.html">platforminterface</a> para mais detalhes).
<ahref="building.html#static">Dependências da configuração de dados estáticos:</a><b>ELUA_CONF_IPADDR0..3, ELUA_CONF_NETMASK0..3, ELUA_CONF_DEFGW0..3,
<td>Suporte genérico para console (detalhes <ahref="arch_con_term.html">aqui</a>). Habilita o acesso a console (stdio/stdout/stderr) via protocolo de transporte serial (atualmente RS-232, mas outros podem ser suportados). Ative este recurso caso você queira usar uma console de entrada/saída com sua conexão RS-232. Não ative este recurso caso você queira usar uma console de entrada/saída com Ethernet (veja a próxima opção).
<ahref="building.html#static">Dependências da configuração de dados estáticos:</a><b>CON_UART_ID, CON_UART_SPEED, CON_TIMER_ID</b></td>
<td>Console de entrada/saída sobre uma conexão TCP/IP (detalhes <ahref="arch_con_term.html">aqui</a>). Use este recurso se você quiser usar sua placa <b>eLua</b> sobre uma conexão telnet. Não ative este recurso caso você precise de uma console com protocolo de transporte serial (veja a opção anterior).
<td>Suporte genérico para código ADC. Você precisa ativar este recurso caso queira usar o módulo <ahref="refman_gen_adc.html">adc</a>, ou simplesmente as funções ADC da interface da plataforma. Por outro lado, você não precisa ativar este recurso caso não esteja pensando em usar as funções ADC.
<aname="confmodules"><h2>Configurando os módulos</h2></a>
<p>Você pode selecionar os módulos que farão parte do arquivo imagem de <b>eLua</b>. Ao contrário dos componentes, os módulos têm um impacto direto na API de <b>eLua</b>, logo tenha cuidado ao selecioná-los. Ao desativar um módulo, você gera um espaço de memória flash (e possivelmente RAM), mas também irá remover completamente a possibilidade de usar este módulo de <b>eLua</b>.</p>
<p>Os módulos incluídos na geração são epecificados pela macro LUA_PLATFORM_LIBS_ROM. Veja um exemplo abaixo: </p>
<li><b>module_name</b>é o nome pelo qual o módulo pode ser usado a partir de eLua</li>
<li><b>module_init_function</b>é uma função chamada pelo programa Lua em tempo de execução quando o módulo é inicializado</li>
<li><b>module_map_array</b>é uma lista de todas as funções e constantes exportadas pelo módulo</li>
</ul>
<p>Por favor, observe que esta notação é específica para LTR (o patch <b>L</b>ua <b>T</b>iny <b>R</b>AM) e não é a única forma de especificar a lista dos módulos incluídos na geração (apesar desta ser uma forma comum). Verifique a <ahref="arch_ltr.html#config">seção LTR</a> para mais informações sobre LTR.</p>
<p>Para uma lista completa de todos os módulos que podem ser ativados ou desativados via <i>platform_conf.h</i>, veja <ahref="refman_gen.html">the
<aname="static"><h2>Dados da configuração estática</h2></a>
<p>"Configuração estática" refere-se a configuração durante o tempo de compilação. Os parâmetros da configuração estática estão gravados na imagem do firmware e não podem ser alterados em tempo de execução. A tabela abaixo relaciona os parâmetros de configuração estática e suas semânticas.
<td>Usado para configurar console de entrada/saída sobre a UART. Um id específico da UART será usado para a console de entrada/saída, a uma velocidade específica. O formato dos dados é sempre é 8N1 (8 bits de dados, sem paridade, 1 stop bit) neste ponto. O timer ID especificado será usado para o subsistema da console. Essas variáveis são usadas também pelas implementações do XMODEM e do TERM.</td>
<td>Usado para configurar o suporte ao terminal ANSI (caso esteja habilitado). Usado para especificar (respectivamente) o número de linhas e colunas do terminal ANSI.</td>
<td>Usado pelo protocolo TCP/IP caso o cliente DHCP não esteja ativado, ou quando mesmo ativado, este náo tenha como ser contactado. Especifique o endereço IP, a máscara de rede, o gateway padrão e o servidor DNS. Necessário somente quando o BUILD_UIP for habilitado.</td>
<td>Especifique a configuração dos timers virtuais da plataforma (acesse a <ahref="arch_platform_timers.html#virtual_timers">documentação do módulo timer</a> para detalhes). Defina VTMR_NUM_TIMERS como 0 caso este recurso não seja utilizado.</td>
estiver ativado, este define uma relação de constantes da plataforma específica(por exempo máscaras de interrupção) que podem ser acessadas usando a notaço cpu.<constant name>. Os nomes de cada constante devem ser especificados ao invés de uma construção específica (<i>_C(<constantname></i>). Por exemplo:
Observe que a implementação desses recursos não precisa de memória RAM, logo você poderá definir quantas constantes desejar.</td>
<p>Os parâmetros da configuração estática restantes foram deixados para serem alterados pelos desenvolvedores e por este motivo, não estão relacionados aqui.<br>Outra coisa que você poderá querer configurar é o conteúdo do sistema de arquivo de sua ROM. Veja a <ahref="arch_romfs.html">documentação ROMFS</a> para detalhes de como fazer isso.</p>
<p>Agora, que você está com tudo em seu lugar, resta então executar o "build system" (scons) com os argumentos corretos. Este é um passo fácil, apesar da aparência intimidadora devido as múltiplas opções existentes no scons. São usadas para se ajustarem às suas necessidades específicas, mas a menos que suas necessidades sejam muito especiais, você não precisará modificá-las, logo não se preocupe com a aparente complexidade. Os exemplos no fim desta seção mostrarão como é fácil usar o "build system" na prática.</p>
<p>Seu hardware está especificado por dois parâmetros: cpu e placa. "cpu" representa o nome da cpu, e "placa" o nome de sua placa. Uma placa pode ser associada a mais de uma CPU. Esta característica permite ao "build system" ter bastante flexibilidade. Você pode usar estas duas opções juntas ou separadas, como mostrado a seguir:</p>
<ul>
<li><b>cpu=name</b>: gera para uma CPU específica. Um nome para a placa será gerado automaticamente pelo sistema.</li>
<li><b>board=name</b>: gera para uma placa específica. Um nome para a CPU será inferido automaticamente pelo sistema.</li>
<li><b>cpu=name board=name</b>: gera para uma placa e uma CPU. O script de geração não permitirá combinações invalidas de CPU/placa.</li>
</ul>
<p>Veja no inicio do arquivo SConstruct (<i>platform_list</i>) como configurar os parâmetros placa/CPU, são auto-explicativos.<br>
As outras opções são mostradas a seguir:</p>
<ul>
<li><b>target=lua | lualong</b>: especifica se você deseja gerar Lua como "regular" (com suporte a ponto flutuante) ou somente "inteiro longo" (lualong). O default é "lua". "lualong" roda mais rápido em hardware que não possua co-processador para ponto flutuante (o que é o caso de todos os atuais hardwares que rodam <b>eLua</b>) mas não permite o suporte para operações de ponto flutuante, somente opera com inteiros.</li>
<li><b>cpumode=arm | thumb</b>: para CPUs ARM (não use Cortex) especifica o modo de compilação. O valor default é 'thumb' para as CPUs AT91SAM7X e 'arm' para as CPUs STR9 e LPC2888.</li>
<li><b>allocator = newlib | multiple | simple</b>: escolha entre o valor default (newlib) que é uma versão mais antiga do alocador dlmalloc, o alocador mútiplo de espaços de memória (multiple) que é uma versão mais recente do dlmalloc que permite tratar múltiplos espaços de memória, e um alocador de memória muito simples (simple) que é lento e não trata muito bem fragmentação, mas requer muito pouco recurso (Flash/RAM). Você só deve usar o alocador 'multiple' nos casos em que prescise de a espaços múltiplos de memória. O valor default é 'newlib' para todas as CPUs exceto a 'lpc2888' e a 'at32uc3a0512', desde que a LPC-H2888 e a placa ATEVK1100 venham com memória externa SDRAM e dessa maneira se tornam o hardware ideal para o uso do 'multiple'. Você deve utilizar 'simple' somente em sistemas com muita restrição de recursos de hardware.</li>
<li><b>toolchain=<toolchain name></b>:
especifica o nome do toolchain usado para gerar a imagem. Veja <ahref="toolchains.html#configuration">este link</a> para mais detalhes.</li>
<li><b>optram=0 | 1</b>: habilita ou desabilita o patch LTR, veja a <ahref="arch_ltr.html">documentação LTR</a> pra mais detalhes. O valor default é 1, que habilita o patch LTR.</li>
<li><b>prog</b>: por default, o comando 'scons' acima gerará somente o arquivo 'elf' (executável). Quando necessário, acrescente o parâmetro "prog" para gerar também um arquivo de programação da plataforma específica (por exemplo, usando o AT91SAM7X256, este parâmetro resulta na geração de um arquivo .bin que poderá ser programado nesta CPU). </li>
</ul>
<p>O resultado será um arquivo chamado elua_<i>[target]</i>_<i>[cpu]</i>.elf
(se o parâmetro "prog" foi especificado, no caso de plataformas que precisam deste parâmetro para programação, um outro arquivo também é gerado com o mesmo nome, porém terminando com .bin/.hex).<br>
Se você deseja um comando equivalente a um "make clean", execute o "scons" como mostrado acima, mas acrescente um "-c" ao final da linha de comando. "scons -c" é também recomendado após você reconfigurar sua imagem gerada, já que o scons parece omitir as mudanças feitas nestes arquivos em alguns momentos.</p>
<p>Gera eLua para a placa SAM7-EX256, porém define uma CPU específica. Isto é interessante quando você gostaria de saber como a placa especificada se comportará (em termos de recursos) com uma CPU diferente (no caso da placa SAM7-EX256 é possível mudar a CPU AT91SAM7X256 por uma AT91SAM7X512 a qual possui a mesma pinagem mas vem com mais memória Flash/RAM).</p>
<pre><code>$ scons cpu=lpc2888 prog </code></pre>
<p>Gera eLua para a CPU lpc2888. A placa é detectada como LPC-H2888. Aém disso, é gerado um arquivo bin necessário para a programação da CPU. O parâmetro allocator é detectado automaticamente como "multiple".</p>
<p>Gera a imagem para a CPU Cortex LM3S8962, mas usa o CodeSourcery toolchain ao invés do toolchain default (que é a toolchain "genérica" ARM GCC, normalmente a única gerada seguindo as instruções dos tutoriais deste site.</p>