2007/11/20

Desenvolvimento Série 60 para quem desenvolve em Linux - parte 1

Tendo enfrentado neste ano o desafio de desenvolver para Symbian e Série 60, vindo de longos anos de experiência anterior exclusiva em Linux, achei que seria interessante escrever algumas impressões, para quem pretende desenvolver algo em Série 60.

Em primeiro lugar, é uma filosofia completamente diferente. Ainda mais para quem está acostumado a desenvolver em terminal, usando make e vi. No Symbian, você vai usar um ambiente pronto, e o jeito é confiar nele.

Para começar, é preciso usar o Windows, pois as ferramentas são apenas para Windows. No site http://forum.nokia.com, obtenha os pacotes Carbide.c++ (versão 1.2 funciona bem, as anteriores não), e o SDK S60 C++ apropriada para seu celular. Presumindo que você tem um celular Série 60 3a edição, então seria o SDK S60 C++ for 3rd Edition Feature Pack 1, ou Feature Pack 2. Estas versões têm emuladores melhores que o 3rd Edition "original".

Além disto, você vai precisar do Active Perl e do Java Runtime Environment. As versões exatas recomendadas para o SDK que você está instalando serão informadas durante o processo de instalação.

Recomendo também obter o Open C, e instalar tanto no SDK quanto no seu celular. Infelizmente, OpenC existe apenas para S60 3a edição.

Para testar o ambiente e gerar rapidamente algo que possa ser instalável em seu celular, inicie o Carbide e gere um novo projeto usando o Wizard. Rodá-lo no emulador, gerar o pacote e instalá-lo no celular já vai ser um exercício, em particular para quem não está acostumado a Windows, Carbide, Symbian ou a lidar com seu celular...

Um projeto Symbian depende de inúmeras coisas estarem corretas para ele funcionar no celular. Por exemplo, cada programa tem três códigos UID (UID, UID2 e UID3). Um identifica a plataforma, outro identifica univocamente o programa, e o outro eu não sei até hoje :) Se o UID especificado no projeto não "bate" com o especificado nos arquivos de inclusão, o programa funciona no emulador porém não funciona no celular.
Começar um projeto a partir de um template do Wizard evita esse tipo de dissabor.

Gerar um projeto a partir do Wizard também permite explorar logo o esqueleto de um projeto Symbian, e a forma de construir projetos.

A (única) parte que eu realmente gostei do Symbian foi o esquema de construção de programas. Pelo fato da estrutura do código ser mais rígida, fica mais fácil tratar a questão da construção. Todo projeto Symbian tem uma estrutura de pastas semelhante a esta:

\group: contém os arquivoss específicos do Symbian, como BLD.INF e PROJETO.MMP

\src: fontes .cpp

\inc: arquivos de inclusão .h

\data: arquivos de inclusão com mensagens internacionalizadas e menus

\gfx: parte gráfica, como por exemplo o ícone da aplicação

\sis: onde o pacote final é jogado, geralmente contém o arquivo PROJETO.PKG

É possível mudar o nome destas pastas, mas usar os nomes padrão facilita a compreensã o do seu projeto para terceiros.

Todo o processo de compilação e empacotamento é gerenciado por apenas 3
arquivos-texto, dois da pasta \group e um da pasta \sis:

PROJETO.MMP: este é o principal deles. É neste arquivo que se especifica os UIDs (códigos numéricos) do programa, quais as pastas que contém arquivos de inclusão, quais os programas a serem compilados etc. Ele é análogo ao "Makefile.in" do software livre. Baseado neste arquivo, todo o esquema de construção e tratamento de dependências é levado a cabo. Exemplo:


TARGET EPx.exe
TARGETTYPE exe
UID 0x100039CE 0xE1BFA2A2

SOURCEPATH ..\src
SOURCE EPx.cpp
SOURCE EPxApplication.cpp
SOURCE EPxAppView.cpp
SOURCE EPxAppUi.cpp
SOURCE EPxDocument.cpp

SOURCEPATH ..\data

START RESOURCE EPx.rss
HEADER
TARGETPATH resource\apps
END //RESOURCE

START RESOURCE EPx_reg.rss
TARGETPATH \private\10003a3f\apps
END //RESOURCE

USERINCLUDE ..\inc

SYSTEMINCLUDE \epoc32\include \epoc32\include\stdapis \epoc32\include\stdapis\glib-2.0

LIBRARY euser.lib
LIBRARY apparc.lib
LIBRARY cone.lib
LIBRARY eikcore.lib
LIBRARY avkon.lib
LIBRARY commonengine.lib
LIBRARY efsrv.lib
LIBRARY estor.lib
LIBRARY expat.lib libc.lib libpthread.lib libglib.lib

LANG SC

VENDORID 0
SECUREID 0xE1BFA2A2
CAPABILITY LocalServices NetworkServices ReadUserData WriteUserData



BLD.INF: Define quais arquivos MMP serão invocados para construção, e também define, no caso de bibliotecas DLL, quais arquivos de inclusão devem esr copiados para Epoc32\include, para serem vistos por outros projetos. Exemplo:


PRJ_PLATFORMS
WINSCW ARMV5 GCCE

PRJ_MMPFILES

gnumakefile icons_scalable_dc.mk

EPx.mmp


PROJETO.PKG: define o empacotamento do programa para distribuição aos celulares. Essencialmente lista os arquivos que serão incluídos no pacote. Equivalente ao "debian/control" do Debian, ou ao "programa.rpm" do RedHat. Exemplo:


;Language - standard language definitions
&EN

; standard SIS file header
#{"EPx"},(0xE1BFA2A2),1,0,0

;Localised Vendor name
%{"Vendor-EN"}

;Unique Vendor name
:"Vendor"

;Supports Series 60 v 3.0
[0x101F7961], 0, 0, 0, {"Series60ProductID"}

;Files to install
;You should change the source paths to match that of your environment
;
"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\EPx.exe" -"!:\sys\bin\EPx.exe"
"$(EPOCROOT)Epoc32\data\z\resource\apps\EPx.rsc" -"!:\resource\apps\EPx.rsc"
"$(EPOCROOT)Epoc32\data\z\private\10003a3f\apps\EPx_reg.rsc" -"!:\private\10003a3f\import\apps\EPx_reg.rsc"
"$(EPOCROOT)Epoc32\data\z\resource\apps\EPx.mif" -"!:\resource\apps\EPx.mif"

; Add any installation notes if applicable
;"EPx.txt" -"!:\private\E1BFA2A2\EPx.txt"

;required for application to be covered by backup/restore facility
"..\sis\backup_registration.xml" -"!:\private\E1BFA2A2\backup_registration.xml"


E isso é tudo. Esses 3 arquivos gerados 99% automaticamente, mais os fontes .cpp e .h, é tudo que se precisa para construir um programa Symbian, seja na linha de comando ou no IDE Carbide. É muito, mas muito mais simples do que o esquema automake/autoconf comum em software livre.

No Carbide, para importar um projeto, basta mandá-lo importar o BLD.INF, pois a partir deste arquivo ele acha os MMPs e por conseqüência todo o resto dos arquivos. O arquivo .PKG tem de ser escolhido manualmente no Carbide, mas isso é simples.

Na linha de comando, preparar um novo projeto para construção envolveria ir para a pasta group\, rodar


BLDMAKE BLDFILES


o que gera um script chamado ABLD.BAT. Dali para frente, basta chamar ABLD.BAT para reconstruir o projeto a cada mudança.