segunda-feira, outubro 02, 2006

Como mandar o “Janelas” à fava! – Quinto Episódio!

Guia de sobrevivência avançado - a instalação de programas da forma difícil!

A instalação de programas quando estes não existem em formato "apt", normalmente é uma grande dor de cabeça. Disso não há a menor dívida.

No entanto, às vezes é necessário passar por isso! Esta “lição” tem dois objectivos :

Apresentar os conceitos básico sobre compilação, linkagem e makefiles.

Apresentar um exemplo de aplicação do mundo real (a instalação de um driver novo no ubuntu para uma placa de rede sem fios WiFi).

Então aqui ficam os conceitos básicos :

Ferramentas de compilação (build)

Em primeiro lugar, queremos instalar as bibliotecas essenciais para os processos de compilação:

>sudo apt-get install build-essential

>sudo apt-get install linux-headers-`uname -r`


Para testar se tudo correu bem, experimente no terminal alguns destes comandos :

>sudo make

>sudo gmake

>sudo gcc

Nota: É conveniente usar o "sudo", para atribuir permissões de administração aos processos de compilação.

Agora, já deveremos ter o compilador de linguagem C (gcc), o make (leitor de makefiles), e os cabeçalhos necessários para referenciar bibliotecas base do linux (linux-headers)


O que é o Compilador?

A Wikipédia (a enciclopédia livre) explica que um compilador é um programa que, a partir de um código escrito em uma linguagem, o código fonte (do inglês source code), cria um programa semanticamente equivalente porém escrito em outra linguagem, código objecto (do inglês object code).

Ou seja, o compilador é um programa que processa, valida e transforma um conjunto instruções escritas nos ficheiros fonte, em “objectos” ( que são outros ficheiros que contêm as mesmas instruções, mas num formato em código não inteligível).

Obviamente, os objectos só podem ser compilados se forem entendidos correctamente pelo compilador... ou seja, não podem haver erros sintácticos :)

Mas nesta fase, ainda não conseguimos gerar o ficheiro executável. Ainda temos de realizar a fase de "linkagem".

O que é o Linker?

A Wikipedia explica que o Linker, em informática, é um programa que liga objectos gerados por um compilador, formando assim o ficheiro executável final.

Portanto, o Linker pega nos ficheiros que acabamos de compilar, junta-lhe as bibliotecas necessárias (que estão programadas nos ficheiros fonte e na makefile) e gera o executável final.

E a makefile? E o Make? Para que servem?

Novamente a Wikipedia explica que o make é um programa de computador concebido para compilar automaticamente o código fonte de um programa. O make utiliza instruções contidas num ficheiro chamado "Makefile" e é capaz de resolver as dependências do programa que se pretende compilar.

Basicamente a ideia é ter uma receita com instruções, de modo a dar apenas um comando (ex: make install) e a partir daí a compilação e linkagem acontecer de forma completamente transparente para o utilizador, tal como ilustrado na figura.

Então e que tal um exemplo real de aplicação?

Imagine que o leitor tem uma placa WiFi que adquiriu num kit Adsl do Clix, e a placa não funciona bem com o Ubuntu. O Driver que vem de origem no Ubuntu não está muito bom.. e queremos corrigir o problema, instalado novos drivers "fresquinhos".

A placa USB tem o chip Zydas ZD1211 (abrindo a placa, estas letras devem estar bem visiveis no circuito integrado maior), e as instruções para instalação estão aqui :

http://doc.gwos.org/index.php/Zydas_ZD1211

Só para o leitor não se perder, aqui fica uma breve explicação do procedimento indicado:

Preparação (Preparation)


Remover o driver antigo:

>sudo modprobe -r zd1211

>sudo apt-get remove wpasupplicant


Instalar os pacotes e bibliotecas necessárias ao processo de compilação:

>sudo apt-get install linux-tree

>sudo apt-get update

>sudo apt-get install build-essential

>sudo apt-get install kernel-package

>sudo apt-get install gcc

>sudo apt-get install libncurses5

>sudo apt-get install libncurses5-dev

>sudo apt-get install libqt3-mt-dev

>sudo apt-get install wireless-tools


Descompactar o código fonte (em Linux os ficheiros compactados/agrupados podem estar no formato zip,tar,bz2,gz, etc) e criar um "symbolic link" (algo semelhante a uma shortcut ou atalho no Win):

>cd /usr/src

>sudo tar --bzip2 -xvf linux-2.6.12.tar.bz2

>sudo ln -s /usr/src/linux-2.6.12 /usr/src/linux


Criar outro "symbolic link" para os cabeçalhos Linux:

>sudo ln -s /usr/src/linux-headers-2.6.... /usr/src/linux-headers


Depois de fazer os downloads do openssl e das sources do Driver, é ainda necessário criar mais um "symbolic link" :

>sudo ln -s /usr/src/openssl/include /usr/src/wpasupplicant/openssl


Editar a makefile e garantir que a linha existe no ficheiro

"KERN_26=y KERNEL_SOURCE=/usr/src/linux" (sem aspas):

>sudo gedit Makefile


Finalmente [ufa :)] a compilação:

>sudo make

>sudo make install


Daqui resultam vários ficheiros, mas o único que interessa é o zd1211.ko, que deverá ser copiado para /lib/modules/...../net
(obviamente os ..... representam o nome de uma directoria cujo nome depende da versão do driver)


E por último, carregar o driver :

>sudo modprobe -v zd1211


Ok, ok, já sabemos que isto foi bastante complicado....... mas afinal, era este o objectivo desta "lição"...... como instalar algo da forma complicada :))

Até à próxima!

Tecnobugiganga