Muitas bibliotecas foram escritas para sistemas UNIX® e muitas delas foram lançadas usando licenças de software
livre que permitem a reutilização do código fonte de uma biblioteca em
novos projetos. Ao portar uma biblioteca existente para uma nova
plataforma, um desenvolvedor pode economizar o tempo que gastaria para
duplicar o trabalho de desenvolvimento a fim de conseguir a mesma
funcionalidade na nova plataforma.
Esta é a primeira parte de uma série
de artigos, dividida em duas partes, sobre como portar as bibliotecas
cliente OpenLDAP para o iOS. A Parte 1 orienta o leitor pelas etapas de
importação do código fonte de OpenLDAP para Xcode e de desenvolvimento
de duas bibliotecas estáticas para o iOS. Usando o projeto Xcode criado
na Parte 1, a Parte 2 orientará o leitor pela criação de um aplicativo
iOS simples que executa consultas básicas em um servidor do LDAP usando
as bibliotecas OpenLDAP.
A introdução do iPhone no mercado de celulares causou um dilúvio de
aplicativos móveis na loja do iTunes. Com uma grande quantidade de
aplicativos
duplicando as principais funcionalidades, é fácil para um novo
aplicativo ficar sufocado
entre seus concorrentes. Para que um ele se destaque para um
cliente, cada vez mais está se tornando necessário adicionar recursos não suportados pelos
aplicativos concorrentes;
no entanto, escrever novas funcionalidades do zero pode ser custoso
em termos de tempo de
e trabalho de desenvolvimento. Entender como portar bibliotecas
originalmente escritas para sistemas UNIX® pode permitir que um
desenvolvedor reduza os custos e lance um aplicativo no mercado com mais
rapidez.
O iOS, sistema operacional usado pelo iPhone, é desenvolvido sobre
uma base UNIX e os aplicativos para iOS são compilados usando o GCC, o
mesmo compilador usado pela maioria dos sistemas UNIX. Isso significa
que a maioria das bibliotecas escritas para esse sistema pode ser
portada para o iPhone com algum tempo e esforço.
Este artigo o orienta pelas etapas de portabilidade de uma biblioteca
para o iPhone, normalmente desenvolvida em um ambiente com Autoconf e
Make. Embora não seja uma explicação extensa de portabilidade de
pacotes desenvolvidos com ferramentas GNU, este artigo deve fornecer as
pistas necessárias para que os desenvolvedores possuam algum
conhecimento sobre as ferramentas GNU, a fim de portar um pacote para
Xcode e para plataformas iOS.
Os exemplos usados neste artigo foram testados usando o iOS SDK 4.1 no Mac OS X 10.6.4 e
OpenLDAP 2.4.22. Embora este artigo tenha sido escrito usando o iOS SDK 4.1, ele deverá
funcionar para versões futuras do iOS SDK com pouca, ou nenhuma mudança. Os arquivos de origem
e arquivos do projeto para os exemplos estão disponíveis em um arquivo zip na seção Download.
O iPhone SDK é usado para compilar aplicativos para celular para a
plataforma iPhone OS. O SDK fornece documentação, um IDE e um simulador
para teste de aplicativos para celular.
OpenLDAP é uma implementação gratuita e de software livre do
Lightweight Directory Access Protocol. A implementação inclui
bibliotecas que fornecem acesso aos serviços de diretório X.500 usando
LDAP sobre TCP.
Preparando o código fonte do OpenLDAP
Xcode é o IDE incluído com o iPhone SDK. Ele contém modelos e
documentação para desenvolver aplicativos e bibliotecas para a
plataforma iOS. Para facilitar
a navegação da árvore de código fonte para OpenLDAP, importaremos
primeiro o código fonte
em um projeto do Xcode. Para criar um novo projeto do Xcode para a
plataforma iOS, abre o Xcode
e selecione New Project no menu File na barra de menus. Isso
deve abrir uma nova caixa de diálogo com três painéis (consulte a Figura 1).
Como o projeto será usado para compilar a biblioteca cliente OpenLDAP, o projeto
deverá ser criado com o modelo de biblioteca estática. No painel esquerdo, selecione
Library sob o título iPhone OS. No painel superior direito,
selecione Cocoa Touch Static Library. Clique em Choose para continuar.

Figura 1. Caixa de diálogo New Project no Xcode
A caixa de diálogo na Figura 2 é usada para definir o nome do projeto do Xcode.

Figura 2. Caixa de diálogo para adição de arquivos existentes ao projeto do Xcode
O Xcode criará o nome da biblioteca prefixando lib e anexando .a ao
nome do projeto. Portanto, para criar uma biblioteca com o nome de
libldap.a, o nome do projeto precisa ser definido como ldap. Digite um
nome da caixa Save As e clique em Save. Isso criará um diretório com os arquivos iniciais para o projeto.
Agora que o projeto foi criado, o código fonte do OpenLDAP pode ser importado.
Faça o download do código fonte da página do projeto do OpenLDAP e extraia o arquivo tar
para a pasta do projeto do Xcode. No menu Project, na barra de menus, selecione Add to
Project. No navegador de arquivos aberto, selecione a pasta dentro do projeto do Xcode,
que contém o código fonte para o OpenLDAP, e clique no botão Add
. Uma nova caixa de diálogo deve aparecer. Certifique-se de que a opção “Recursively create
groups for any added folders” esteja selecionada e desmarque ldap na lista de destinos. Clique no botão Add
para concluir a adição do código fonte ao projeto. Um novo grupo com o
nome do diretório OpenLDAP deve estar no painel Groups & Files do
projeto da janela do projeto principal do Xcode.
A árvore de código fonte do OpenLDAP contém um diretório com arquivos
de cabeçalho que serão
incluídos pelos arquivos de origem usados pelas bibliotecas. O
Xcode precisa ser configurado para
informar ao pré-processador para pesquisar esse diretório ao
processar diretivas #include. Clique duas vezes no nome do projeto no
painel Groups & Files da janela principal do projeto do Xcode. Isso
deverá abrir a janela de informações do projeto (consulte a Figura 3). Clique na caixa de pesquisa “Search in Build Settings” e digite Header Search Paths. Clique duas vezes no campo Value para adicionar um novo caminho de pesquisa e adicione openldap-2.4.22/include.

Figura 3. Caixa de diálogo de informações do projeto
Preparando os arquivos de cabeçalho
O OpenLDAP foi portado para muitas plataformas. Os desenvolvedores de
OpenLDAP usam arquivos de cabeçalho C para definir as informações do
sistema no momento da compilação. Normalmente, esses arquivos de
cabeçalho são criados por meio da modificação de arquivos modelo com
scripts gerados no AutoConf. Como o Xcode não usa Autoconf, esses
arquivos devem ser modificados manualmente. Os arquivos que precisam
ser modificados são lber_types.hin, ldap_config.hin, ldap_features.hin e
portable.hin. Esses arquivos estão localizados no diretório incluído
na árvore de código fonte do OpenLDAP.
lber_types.hin
O arquivo lber_types.hin contém o modelo para definição dos tipos de
variáveis. O arquivo de modelo precisa ser renomeado como lber_types.h.
Isso pode ser feito clicando com o botão direito do mouse no nome do
arquivo no Xcode e selecionando rename no menu. Isso atualizará os
metadados do Xcode do arquivo para tratá-lo como um arquivo de cabeçalho
C. Abra o arquivo para edição e encontre as seguintes linhas exibidas
na Listagem 1 .
/* LBER boolean, enum, integers (32 bits or larger) */
#undef LBER_INT_T
/* LBER tags (32 bits or larger) */
#undef LBER_TAG_T
/* LBER socket descriptor */
#undef LBER_SOCKET_T
/* LBER lengths (32 bits or larger) */
#undef LBER_LEN_T
Listagem 1. lber_types.h
Essas linhas declararão os tipos de variáveis usados pela biblioteca.
Como o iPhone é uma
plataforma de 32 bits, digite int como um valor adequado. Altere as
macros #undef para #define e defina os tipos de variáveis como int
(consulte a Listagem 2).
/* LBER boolean, enum, integers (32 bits or larger) */
#define LBER_INT_T int
/* LBER tags (32 bits or larger) */
#define LBER_TAG_T int
/* LBER socket descriptor */
#define LBER_SOCKET_T int
/* LBER lengths (32 bits or larger) */
#define LBER_LEN_T int
Listagem 2. Ajustando para a plataforma de 32 bits
O restante do arquivo declara tipos de variáveis personalizadas usadas pela biblioteca e não precisa ser modificado:
ldap_config.hin.
O arquivo ldap_config.hin contém o modelo para definição de onde a
biblioteca deve
pesquisar pelos arquivos de configuração do cliente LDAP. Como o iOS
não permite que o usuário
crie arquivos aleatórios no sistema de arquivos do dispositivo, o
conteúdo do arquivo não precisa ser modificado. Os arquivos precisam ser
renomeados para ldap_config.h de modo que os arquivos de origem não
gerem erros ao serem compilados, devido a uma diretiva incluída com
falhas. O arquivo pode ser renomeado usando a interface do Xcode da
mesma maneira que o lber_types.hin foi renomeado como lber_types.h.
ldap_features.hin
ldap_features.hin contém informações sobre quais recursos são
exigidos pela plataforma iOS e informações sobre a versão atual do
OpenLDAP. Renomeie ldap_features.hin para ldap_features.h e encontre as
seguintes linhas exibidas na Listagem 3.
/* OpenLDAP API version macros */
#undef LDAP_VENDOR_VERSION
#undef LDAP_VENDOR_VERSION_MAJOR
#undef LDAP_VENDOR_VERSION_MINOR
#undef LDAP_VENDOR_VERSION_PATCH
Listagem 3. ldap_features.h
O OpenLDAP usa um número de versão com três partes para cada release.
A versão é indicada no
formato de X.Y.Z, no qual X é o número de versão do principal
fornecedor do release, Y é o número de versão do fornecedor secundário
do release e Z é o patch de revisão do release. O valor de LDAP_VENDOR_VERSION é calculado com a fórmula ((X*10,000)+(Y*100)+(Z)). Por exemplo, o LDAP_VENDOR_VERSION para OpenLDAP 2.4.22 seria calculado usando os valores exibidos na Listagem 4.
LDAP_VENDOR_VERSION_MAJOR = X = 2
LDAP_VENDOR_VERSION_MINOR = Y = 4
LDAP_VENDOR_VERSION_PATCH = Z = 22
LDAP_VENDOR_VERSION = ((X*10000)+(Y*100)+(Z))
LDAP_VENDOR_VERSION = ((2*10000)+(4*100)+(22))
LDAP_VENDOR_VERSION = (20000+400+22)
LDAP_VENDOR_VERSION = (20422)
Listagem 4. Calculando o LDAP_VENDOR_VERSION
ldap_features.h precisa ser atualizado para refletir a versão do código
fonte do OpenLDAP. Substitua as macros #undef por #define e insira as
informações da versão. Por exemplo, OpenLDAP 2.4.22 resultaria nas
seguintes modificações exibidas na Listagem 5.
/* OpenLDAP API version macros */
#define LDAP_VENDOR_VERSION 20422
#define LDAP_VENDOR_VERSION_MAJOR 2
#define LDAP_VENDOR_VERSION_MINOR 4
#define LDAP_VENDOR_VERSION_PATCH 22
Listagem 5. Modificações do OpenLDAP 2.4.22
O restante do arquivo não precisa ser modificado.
portable.hin
Informações relacionadas às funções da biblioteca e arquivos de
cabeçalho disponíveis no
iPhone SDK precisam ser definidas em um arquivo chamado
portable.hin. No entanto, esse arquivo é muito grande e exige muito
trabalho para defini-lo corretamente. Felizmente, o OpenLDAP usa o
autoconf para realizar os testes necessários de múltiplas plataformas.
Os scripts do autoconf podem ser usados para gerar os valores para
portable.hin.
Para usar os scripts de autoconf do OpenLDAP, abra o Terminal.app
localizado em /Applications/Utilities/Terminal.app. Digite o comando cd
e um espaço. Em seguida, arraste a pasta dentro do Xcode que contenha a
árvore de código fonte do OpenLDAP para a janela do terminal (consulte a
Figura 4).

Figura 4. Mostrando o processo de arrastar o grupo do Xcode para o Terminal.app a fim de obter o caminho para a pasta
Pressione Enter no teclado para alterar os diretórios no Terminal.app
para o local da árvore de código fonte do OpenLDAP. Execute o script de
configuração com os seguintes sinalizadores exibidos na Listagem 6.
./configure CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld
--host=arm-apple-darwin --disable-slapd --without-cyrus-sasl
--without-tls --no-create
Listagem 6. Executando o script de configuração
O sinalizador CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
especifica o local do compilador usado pelo iPhone SDK e o LD=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld especifica o local do ligador. O sinalizador –host=arm-apple-darwin informa ao autoconf em qual plataforma o código compilado será usado.
O sinalizador –disable-slapd
desativa as verificações necessárias para desenvolver o servidor do
LDAP, que acompanha o OpenLDAP. O iPhone SDK não inclui a biblioteca
Cyrus SASL, a biblioteca OpenSSL ou a biblioteca GNU SSL/TLS, de modo
que os sinalizadores –without-cyrus-sasl e –without-tls desativam as verificações para as funções contidas nessas bibliotecas. Finalmente, o sinalizador –no-create impede o autoconf de criar Makefiles e arquivos de cabeçalho. O resultado deverá ser parecido com a Figura 5.

Figura 5. Primeiras linhas do script de configuração em execução
Execute o seguinte para que o autoconf gere portable.h a partir do arquivo portable.hin: ./config.status –header=include/portable.h:include/portable.hin.
Criando o libldap.a
Agora que o código fonte e os arquivos de configuração foram preparados,
é hora de informar ao Xcode quais arquivos de origem serão usados pela
biblioteca LDAP. Usando a interface do Xcode, navegue a árvore de código
fonte do OpenLDAP até o diretório libldap (consulte a Figura 6).

Figura 6. Local dos arquivos de origem do libldap no painel Groups & Files do Xcode
No diretório libldap, há um arquivo chamado Makefile.in contendo uma
lista de arquivos usados para desenvolver o libldap.a. Abra o
Makefile.in e encontre as linhas exibidas na Listagem 7.
SRCS = bind.c open.c result.c error.c compare.c search.c
controls.c messages.c references.c extended.c cyrus.c
modify.c add.c modrdn.c delete.c abandon.c
sasl.c gssapi.c sbind.c unbind.c cancel.c
filter.c free.c sort.c passwd.c whoami.c
getdn.c getentry.c getattr.c getvalues.c addentry.c
request.c os-ip.c url.c pagectrl.c sortctrl.c vlvctrl.c
init.c options.c print.c string.c util-int.c schema.c
charray.c os-local.c dnssrv.c utf-8.c utf-8-conv.c
tls2.c tls_o.c tls_g.c tls_m.c
turn.c ppolicy.c dds.c txn.c ldap_sync.c stctrl.c
assertion.c deref.c
Listagem 7. Makefile.in
Os arquivos nessa lista precisam ser atualizados para serem incluídos no
destino do ldap. Para fazer isso, clique com o botão direito do mouse
em um arquivo na lista e selecione o item Get Info no
menu que aparece. Na nova janela, selecione a guia Targets e clique no
destino ldap a partir do painel Target Memberships. Repita isso para
toda a lista de arquivos.
Criando liblber.a
A liblber.a é uma biblioteca exigida pelo libldap.a ao compilar um
aplicativo. A biblioteca
está incluída na distribuição do OpenLDAP. Para desenvolvê-la, é necessário criar antes um destino de Xcode a biblioteca.
Para criar o novo destino, clique com o botão direito do mouse no
ícone do projeto no painel Groups & Files do Xcode. Selecione Add
no menu e selecione New Target no menu secundário e um
assistente deverá aparecer. Selecione Cocoa Touch no painel
à esquerda e selecione Static Library no painel à direita. Clique no botão Next para continuar. Na caixa de texto Target Name, digite lber e clique em Finish. Isso deve criar o novo destino da biblioteca.
Essa biblioteca depende da estrutura Foundation e para configurá-la, vá até a ação Targets no painel Groups & Files
do Xcode. Expanda a seção Targets e clique duas vezes no lber de
destino. Isso deverá abrir a janela de informações do destino para o
lber. Clique na guia General e clique no botão + abaixo do painel Linked
Libraries. Na janela suspensa, selecione Foundation.framework na seção
Device – iPhone OS 4.1 SDK. Clique no botão Add para concluir a adição da estrutura à biblioteca.
Finalmente, o Xcode precisa ser configurado com os arquivos de origem
para compilação para liblber.a.
Usando a interface do Xcode, navegue a árvore de código fonte do
OpenLDAP até o diretório liblber. No diretório liblber, há um arquivo
chamado Makefile.in que contém uma lista dos arquivos usados para
desenvolver liblber.a.
Abra o Makefile.in e encontre as linhas exibidas na Listagem 8.
UNIX_SRCS = stdio.c
SRCS= assert.c decode.c encode.c io.c bprint.c debug.c
memory.c options.c sockbuf.c $(@PLAT@_SRCS)
Listagem 8. Linhas do Makefile.in
Os arquivos nessas listas precisam ser atualizados para serem incluídos no destino lber. Para fazer
isso, clique com o botão direito do mouse em um arquivo da lista e selecione o item Get Info
no menu que aparece. Na nova janela, selecione a guia Targets e clique no destino do lber no painel Target Memberships. Repita isso para todos os arquivos nas listas.
A biblioteca pode ser desenvolvida clicando no botão Build na barra de ferramentas do Xcode. Para alternar entre o desenvolvimento para o simulador ou para um dispositivo, escolha o
SDK desejado na caixa suspensa chamada Overview.
Conclusão
Assim como ocorre com a maioria dos métodos de desenvolvimento de
software, há outras formas de compilar as bibliotecas portadas para o
iOS. Este artigo usa o Xcode para realizar a compilação a fim de
permitir que as bibliotecas sejam facilmente integradas a outros pacotes
usando o rastreamento de dependência do Xcode e para permitir que as
bibliotecas sejam facilmente atualizadas com versões futuras do iPhone
SDK.
A Parte 2 desta série mostrará como criar um segundo projeto do
Xcode, como adicionar o projeto do Xcode criado neste artigo como uma
dependência e como usar as bibliotecas estáticas para criar um cliente
LDAP para o iPhone.
Download
| Descrição | Nome | Tamanho | Método de download |
|---|---|---|---|
| Zip file | ldap.zip | 836KB | HTTP |
Informações sobre métodos de download
Recursos
Aprender
-
Guerra dos navegadores do Android e iPhone, Parte 1: O WebKit é a salvação!
(Frank Ableson, developerWorks, dezembro de 2009): Veja como você pode
aproveitar os recursos de navegadores para celular neste artigo do
developerWorks. - Introdução a LDAP: Parte 1, Instalação e programação LDAP Java simples (Jeng Yoong Tan, developerWorks, junho de 2010): Obtenha uma visão geral do LDAP (Lightweight Directory Access Protocol).
-
Comece seu aprendizado com Open Source :
Leia esta entrada do blog de Chris Walden sobre a integridade de
pacotes de software livre disponíveis para praticamente qualquer
trabalho. - Para obter uma série de artigos que ensinará como programar em bash, consulte Bash by example, Part 1: Fundamental programming in the Bourne again shell (bash) (Daniel Robbins, developerWorks, março de 2000), Bash by example, Part 2: More bash programming fundamentals (Daniel Robbins, developerWorks, abril de 2000) e Bash by example, Part 3: Exploring the ebuild system (Daniel Robbins, developerWorks, maio de 2000).
-
Making
UNIX and Linux work together (Martin Brown, developerWorks, abril de 2006) é um guia
para fazer com que a distribuição tradicional de UNIX e Linux® funcionem juntos. -
Visite a zona de software livre
para obter extensas informações de instruções, ferramentas e
atualizações de projeto para ajudar você a desenvolver com tecnologias
de software livre e usá-las com produtos IBM. -
Siga o developerWorks no Twitter.
- Acesse a Portabilidade de Xcode do OpenLDAP.
- Para ouvir entrevistas e discussões interessantes para desenvolvedores de software, verifique os Podcasts do developerWorks.
- Eventos técnicos e webcasts do developerWorks: Permaneça atualizado com os webcasts e eventos técnicos do developerWorks.
Obter produtos e tecnologias
- Obtenha o iPhone SDK. Membros registrados do ADC podem fazer o download.
-
Confira o projeto GitHub para portabilidades de iOS.
Automatiza o desenvolvimento de OpenSSL, Cyrus-SASL e OpenLDAP e foi testado com SASL Auth, LDAPS e LDAP TLS. - Faça o download do OpenLDAP no Web site do projeto.
- Obtenha a Portabilidade de Xcode do OpenLDAP.
- Inove seu próximo projeto de desenvolvimento de software livre com a versão de teste do software IBM, disponível para download ou em DVD.
Discutir
Participe dos blogs do developerWorks
e participe da comunidade do developerWorks.







