Consultando diversos especialistas da plataforma iPhone, não obtive sucesso na busca de alternativa ao desenvolvimento para os aparelhos da APPLE no Linux. Mas no fundo o Cortex-A8 é um processador ARM, então deixo neste documento como usar o compilador llvm-gcc-4.2 para a arquitetura Darwin-Arm, assim permitindo criar binários para os dispositivos APPLE a partir de fontes C/C++ e Obj-C.
Começaremos pela parte proprietária. O arquivo do firmware e SDK 3 do iphone (iPhone1,2_3.0_7A341_Restore.ipsw e iphone_sdk_3.0__leopard__9m2736__final.dmg) são imprescindíveis e serão obtidos por conta própria no site da APPLE ou em FTPs públicos espalhados pela internet (megaupload, rapidshare entre outros). É uma pena, pois se o licenciamento permitisse, a imagem do LiMobile traria consigo já todos os arquivos instalado pronto para compilação.
Hardware:
O aparelho precisa estar desbloqueado com o jailbreak, cydia, openssh, afc2add e MobileTerminal (opcional). Não vou entrar em detalhes com relação ao desbloqueio do mesmo para não fugir do escopo principal deste documento.
Dependências:
A lista abaixo de dependências básicas foi o que motivou a criar o LiMobile, não quero passa por esta saga novamente:
automake
bison
cpio
flex
g++
g++-4.3
g++-4.3-multilib
gawk
gcc-4.3
git-core
gobjc-4.3
gzip
libbz2-dev
libcurl4-openssl-dev
libssl-dev
make
mount
subversion
sudo
tar
unzip
uuid
uuid-dev
wget
xar
zlib1g-dev
Primeiramente, baixe o script toolchain.sh do projeto iphonedevonlinux:
Durante a execução, o código fonte do dmg2img será copilado para posterior utilização no pacote SDK do iPhone.
Trying to mount the iPhone SDK dmg...
dmg2img v1.6.1 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)
/home/mobile/Projects/iphone/toolchain/files/iphone_sdk_3.0__leopard__9m2736__final.dmg--> /home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
reading property list, 522739 bytes from address 2237401625 …
partition 0: begin=195, size=430, decoded=284
partition 1: begin=914, size=430, decoded=284
partition 2: begin=1632, size=430, decoded=284
partition 3: begin=2367, size=430, decoded=284
partition 4: begin=3088, size=430, decoded=284
partition 5: begin=3799, size=516090, decoded=347564
partition 6: begin=520170, size=430, decoded=284
decompressing:
opening partition 0 ... [2] 100.00% ok
opening partition 1 ... [2] 100.00% ok
opening partition 2 ... [2] 100.00% ok
opening partition 3 ... [2] 100.00% ok
opening partition 4 ... [2] 100.00% ok
opening partition 5 ... [8684] 100.00% ok
Archive successfully decompressed as /home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img
You should be able to mount the image [as root] by:
modprobe hfsplus
mount -t hfsplus -o loop /home/mobile/Projects/iphone/toolchain/tmp/iphone_sdk_3.0__leopard__9m2736__final.img /mnt
In order to extract iphone_sdk_3.0__leopard__9m2736__final.dmg, I am going to mount it.
This needs to be done as root.
SDK is version 3.0.1
Extracting iPhoneSDKHeadersAndLibs.pkg...
Extracting MacOSX10.5.pkg...
Unmounting iPhone SDK img...
Headers extracted.
Logo em seguida, o arquivo de firmware do iPhone é descompactado para extração dos arquivos necessários com a chave criptográfica obtida em tempo real na internet.
Checksum of firmware file is valid.
Archive: /home/mobile/Projects/iphone/toolchain/files/firmware/iPhone1,2_3.0_7A341_Restore.ipsw
inflating: /home/mobile/Projects/iphone/toolchain/tmp/Restore.plist
Firmware Details
Device Class: iPhone
Product Version: 3.0
Build Version: 7A341
Restore RamDisk: 018-5305-002.dmg
Restore Image: 018-5301-002.dmg
Board Config: n82ap
Unzipping 018-5301-002.dmg...
Archive: /home/mobile/Projects/iphone/toolchain/files/firmware/iPhone1,2_3.0_7A341_Restore.ipsw
inflating: /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg
We need the decryption key for 018-5301-002.dmg.
I'm going to try to fetch it from http://www.theiphonewiki.com/wiki/index.php?title=VFDecrypt_Keys:_3.x....
I found it!
Mounting 018-5301-002.dmg...
Decrypting 018-5301-002.dmg...
dmg2img v1.6.1 is derived from dmg2iso by vu1tur (to@vu1tur.eu.org)
/home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted --> /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img
reading property list, 116195 bytes from address 208878440 …
partition 0: begin=195, size=430, decoded=284
partition 1: begin=914, size=430, decoded=284
partition 2: begin=1632, size=430, decoded=284
partition 3: begin=2367, size=430, decoded=284
partition 4: begin=3088, size=430, decoded=284
partition 5: begin=3800, size=105735, decoded=71204
partition 6: begin=109817, size=430, decoded=284
decompressing:
opening partition 0 ... [2] 100.00% ok
opening partition 1 ... [2] 100.00% ok
opening partition 2 ... [2] 100.00% ok
opening partition 3 ... [2] 100.00% ok
opening partition 4 ... [2] 100.00% ok
opening partition 5 ... [1775] 100.00% ok
Archive successfully decompressed as /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img
modprobe hfsplus
mount -t hfsplus -o loop /home/mobile/Projects/iphone/toolchain/tmp/018-5301-002.dmg.decrypted.img /mnt
In order to extract 018-5301-002.dmg, I am going to mount it.
This needs to be done as root.
Copying required components of the firmware...
Unmounting...
Firmware extracted.
Building the toolchain...
Finding and extracting archives...
cctools-667.8.0
CF-476.14
configd-210
DirectoryService-514.23
...
Vá tomar um CAFÉ...
...
Se tudo estiver bem, a compilação do llvm-gcc e outros finalizará e teremos as seguintes mensagens finais:
checking where to find the target ranlib... pre-installed
checking where to find the target strip... pre-installed
checking where to find the target windres... pre-installed
checking whether to enable maintainer-specific portions of Makefiles... no
updating cache ./config.cache
creating ./config.status
creating Makefile
Building gcc-4.2-iphone...
Build progress logged to: /home/mobile/Projects/iphone/toolchain/toolchain/bld/gcc-4.2-iphone/make.log
It seems like the toolchain built!
Cleaning up...
All stages completed. The toolchain is ready.
Para compilar o um programa em c, basta entrar na para ~/Projects/iphone/toolchain/apps/HelloWorldFirst. Encontraremos nesta pasta um convencional HellWord conforme o exemplo abaixo, para compilá-lo basta utilizar o comando make.
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Vamos direto ao código em objetive-C, localizado em ~Projects/iphone/toolchain/apps/HelloToolchain. Ao entrar nesta pasta utilize o comando make para compilar o projeto. E logo em seguida define o IP do seu dispositivo móvel para um posterior deploy como no exemplo abaixo:
make
$ export IP=10.0.0.2
$ make deploy
Pronto, nesta etapa o dispositivo sera reiniciado e um novo aplicativos será acrescentado na area de trabalho. Para finalizar, deixo abaixo um vídeo demonstrativo do projeto o LiMobile.
Como sempre menciono... Colaborar atrai amigos, competir atrai inimigos...
[1] Comentário enviado por matux em 09/11/2010 - 11:34h
Cabelo, mais uma vez você demonstra profundos conhecimentos, profissionalismo e uma profunda curiosidade/pro-atividade.
Meus parabéns.
São pessoas que tem atitudes semelhantes a tua que fazem a comunidade open-source mais forte.
Belo artigo e espero que suas iniciativas motivem aos estudantes de computação em nosso país.
Um forte abraço!
Ps. Já está nos favoritos!
[3] Comentário enviado por cabelo em 09/11/2010 - 12:34h
Rodrigo Slacklin:
Em primeiro lugar, quero deixar bem claro que gosto de críticas, pois só com elas consigo evoluir, como também não quero, glória pois não teve genialidade nenhuma e vc tem razão apenas montei o lego.
Deixei bem claro também sobre a sua colocação referente a glória na entrevista como Jomar (http://www.itweb.com.br/blogs/blog.asp?cod=86). "Não foi genialidade nenhuma (inclusive não posso deixar de agradecer o Erisvaldo Júnior que diminuiu bastante o meu tempo de aprendizado), foi apenas paciência, calma, pesquisa séria e desafio (estou com o iPad faz uns 4 meses), nas horas vagas para relaxar e sair da rotina, bastou juntar uma série de projetos open-source como iFuse (que permite montar o ipad/iphone no file system), dmg2img converte imagens e aquivos dmg, compilador gnu objetive-c, ferramentas opensource para o darwin e o script iphonedevonlinux, para chegar na imagem ideal (utilizando o suse studio) linux baseda no openSUSE"
Inclusive na página da imagem LiMobile (http://pt.opensuse.org/Utilizador:Cabelo/LiMobile) menciono todos os pacotes opensource utilizado como também o objetivo do projeto.
"O principal objetivo desta iniciativa é proporcionar a composição rápida do ambiente de desenvolvimento para dispositivos móveis da APPLE até para usuários com pouco conhecimento na plataforma GNU/Linux. Sendo o foco principal é evitar transtornos de dependências de pacotes e incompatibilidade de versões. Compilar um gcc para gerar instruções para o iPad e iPhone não necessita de muita técnica especial, pois Cortex A8 é baseado no núcleo do ARM11 ;-)"
Finalizando, meu objetivo foi facilitar a utilização de todos estes recursos opensource...
[5] Comentário enviado por paulorvojr em 09/11/2010 - 21:56h
Cabelo a ideia é muito interessante, e uma alternativa claro. belo trabalho.
Mas convenhamos que desenvolvedores como você e eu não vamos utilizar isto em produção.
Melhor pagar 99 doletas a apple por ano, para pode publicar nossos apps a applestore e ganhar dinheiro. Sem isso não é possível.
Desbloquear o aparelho para inserir os testes eu acho valido e faço isso, mas pra produção nada de jailbreak.
usuários mesmo da apple que compram apps, não fazem jailbreak, so maioria dos brasileiros que mau ve um aparelho ja quer desbloquear e acha que ta abafando, so perde com os updates. estimativas indicam que 90% compra na itunes e nada de unlock.
a grande receita eu falo para todos,
vmware + snow leopard + xcode(SDK 3.0) + jailbreak com cydia no iphone/ipod. façam testes e mais testes, sem complicação.
quer ganhar dinheiro no object-c? entao assina a apple anualmente e seja feliz, até calculadora simples ganha 99 centavos de dolar fácil.
[9] Comentário enviado por Noobix em 25/07/2011 - 12:53h
Gostaria de saber se é possivel instalar o seu programa em um Mint, nao encontro o pacote de nome xar para baixar, caso encontre o programa rodará aqui? Onde posso achá-lo?
grato
[10] Comentário enviado por franzbutu em 15/09/2013 - 11:28h
Alguém pode me ajudar nisso?
Tenho o Ubuntu 12.04 fiz todo os procedimentos de download, porém ao executar comando para fazer o download e a compliação não deu certo (tenho o gcc instalado):
francisco@francisco-desktop:~/iOS$ ./toolchain.sh all
Preparing the environment
Toolchain version: 3.0
Building in: /home/francisco/iOS
The following commands are missing: xar bison flex
You may need to install additional software for them using your package manager.
[11] Comentário enviado por andersonbambam em 06/10/2013 - 10:19h
Olá amigo, belo material mas eu gostaria de saber se existe alguma IDE que possa auxiliar o desenvolvimento, para não ficar preso a VI ou VIM no shell.