You are on page 1of 126

LABORATRIO DE MEIOS POROSOS E PROPRIEDADES TERMOFSICAS e NCLEO DE PESQUISA EM CONSTRUO

Apostila de Programao Orientada a Objeto em C++ Parte V- Programao para Linux

Andr Duarte Bueno, UFSC-LMPT-NPC http://www.lmpt.ufsc.br/~andre email: andre@lmpt.ufsc.br Verso 0.4.5 12 de dezembro de 2002

Apostila de CVS. Verso 0.4.5 Distribuda na forma GFDL (http://www.gnu.org/licenses/licenses.html#TOCFDL). Copyright (C) 2002 - Andr Duarte Bueno. Esta apostila textbook livre; voc pode redistribu-la e/ou modic-la sob os termos da Licena Pblica de Documentos da GNU (GFDL), conforme publicada pela Free Software Foundation; verso 1.2 da Licena como (a seu critrio) qualquer verso mais nova; preservando as sees no Invariant Sections no Front-Cover Texts, and no Back-Cover Texts. Uma cpia da licena localizada no captulo GNU Free Documentation License.Esta apostila software livre; voc pode redistribula e/ou modic-la sob os termos da Licena Pblica Geral GNU, conforme publicada pela Free Software Foundation; tanto a verso 2 da Licena como (a seu critrio) qualquer verso mais nova. Desenvolvida no Laboratrio de Meios Porosos e Propriedades Termofsicas (http://www.lmpt.ufsc.br) e no Ncleo de Pesquisa em Construo (http://www.npc.ufsc.br), com apoio do Curso de Ps-Graduao em Engenharia Mecanica (http://www.posmec.ufsc.br) e da Universidade Federal de Santa Catarina (http://www.ufsc.br).

Sumrio
I
1

Programao Para GNU/Linux, Unix


Introduo a Programao GNU/Linux, Unix 1.1 Termos e conceitos utilizados . . . . . . . 1.2 O bsico do GNU/Linux, Unix . . . . . . 1.2.1 Comandos do shell teis . . . . . 1.2.2 Expresses regulares3 . . . . . . 1.2.3 Programas telnet e ftp . . . . . . 1.3 Diretrios teis para programadores . . . 1.4 Programas teis para programadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9
10 11 12 12 19 20 22 23 25 25 25 25 26 26 27 27 27 27 28 30 30 32 32 33 36 36 37 37 38

Edio de Texto Emacs e VI 2.1 Introduo ao editor emacs . . . . . . . . . . . . . . . 2.2 Comandos do editor emacs . . . . . . . . . . . . . . . 2.2.1 Help . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 Movimento do cursor (use as setas de direo) 2.2.3 Cut/Copy/Paste/Undo . . . . . . . . . . . . . 2.2.4 Arquivos . . . . . . . . . . . . . . . . . . . . 2.2.5 Pesquisa e substituio . . . . . . . . . . . . . 2.2.6 Mltiplas janelas . . . . . . . . . . . . . . . . 2.2.7 Encerrando seo do Emacs . . . . . . . . . . 2.3 Comandos do editor vi . . . . . . . . . . . . . . . . . Os programas diff, patch, indent 3.1 O programa diff . . . . . . . 3.1.1 Sentenas para o diff 3.2 O programa patch . . . . . . 3.3 O programa indent . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Compilando com gcc, g++ 4.1 Prottipo e parmetros do gcc/g++ . 4.2 Arquivos gerados pelo gcc/g++ . . . 4.3 Exemplo de uso do gcc/g++ . . . . 4.4 Sentenas para o compilador da gnu

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

SUMRIO 5 Make 5.1 Um arquivo de projeto . . . . . . . . . . . . . . . 5.2 Prottipo e parmetros do make . . . . . . . . . . 5.3 Formato de um arquivo Makele . . . . . . . . . . 5.3.1 Criando variveis em um arquivo Makele 5.3.2 Criando alvos em um arquivo Makele . . 5.4 Exemplo de um arquivo Makele . . . . . . . . . . 5.5 Sentenas para o make . . . . . . . . . . . . . . .

3 39 39 39 40 40 41 41 43 44 44 44 45 46 47 47 48 48 48 48 49 50 51 51 54 55 55 55 56 56 57 57 57 58 58 60 60 60 60 61 62 62 62

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

Bibliotecas 6.1 Introduo a montagem de bibliotecas . . . . . . . . . 6.1.1 ar . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 ranlib . . . . . . . . . . . . . . . . . . . . . . 6.1.3 nm . . . . . . . . . . . . . . . . . . . . . . . 6.1.4 objdump . . . . . . . . . . . . . . . . . . . . 6.1.5 ldd . . . . . . . . . . . . . . . . . . . . . . . 6.1.6 ldcong . . . . . . . . . . . . . . . . . . . . . 6.2 Conveno de nomes para bibliotecas . . . . . . . . . 6.3 Bibliotecas usuais . . . . . . . . . . . . . . . . . . . . 6.4 Montando uma biblioteca esttica (libNome.a) . . . . . 6.4.1 Usando uma biblioteca esttica . . . . . . . . . 6.5 Montando uma biblioteca dinmica (libNome.so) . . . 6.5.1 Usando uma biblioteca dinmica . . . . . . . . 6.5.2 Vantagens/desvantagens da biblioteca dinmica 6.6 Sentenas para bibliotecas . . . . . . . . . . . . . . . Libtool 7.1 Introduo ao libtool2 . . . . . . . . . . . . . . 7.2 Forma de uso do libtool . . . . . . . . . . . . . 7.3 Criando uma biblioteca sem o libtool . . . . . . 7.4 Criando uma biblioteca esttica com o libtool . 7.5 Criando uma biblioteca dinmica com o libtool 7.6 Linkando executveis . . . . . . . . . . . . . . 7.7 Instalando a biblioteca . . . . . . . . . . . . . 7.8 Modos do libtool . . . . . . . . . . . . . . . . 7.9 Sentenas para o libtool . . . . . . . . . . . . . Debug (Depuradores, Debuggers) 8.1 Introduo ao debuger . . . . 8.2 Comandos do gbd . . . . . . . 8.3 Exemplo de uso do gdb . . . . 8.4 Sentenas para o gdb . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Proler (gprof)2 9.1 Introduo ao gprof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Sentenas para o proler: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

SUMRIO 10 Verso de Depurao, Final e de Distribuio 10.1 Verso debug, release e de distribuio . . . . . . 10.1.1 Verso debug . . . . . . . . . . . . . . . 10.1.2 Verso nal (release) . . . . . . . . . . . 10.1.3 Distribuio dos programas e bibliotecas 10.2 Sentenas para distribuio de cdigo fonte . . .

4 64 64 64 64 64 67 68 68 68 68 69 70 72 74 75 78 78 80 80 80 81 81 81 82 82 85 85 85 86 86 86 87 87 90 92 93 94 94 95 95 95

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

11 Documentao de Programas Usando Ferramentas GNU/Linux 11.1 Introduo a documentao de programas . . . . . . . . . . . 11.2 Documentao embutida no cdigo com JAVA_DOC . . . . . 11.2.1 Exemplo de cdigo documentado . . . . . . . . . . . 11.2.2 Sentenas para documentao java_doc . . . . . . . . 11.3 Tutorial de congurao e uso do DOXYGEN . . . . . . . . . 11.3.1 Exemplo de programa documentado . . . . . . . . . . 11.3.2 Exemplo de diagramas gerados pelo doxygen . . . . . 11.4 Documentao prossional com sgml/xml (LYX) . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

12 Seqencia de Montagem de Um Programa GNU2 12.1 Introduo a programao multiplataforma com GNU . . . . . . . . . . . . . . . . . 12.2 aclocal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 ifnames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 autoscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1 Roteiro do autoscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5 autoheader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.1 Roteiro do autoheader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 automake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6.1 Introduo ao automake . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6.2 Sentenas para o automake . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7 autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7.1 Introduo ao autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7.2 Prottipo do autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7.3 Roteiro do autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7.4 Estrutura de um arquivo congure.in . . . . . . . . . . . . . . . . . . . . . . 12.7.5 Exemplo de um arquivo congure.in . . . . . . . . . . . . . . . . . . . . . . 12.7.6 Macros do autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7.7 Como aproveitar os resultados das pesquisas realizadas pelo autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7.8 Variveis denidas no arquivo congure.in e que sero substitudas no arquivo Makele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.8 autoreconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.9 ./congure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.10Como incluir instrues do libtool em seu pacote gnu . . . . . . . . . . . . . . . . . 12.10.1 Exemplo de arquivo makele.am usando o libtool . . . . . . . . . . . . . . . 12.10.2 Exemplo de arquivo congure.in usando o libtool . . . . . . . . . . . . . . . 12.11Exemplo Completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

SUMRIO 13 Introduo ao Controle de Verses Com o CVS 13.1 O que o CVS? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Comandos do cvs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3 Seqencia de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.1 Roteiro para criar um repositrio . . . . . . . . . . . . . . . . . . . . . 13.3.2 Para importar os arquivos de seu projeto antigo para dentro do repositrio 13.3.3 Para baixar o projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.4 Para criar mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.5 Para adicionar/remover arquivos e diretrios . . . . . . . . . . . . . . . . 13.3.6 Para atualizar os arquivos locais . . . . . . . . . . . . . . . . . . . . . . 13.4 Verses, tags e releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.1 Entendendo as verses . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.2 Para criar tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.3 Para criar releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.4 Recuperando mdulos e arquivos . . . . . . . . . . . . . . . . . . . . . 13.5 Para vericar diferenas entre arquivos . . . . . . . . . . . . . . . . . . . . . . . 13.6 Vericando o estado do repositrio . . . . . . . . . . . . . . . . . . . . . . . . . 13.6.1 Histrico das alteraes . . . . . . . . . . . . . . . . . . . . . . . . . . 13.6.2 Mensagens de log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.6.3 Anotaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.6.4 Vericando o status dos arquivos . . . . . . . . . . . . . . . . . . . . . . 13.7 Ramos e Misturas (Branching and Merging) . . . . . . . . . . . . . . . . . . . . 13.7.1 Trabalhando com ramos . . . . . . . . . . . . . . . . . . . . . . . . . . 13.7.2 Mesclando 2 verses de um arquivo . . . . . . . . . . . . . . . . . . . . 13.7.3 Mesclando o ramo de trabalho com o ramo principal . . . . . . . . . . . 13.8 Congurao do cvs no sistema cliente-servidor3 . . . . . . . . . . . . . . . . . 13.8.1 Variveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.9 Como baixar programas de terceiros usando o cvs . . . . . . . . . . . . . . . . . 13.10Frontends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.11Sentenas para o cvs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.12Um diagrama com os comandos do cvs . . . . . . . . . . . . . . . . . . . . . .

5 100 100 101 103 103 104 105 106 107 110 111 111 111 113 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 121 124

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Lista de Figuras
2.1 11.1 11.2 11.3 11.4 13.1 13.2 13.3 13.4 13.5 13.6 13.7 O editor de texto emacs (observe o tem de menu C++). . . . . . . . . . . . . . . . . Ilustrao da hierarquia TMatriz da biblioteca LIB_LMPT. . . . . . . . . . Ilustrao da hierarquia da classe TRotulador3D da biblioteca LIB_LMPT. . Ilustrao das dependncias do arquivo TRotulador3D. . . . . . . . . . . . O site do LYX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verses de um arquivo. . . . . . . . . . . . . . . . . . . . Criando um tag. . . . . . . . . . . . . . . . . . . . . . . . Criando um release. . . . . . . . . . . . . . . . . . . . . . Como cam os ramos. . . . . . . . . . . . . . . . . . . . Um frontend para o cvs no GNU/Linux, Unix (o cervisia). Um frontend para o cvs no Windows. . . . . . . . . . . . Diagrama com os comandos do cvs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 74 75 76 77 111 112 113 118 122 123 124

Lista de Tabelas
1.1 1.2 6.1 8.1 Diretrios importantes para o programador. . . . . . . . . . . . . . . . . . . . . . . Programas teis para desenvolvedores de software no ambiente GNU/Linux. . . . . . Bibliotecas usuais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comandos do gdb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 24 49 61 79 79

12.1 Sequncia executada pelo programador para montagem de programas multi-plataforma usando o padro GNU. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Sequncia executada pelo usurio. . . . . . . . . . . . . . . . . . . . . . . . . . . .

Listings
Arquivo e06a-hello.cpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo e06b-hello.cpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo diff. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo diff -c. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo diff -u. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo ex-vector-1-indent.cpp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo makele. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de uso do programa make. . . . . . . . . . . . . . . . . . . . . . . . . . . Sada do comando ar - -help. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sada do comando nm help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sada do comando ldd /usr/bin/lyx. . . . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo makele com bibliotecas estticas e dinmicas. . . . . . . . . . . . . . . . . Arquivo mostrando o uso do makele. . . . . . . . . . . . . . . . . . . . . . . . . . Arquivo libtool - -help. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de arquivo de congurao do doxygen com comentrios. . . . . . . . . . Sada do comando doxygen - -help. . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de cdigo documentado no formato JAVA_DOC para uso com o programa doxygem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1 Sada do comando: cvs - -help-options . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 Sada do comando: cvs - -help-commands . . . . . . . . . . . . . . . . . . . . . . . 13.3 Sada do comando: cvs- -help-synonyms . . . . . . . . . . . . . . . . . . . . . . . . 13.4 Sada do comando: cvs import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.5 Como ca o repositorio aps a importao . . . . . . . . . . . . . . . . . . . . . . . 13.6 Sada do comando: cvs -H checkout . . . . . . . . . . . . . . . . . . . . . . . . . . 13.7 Sada do comando: cvs -H commit . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.8 Sada do comando cvs commit aps adio de um mdulo . . . . . . . . . . . . . . 13.9 Sada do comando: cvs -H update . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.10Sada do comando: cvs -tag nome . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.11Sada do comando: cvs commit -r 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 13.12Sada do comando: cvs-diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.13Sada do comando: cvs -log leiame.txt . . . . . . . . . . . . . . . . . . . . . . . . . 13.14Sada do comando: cvs -status leiame.txt . . . . . . . . . . . . . . . . . . . . . . . . Lista de programas 3.1 3.2 3.3 3.4 3.5 3.6 5.1 5.2 6.1 6.2 6.3 6.4 6.5 7.1 11.1 11.2 11.3 30 31 31 31 32 34 41 42 45 46 47 51 53 55 71 72 72 101 101 102 104 105 105 107 107 110 112 114 115 116 117

Parte I Programao Para GNU/Linux, Unix

Captulo 1 Introduo a Programao GNU/Linux, Unix


Esta parte da apostila contm dicas e instrues para montagem de programas usando o formato multiplataforma da GNU. Inicialmente apresenta-se uma lista de comandos do shell e de programas teis no ambiente GNU/Linux. Descreve-se o programa, sua utilidade, os arquivos de congurao e os parmetros opcionais. Quando conveniente apresenta-se um exemplo. A seguir descreve-se o uso dos editores emacs e vi, e os programas diff, patch e indent. Descrevese o compilador gcc/g++ e o make para montagem de programas pequenos. Como montar bibliotecas, o uso do debuger e do proler, como distribuir seu cdigo, como documentar seus programas. Depois, apresenta-se um roteiro para montar programas completos usando o padro GNU. O texto aqui apresentado um texto introdutrio. Um texto intermedirio, que abrange diversos aspectos da programao para GNU/Linux (ferramentas da gnu, processos, sinais, device drives, programao em ambientes grcos) encontrado no livro Linux Programming Unleashed de Kurt Wall et al. Em portugus existe o Programando com Ferramentas GNU (editado pela conectiva). Textos avanados so os manuais disponibilizados na internet, isto , para aprender em detalhes o autoconf, baixe o manual do autoconf, o mesmo vlido para os demais tpicos apresentados nesta apostila. Este resumo tem como base as pginas man e os manuais pblicos do make (3.78), egcs (1.1.2), egcs++ (1.1.2), aucotonf (2.13), automake (1.4), libttol1 , o manual do doxygen e artigos da revista do GNU/Linux (http://www.revistadolinux.com.br). Tambm foram consultadas as referncias [13, 9, 12, 11, 3] [2, 10, 1, 4] [8] [7, 5].

1 Estes

manuais so encontrados, em ingls, no site da gnu (http://www.gnu.org).

10

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX

11

1.1

Termos e conceitos utilizados2

Apresenta-se aqui, brevemente, uma explicao dos termos utilizados no mundo do software livre. Linux: clone livre do kernel do UNIX, escrito a partir do zero por Linus Torvalds, com a ajuda de um grupo de programadores espalhados pela internet [isto , o linux somente um KERNEL]. Foi projetado para estar em conformidade com o POSIX e com a Single Unix Specication. GNU: acrnimo para GNU no UNIX. GNU o nome de um sistema operacional completo e compatvel com UNIX escrito a partir de 1983 por Richard Stallman e inmeros hackers da comunidade de software livre espalhados pela internet. O GNU um sistema 100% livre, ou seja, ele fornece as 4 liberdades bsicas do software livre: A liberdade de uso, modicao, cpia e publicao de verses modicadas. GNU/Linux: sistema operacional GNU 100% livre que utiliza o Linux como kernel. GNU/Linux a variante mais conhecida do sistema GNU. GPL: licena de software livre mais utilizada no mundo. A caracterstica que qualquer trabalho derivado de um software livre sob GPL, obrigatoriamente deve permanecer livre. A GPL pode ser obtida em http://www.gnu.org/licenses/gpl.html, uma cpia apresentada no apndice ??. Cdigo Aberto: expresso utilizada para indicar que voc pode ver o cdigo fonte do programa. Entretanto, nada pode ser dito a respeito das condies sob as quais o cdigo fonte se encontra. Existem programas de cdigo aberto que no so livres pois o usurio, dependendo da licena, pode ser proibido de alterar e publicar o cdigo. Open Source Initiative: grupo desmembrado do movimento pelo software livre em 1998 e que rejeita a luta pela liberdade no uso do software. Seu objetivo disseminar a idia de que o cdigo fonte esteja disponvel e que as modicaes sejam permitidas gerando assim programas melhores. Apesar disto este grupo costuma recomendar o uso da licena GPL, que representa melhor o esprito do software livre. Isto torna os dois grupos cooperativos do ponto de vista de criao de softwares. Software Livre: Software que garante ao usurio plenas liberdades de uso, modicao, cpia e publicao de verses modicadas. A denio de software livre pode ser encontrada em: http://www.gnu.org/philosophy/free-sw.html. Movimento pelo Software Livre: Movimento surgido na dcada de 70 em conseqncia da crescente presso recebida para a adoo de softwares proprietrios e assinaturas de tratados de no-divulgao. O movimento ganhou forca a partir da dcada de 80 com o projeto GNU que libertava os usurios dos sistemas UNIX proprietrios. O GNU consolidou-se na dcada de 90 como um sistema completo e funcional atingindo uma qualidade tcnica comparvel aos melhores sistemas operacionais proprietrios. Em resumo, Linux um kernel e no um sistema operacional. Apesar de Linux ser comumente usado em referncia ao sistema operacional GNU/Linux voc deve evitar este uso equivocado por
2 Contribuio

do revisor Ricardo Grutzmacher (grutz@terra.com.br).

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX

12

questes de clareza tcnica e por questes de crdito ao projeto GNU que forneceu o seu sistema operacional para ser adaptado ao kernel Linux. Sempre que voc quiser falar do sistema operacional use o termo GNU/Linux. Desta forma voc estar levando adiante os ideais do software livre que esto representados no projeto GNU.

1.2

O bsico do GNU/Linux, Unix

Apresenta-se a seguir um guia com alguns comandos de shell do GNU/Linux, Unix, MacOS X, e que so teis para programadores.

1.2.1 Comandos do shell teis3


Lista-se a seguir alguns comandos de shell teis para programadores. Uma descrio mais detalhada dos mesmo pode ser encontrada em apostilas/livros sobre o GNU/Linux, Unix. Voc pode obter informaes simplicadas sobre estes comandos usando o programa man (de manual). Use o comando man nomeDoPrograma para ver um manual simples do programa. Verses mais atualizadas dos manuais destes programas so obtidos com info nomeDoPrograma. Voc tambm pode obter um help resumido usando nomeDoPrograma - -help. Nos exemplos apresentados a seguir, os comentrios aps o sinal # no devem ser digitados. Se voc j um usurio experiente do GNU/Linux pode pular esta parte. Diretrios . Diretrio atual. .. Diretrio pai (Ex: cd ..). ~ Diretrio HOME do usurio (Ex: cd ~). cd Muda diretrio corrente cd /home/philippi cd ../../usr cd #Caminho completo #Caminho relativo #Alterna para diretrio anterior

pwd Mostra a path do diretrio corrente. ls Lista o contedo do diretrio. -l -a -b -m -F -x


3 Uma

Lista detalhada. Mostra executvel e ocultos. Nmero de links do arquivo. Mostra tudo em uma linha. Mostra \ dos diretrios. Mostra em colunas.
excelente apostila de referncia sobre o GNU/Linux encontrada em http://www.cipsga.org.br.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX ls -F | egrep / tree Lista em rvore. tree -d mkdir Cria diretrio. mkdir mkdir mkdir mkdir test d1 d2 #Cria diretrios d1 e d2 d1/d2 #Cria d1 e o filho d2 -p d3/d31/d32 #Cria os diretrios d3 d3/d31 d3/d31/d32 #Lista somente os diretrios #mostra diretrios

13

mvdir Move ou renomeia um diretrio. rmdir Remove o diretrio. -R #Recursivo, elimina subdiretrios (usar com cuidado). rmdir -p d3/d31/d32 #Remove todos os diretrios rm -R diretorio #Remove o diretrio e seus sub-diretrios Arquivos cp a1 a2 Cpia arquivos e diretrios. -b -i -r -P -p -v -b cp a1 a2 mv Move arquivos (renomeia arquivos). -b -v -i Cria backup. Modo verbose. Iterativa. mv a1 a2 mv d1 d2 mv -b a1 a2 #Renomeia arq a1 para a2 #Renomeia dir d1 para d2 #Renomeia com backup www.lmpt.ufsc.br - Eng. Andr Duarte Bueno Cria backup de a2. Copia iterativa. Cpia recursiva. Cpia arquivo e estrutura de diretrio. Preserva as permisses e horas. Modo verbose. Cria backup.

Apostila de Programao Para Linux/Unix

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX rm Remove arquivos (retira links). -d -i -r -f Remove diretrio. Remove iterativamente. Remove diretrios recursivamente. Desconsidera conrmao. #S execute o comando abaixo em um subdiretrio sem importncia rm -f -r * #Remove tudo (*) sem pedir confirmao ln Linka arquivos e diretrios (um arquivo com link s deletado se for o ltimo link). ln -f chap1 intro ln origem link ln -s origem link

14

#Cria link permanente #Cria link simblico

nd O nd usado para pesquisar arquivos em seu HD. nd -name -print -type -atime -size -o -xdev path expresso Informa o nome do arquivo. Mostra a path. Informa o tipo. Informa dados de data. Informa tamanho(+ ou -). Aceita repetio de parmetro (Other). Desconsidera arquivos NFS.

-exec [comando [opcoes]] Permite executar comando. #Para achar arquivos core: find / -name core #Para localizar arquivos do usurio: find PATH -USER nomeUsurio #Para localizar arquivos *.cpp: find PATH -name *.cpp #Para localizar e remover arquivos .o: find PATH -name *.o | xargs rm #Localizando tudo com a extenso *.o e *.a find -name *.o-o -name *.a #PS: exec s funciona com alguns programas, melhor usar xargs. find -type f -atime +100 -print find . -size +1000k find ~/ -size -100k find [a-c]???? find file[12] Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX head n Mostrar as primeiras n linhas de um arquivo. head -5 nome.txt tail n Exibe arquivo a partir de uma linha. tail -20 nome.txt nl Nmero de linhas do arquivo. wc Nmero de linhas, de palavras e de bytes do arquivo. cat arq1 Mostra contedo do arquivo arq1. cat a1 a2 Mostra arquivos a1 e depois a2 cat -n a2 Mostra contedo de a2 com numerao cat f1 cat > texto.txt ...digita o texto... contrl+d cat a1 a2 > a3 cat a > > b ls -la | cat -n #Mostra arquivo f1 #Cria novo arquivo:

15

#Finaliza arquivo #Concatena a1 e a2 e armazena em a3 #Acrescenta ao final do arquivo b o arquivo a

less arq Mostra contedo do arquivo (+completo) #/str para localizar a string str no texto visualizado less arq #q para sair le arq Informa o tipo de arquivo. file * file * | egrep directory tr Converte cadeias de caracteres em arquivos. ls | tr a-z A-Z #de minsculas para maisculas xargs Facilita passagem de parmetros para outro comando. xargs [opes][comando [opes]] #Procura e deleta arquivos *.cpp find /tmp -name "*.cpp" | xargs rm

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX Pesquisa dentro de arquivos grep O grep usado para pesquisar o que tem dentro de um arquivo. -n -F -c -i -s -v -A n -B n -r -f Mostra nmero da linha. O grep funciona como o fgrep. Retorna nmero de coincidncias. Desconsidera maisculas/minsculas. Desconsidera mensagens de erro. Modo verbose. Lista tambm as n linhas posteriores. Lista tambm as n linhas anteriores. Ordem inversa. Usa arquivo auxiliar.

16

man grep #Mostra detalhes do grep greep -v buble sort.c ls -l | egrep "Julia" #Lista diretrio e pesquisa pelo arquivo julia ls -la | egrep "Sofia" grep ^[0-9] guide.txt grep "(b)" guide.txt grep arqAux guide.txt # Pesquisa em guide.txt usando arqAux sort Ordena arquivos. -c -o -d -f -t -s Verica arquivo. Especica nome arquivo sada. Ordem dicionrio. Despreza diferena maiscula/minscula. Atualiza data e hora. Modo silencioso. sort -r arquivo ls | sort -r #Ordem invertida #Ordena a listagem de diretrio a partir da 4 coluna,considerando nmero ls -l |egrep rwx | sort +4n Compactao e backup zip Compatvel com pkzip/pkunzip do DOS. unzip Unzipa arquivos zip.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX zip -r nome.zip nomeDiretrio unzip nome.zip gzip / gunzip Compacta/Descompacta arquivos com a extenso: gz,.Z,-gz,.z,-z -c -d -S -f -l -r -t -v -1 -9 Mostra arquivo na tela. Descomprime o arquivo. Extenso do arquivo. Fora compresso. Lista arquivos. Mostra diretrios recursivamente. Testa integridade do arquivo. Modo verbose. Mais veloz e menos compactado. Mais lento e mais compactado. #Para compactar todo um diretrio tar -cvf nomeDiretorio.tar nomeDiretorio gzip nomeDiretorio.tar #Para descompactar gunzip nomeDiretorio.tar.gz tar -xvf nomeDiretorio.tar bzip2 Compactador mais eciente que o gzip. bunzip2 Descompacta arquivos bz2. bzip2recover Recupera arquivos bz2 extragados. -t -v Testa Modo verbose

17

bz2cat Descompacata para tela (stdout). lha Cria e expande arquivos lharc. unarj Descompacta arquivos arj. split til para copiar um arquivo grande para disquetes. Gera os arquivos xaa,xab,xac,... Veja man split. #Dividir um arquivo de 10mb em disketes de 1.44mb: split -b 1440kb nomeArquivoGrande.doc #Para recuperar use o cat: cat xaa xab xac > nomeArquivoGrande.doc Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX

18

tar O tar permite a voc agrupar um conjunto de arquivos em um nico, facilitando o backup (ou o envio pela internet). Pode-se ainda compactar os arquivos agrupados com o gzip. -c -v -z -f -w -r -x -A -d - -delete -t -u -N -o -w -C -G Cria novo arquivo. Modo verbose. Descompacta arquivos (*.tar.gz). NomeArquivo. Modo iterativo. Acrescenta no modo apende. Extrai arquivos. Concatena arquivos. Compara diferenas entre arquivos. Deleta arquivos. Lista o contedo do arquivo. Atualiza o arquivo. Aps a data tal. Extrai arquivos para monitor. Iterativa. Muda o diretrio. Backup incremental.

#Empacotando origem em destino tar -cf origem > destino.tar #Empacotando e j compactando tar -cvzf destino.tar.gz origem #Desempacotando tar -xf nome.tar tar -xzvf nome.tgz tar -xzvf nome.tar.gz tar -xvwf nome.tar #Backup completo no dispositivo /dev/fd0 tar cvfzM /dev/fd0 / #Backup tar xvfzM /dev/fd0 #Restaurao Diversos [*] Metacaracter. [?] Caracter coringa. clear Limpa a tela. date Mostra data e hora. date -s 8:50 #Acerta hora para 8:50 www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Apostila de Programao Para Linux/Unix

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX

19

1.2.2 Expresses regulares3


Alguns programas do GNU/Linux aceitam o uso de expresses regulares (principalmente os da GNU). O uso de expresses regulares til nas pesquisas de arquivos com nd, no uso do emacs, entre outros. Alguns caracteres so usados para passar parmetros para o interpretador das expresses regulares, para us-los na pesquisa, deve-se preceder o caracter com /. Veja abaixo alguns exemplos de expresses regulares.
[xyz] [^xy] [t-z] [a-zA-Z] [0-9] ^ $ \< \<search \> \>search z* Z+ A? revistas? A{m} [0-9]{3} Z{3,5} K{,7} K{3,} {0,} {1,} {0,1} () Qualquer das letras dentro do colchete. Exceto x e y. De t at z (tuvwxyz). Qualquer letra. Qualquer nmero. No incio do pargrafo. No m do pargrafo. No incio da palavra. Palavra que inicia com search. No m da palavra. Palavra que termina com search. Letra z, 0 ou mais vezes: z,zz,zzz,zzzz,... Letra Z, 1 ou mais vezes. Letra A pode ou no fazer parte. revista ou revistas. Letra A m vezes. Nmero de 3 dgitos. Letra Z de 3 a 5 repeties zzz,zzzz,zzzzz At 7 repeties de K. No mnimo 3 repeties de K. O mesmo que *. O mesmo que +. O mesmo que ?. Usado para deixar a expresso mais clara (precedncias).

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX Linux-(6|6.1|6.2), Acha Linux-6, Linux-6.1, Linux-6.2. O uso de () cria variveis internas que podem ser acessadas como nos exemplos abaixo:
(quero)-\1 = quero-quero.

20

([a-zA-Z]\1 Qualquer letra espao qualquer letra. . \w \W | Qualquer caracter. Se estiver no meio de uma sentena use \. Qualquer letra. Nenhuma letra. Pipe (tubo).

Converso de wildcard (dos), para expresso regular.


*.txt arq.cpp arq?.cpp *\.txt. Arq\.cpp. Arq.\.cpp.

Cap[1-7].lyx Cap[1-7]\.lyx. arq{a,b} arq(a|b).

Exemplo: var=Avancado Dene varivel var, cujo contedo o diretrio Avancado. Para usar uma varivel denida use $var. ls var ls $var ls var No aceita (ls: var: Arquivo ou diretrio no encontrado). Mostra o contedo de var, do diretrio Avancado. No aceita aspas simples.

ls "echo $var" No interpreta contedo de aspas duplas. ls echo $var Interpreta o contedo que esta dentro da crase. for i in *.html; do mv $i $i.old ; done

1.2.3

Programas telnet e ftp

Apresenta-se a seguir os principais comandos dos programas telnet e ftp. Atualmente o telnet e o ftp esto sendo substituidos pelo ssh. O ssh um secure shell, permitindo acessar, copiar e pegar arquivos de mquinas remotas. Isto , o ssh funciona como o telnet e o ftp, mas com segurana.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX telnet

21

O telnet um programa que executado em seu computador e o conecta a outros computadores em qualquer lugar do mundo. como se voc estivesse executando os programas do computador remoto de dentro de seu computador.
Comando ? open display mode Set,unset send status Contrl +z fg logout close quit Descrio. Lista os comandos. Conecta com um computador remoto. Mostra os parmetros da operao. Modo linha a linha ou caracter a caracter. Seta os parmetros de operao. Transmitir caracteres especiais. Informaes de estatus. Suspende o telnet, chama o shell. Retorna do shell para o telnet. Volta para o ltimo programa em operao. Encerra conexo avisando. Fecha a conexo corrente. Encerra o telnet.

ftp O ftp precisa de 2 computadores, um cliente e outro servidor. O programa ftp cliente executado em seu computador e o programa ftp servidor em um computador remoto. O cliente envia comandos (como listar diretrios) para o servidor, o servidor responde (mostrando o diretrio). Depois de localizado o arquivo (que voc deseja baixar), o mesmo pode ser obtido com o comando get nome_do_arquivo. Com quit voc encerra a conexo ftp.
help ! ! comando Lista de todos os comandos ftp. Pausa o ftp e inicia o shell. Executa um comando do shell.

Conectando
open h user Inicia conexo com host h. Dene usurio.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX


ascii binary Transferncia de arquivo no formato ascii. Transferncia de arquivo no formato binrio.

22

hash yes/no Mostra o # do arquivo transferido. prompt yes/no Aguarda resposta para transferncia de mltiplos arquivos. status get mget send cd nome cdup dir ou ls lcd pwd quit close Exibe congurao atual. Puxa o arquivo para seu computador. Puxa diversos arquivos. Envia um arquivo (ou put, ou mput). Muda o diretrio. Diretrio pai. Mostra diretrio com detalhes. Muda diretrio local. Mostra a path corrente. Encerra a conexo. Encerra conexo.

Agora voc j conhece os comandos e programas mais utilizados em um terminal do GNU/Linux. Podendo navegar, criar, deletar e mover diretrios. Procurar e visualizar o contedo de arquivos. Como dito anteriormente, voc pode consultar o manual de sua distribuio para obter maiores informaes sobre estes comandos.

1.3

Diretrios teis para programadores

Quem programa no GNU/Linux precisa saber onde esto o diretrio com os programas do sistema, o diretrio onde so instalados os programas e onde esto as bibliotecas. Veja na Tabela ?? alguns destes diretrios. Tabela 1.1: Diretrios importantes para o programador. Diretrio /usr/bin /usr/local/bin /usr/include /usr/lib /usr/openwin/lib Descrio Programas do sistema. Programas locais esto aqui. Arquivos include Bibliotecas Bibliotecas do X window

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX

23

1.4

Programas teis para programadores

Apresenta-se na Tabela ?? uma lista de programas teis usados no desenvolvimento de programas no GNU/Linux. Estes programas sero detalhados posteriormente.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 1. INTRODUO A PROGRAMAO GNU/LINUX, UNIX

24

Tabela 1.2: Programas teis para desenvolvedores de software no ambiente GNU/Linux. Programas utilitrios Ambientes de desenvolvimento Ambiente para desenvolvimento no KDE Ambiente de desenvolvimento semelhante ao Borland Ambiente para desenvolvimento no GNOME Editor de texto Editor de texto simples Compiladores Compilador C da GNU Compilador C++ da GNU Compilao automatizada Linkagem Depurao Depurador C da GNU Depurador do KDE (kdevelop) Programas GNU Compliant Gerao dos scripts de congurao Gerao dos scripts Makele Pacote de gerao de bibliotecas Programas Diversos Traa informaes, chamadas a bibliotecas Controle de verses Formatao do cdigo Diferenas entre arquivos Formata o cdigo Organiza o cdigo (layout) Analisador lxico Documentao Gera documentao a partir de tags no cdigo. Gerao de diagramas de classes Manipulao binria Binary le descriptor Prole (analizador de desempenho) Montagem de bibliotecas ndices das bibliotecas Informaes sobre objetos

kdevelop xwpe glade emacs gcc g++ make ld gdb kdbg autoconf automake libtool ltrace CVS diff bison indent ex,ex++ doxygen graphviz bfd binutil gprof ar ranlib objdump

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 2 Edio de Texto Emacs e VI


Apresenta-se neste captulo uma breve descrio dos comandos dos editores emacs e vi.

2.1

Introduo ao editor emacs

O emacs, ilustrado na Figura ?? um bom editor de texto. O emacs oferece um conjunto de funes especcas para o desenvolvimento de seus programas em C++. Ao salvar o arquivo com a extenso *.h ou *.cpp, automaticamente o emacs mostra a sintaxe de C++ atravs do syntax-highlight, isto , o texto aparece colorido. Para maiores informaes sobre o emacs procure no http://www.altavista.com por emacs programming. Se voc gosta de outros editores de texto, no tem problema. Use o que voc conhece.
Os principais comandos de um editor de texto so os famosos cut (ctrl+w), copy (alt+w) e past (ctrl+y). O undo (ctrl+x+u), o search (ctrl+s+palavra), e o comando para salvar o arquivo (ctrl+x ctrl+s) e fechar o programa (ctrl+x ctrl+c). Apresenta-se nas sees que seguem os principais comandos do editor emacs.

2.2 Comandos do editor emacs


Lista-se a seguir, de forma resumida os principais comandos do emacs. A letra ^ representa o CTRL.

2.2.1
^+h n ^h i ^h m ^h a ^h t ^h f

Help
Emacs news. Info. Modo de descrio. Comando apropos. Emacs tutorial. Descrio da funo.

25

CAPTULO 2. EDIO DE TEXTO EMACS E VI


^-x Alt-x Acesso a funo de um nico caracter. Acesso a comando de uma palavra.

26

2.2.2
Alt+< Home pageUp ^p ^b ^f ^a ^e

Movimento do cursor (use as setas de direo)


Inicio do arquivo. Inicio do arquivo. Inicio da pgina. Incio do pargrafo. Linhas. Fim do pargrafo.

Alt+b Alt+f Palavras. Alt+> pageDown End Fim do arquivo. Fim da pgina. Fim do arquivo.

2.2.3
Alt+w ^w ^y ^x u ^_ Alt+y ^d del Alt+d Alt+del ^k Alt+k

Cut/Copy/Paste/Undo
Copy. Cut. Paste. Undo. Undo. Paste sucessivo. Apaga a letra a direita. Apaga a letra a esquerda. Apaga a palavra a direita. Apaga a palavra a esquerda. Apaga toda a linha a direita. Apaga toda a linha a direita inclusive retorno de carro.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 2. EDIO DE TEXTO EMACS E VI

27

2.2.4 Arquivos
^x ^f ^x ^d ^x ^s ^x ^w ^x ^d ^x 1 ^x 2 ^x i ^x ^b Abre um arquivo do disco ou cria novo. Abre o diretrio. Salva o arquivo em disco. Salvar como. Abre um diretrio. Uma janela. Duas Janelas. Inserir o arquivo. Lista os buffers.

2.2.5
Alt+%

Pesquisa e substituio
Entre com a string A Entre com a string B #Pede conrmao Entre com a string A Entre com a string B #No pede conrmao

Alt+x repl s

Pesquisa
^s palavra ^r palavra Procura pela palavra (para baixo). Procura pela palavra (para cima).

2.2.6
^u 0^] ^mv ^xo ^x2 ^x1

Mltiplas janelas
Posiciona no inicio da janela Scroll para nal da janela Alterna janela ativa Duas janelas Uma janela ativa

2.2.7
^x ^c ^z

Encerrando seo do Emacs


Sai do Emacs. Suspende o Emacs.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 2. EDIO DE TEXTO EMACS E VI Sentenas para o emacs AUTO SAVE: O emacs salva automaticamente os arquivos em disco com o nome: "#nomeArquivo#. Quando voc salva o arquivo em disco deixa de existir o autoSave. A Linha de informaes mostra: O nome do arquivo, a linha, a percentagem

28

2.3
:w :q :q! :e :!com :r arq

Comandos do editor vi
Salva arquivo em disco. Para sair. Sai mesmo que o arquivo tenha sido alterado. Edita outro arquivo. Executa comando do shell. L outro arquivo na posio do cursor.

Editor de texto simples e eciente.

Exemplo: vi arquivo #Edita o arquivo man vi #Maiores informaes sobre o vi

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 2. EDIO DE TEXTO EMACS E VI

29

Figura 2.1: O editor de texto emacs (observe o tem de menu C++).

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 3 Os programas diff, patch, indent


Apresenta-se neste captulo uma breve introduo aos programas diff, patch e indent. Este captulo pode ser lido mais tarde sem perda de seqencia.

3.1

O programa diff

O programa diff usado para mostrar as diferenas entre 2 arquivos, isto , compara dois arquivos linha a linha. O programa diff muito til, o mesmo usado para comparar verses de um mesmo arquivo (veja Captulo ??) e para gerar arquivos de patch (veja seo ??). Prottipo e parmetros do diff: diff [opes] Arq1 Arq2 -b -c -i -q -r -v -xpattern -u Ignora espaos em branco. Gera sada mostrando os 2 arquivos e as diferenas. Ignora diferenas entre maisculas e minsculas. Apenas informa se os arquivos so iguais ou diferentes. Compara diretrios recursivamente. Mostra verso do diff. Quando compara diretrios, considerar arquivos com a extenso pattern. Formato unicado (+ claro).

Veja a seguir o arquivo e06a-hello.cpp, um programa simples em C++. Listing 3.1: Arquivo e06a-hello.cpp.
#include < iostream > int main () { std :: cout < < " Oi tudo bem " << std :: endl ; return 0; }

30

CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT

31

O arquivo e06a-hello.cpp foi modicado e salvo como e06b-hello.cpp. Veja a seguir o arquivo e06b-hello.cpp, observe que foram acrescentadas 4 linhas novas e o return foi alinhado. Listing 3.2: Arquivo e06b-hello.cpp.
#include < iostream > int main () { std :: cout < < " Oi tudo bem " << std :: endl ; std :: cout < < " Entre com x " << std :: endl ; int x; cin >>x; std :: cout < < "x= " <<x << std :: endl ; return 0; }

Veja a seguir o arquivo gerado pelo comando: diff e06a-hello.cpp e06b-hello.cpp. O smbolo < indica que esta linha saiu ( velha). O smbolo > indica que esta linha entrou ( nova). Listing 3.3: Arquivo diff.
6c6 ,11 < return 0; --> std :: cout < < " Entre com x " < < std :: endl ; > int x; > cin >>x; > std :: cout < < " x = " < <x << std :: endl ; > > return 0;

Observe a linha 6c6,11. A mesma signica que a linha 6 do arquivo e06a-hello.cpp e a linha 6 do arquivo e06b-hello.cpp so diferentes, existe um espao extra no arquivo e06a-hello.cpp. O c indica modicado (changed). Podem aparecer as letras a de adicionado, c de modicado (changed) e d de deletado. Veja a seguir o arquivo gerado pelo comando: diff -c e06a-hello.cpp e06b-hello.cpp. Observe que os dois arquivos so mostrados na ntegra. O caracter ! indica as linhas que foram alteradas. Listing 3.4: Arquivo diff -c.
*** e06a - hello . cpp Tue Jun 4 13:23:49 2002 --- e06b - hello . cpp Tue Jun 4 13:24:46 2002 *************** *** 3 ,8 **** int main () { std :: cout < < " Oi tudo bem " < < std :: endl ; ! return 0; } - - - 3 ,13 - - - int main () { std :: cout < < " Oi tudo bem " < < std :: endl ; ! std :: cout < < " Entre com x " < < std :: endl ;

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT


! ! ! ! ! } int x; cin >>x; std :: cout < < " x = " < <x << std :: endl ; return 0;

32

Veja a seguir o arquivo gerado pelo comando: diff -u e06a-hello.cpp e06b-hello.cpp. No incio do arquivo a nomenclatura - - - se refere ao arquivo e06a-hello.cpp e +++ ao arquivo e06b-hello.cpp. Observe que no formato -u aparecem todas as linhas precedidas por um sinal +/-. O sinal - indica que a linha saiu e o sinal + que entrou. Listing 3.5: Arquivo diff -u.
--- e06a - hello . cpp Tue Jun 4 13:23:49 2002 +++ e06b - hello . cpp Tue Jun 4 13:24:46 2002 @@ -3 ,6 +3 ,11 @@ int main () { std :: cout < < " Oi tudo bem " < < std :: endl ; return 0; + std :: cout < < " Entre com x " < < std :: endl ; + int x; + cin >>x; + std :: cout < < " x = " < <x << std :: endl ; + + return 0; }

3.1.1

Sentenas para o diff

O formato gerado pelo diff -u o mais claro. Voc pode gerar um arquivo com as diferenas. Exemplo: diff e06a-hello.cpp e06b-hello.cpp > diferencas.txt O formato padro gerado pelo diff usado pelo programa patch. Existem outros programas para comparar arquivos, veja nas pginas man de seu GNU/Linux os programas: diff3 (compara 3 arquivos), wdiff, mp, sdiff. Ao editar a sada do comando diff no programa emacs, o mesmo aparece com sintaxe especial.

3.2
1 Veja

O programa patch1
na seo ?? o uso dos programas diff e patch para distribuio de upgrades de programas.

O programa path usado para unicar arquivos.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT Prottipo e parmetros do patch: patch [-u-v] arquivoAntigo arquivoDiferencas. -u -v

33

O arquivo das diferenas foi gerado usando a verso unicada (opo -u no diff). Mostra verso do programa patch.

Dados os arquivos arq1.cpp, arq2.cpp e o arquivo das diferenas gerado pelo diff, voc pode atualizar o arquivo arq1.cpp de forma que o mesmo tenha o mesmo contedo do arq2.cpp. Veja o exemplo. Exemplo: diff arq1.cpp arq2.cpp > diferencas.cpp //Vai modificar o arq1 e o mesmo ficar igual a arq2 patch arq1.cpp diferencas.cpp Ou seja, o programa patch junta os arquivos arq1.cpp e diferencas.cpp criando o arquivo arq2.cpp.

3.3

O programa indent

O programa indent usado para deixar o cdigo organizado, atravs do uso de padres de indentao. Existe um padro default, pr-estabelecido, mas voc pode denir os padres a serem utilizados. Veja a seguir o prottipo de uso do indent. Lista-se, de forma abreviada, algumas das opes que podem ser passadas para o indent. Estes parmetros podem ser armazenados no arquivo .indent.pro. Prottipo: indent le [-o outle ] [ opes ] indent le1 le2 ... leN [ opes ] -st -gnu -orig -v -l60 -bad -bap -bbb -sc -bl5 -bn -bli5 -bls -cli2 Envia sada para tela. Usa opes de formatao da GNU. Usa opes de formatao da Berkeley. Modo verbose. Limita a 60 colunas. Linha em branco aps declaraes (Para desativar, -nbad). Linha em branco aps denies de funes (-nbap). Linha em branco antes de uma caixa de comentrio. Comentrios no estilo de C /* * */. Colchetes do bloco alinhados a 5 caracteres. Bloco alinhado. Bloco alinhado com 5 espaos. Alinha o par{ }. Bloco switch alinhado com espao 2. www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Apostila de Programao Para Linux/Unix

CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT -npcs -cs -di16 -bfda -lp Sem espao entre o nome da funo e o (). Espao depois do cast. Indenta nome dos objetos em 16 espaos. Quebra argumentos da funo em vrias linhas. Alinha parmetros de funes com nomes grandes.

34

O programa ex-vector-1.cpp apresentado na seo ??, foi modicado com o programa indent com o comando: Exemplo: cp ex-vector-1.cpp ex-vector-1-indent.cpp indent ex-vector-1-indent.cpp veja a seguir a listagem do arquivo ex-vector-1-indent.cpp. Compare esta listagem com a listagem ??. Observe a mudana na declarao da funo main, na forma do do..while e nas indentaes. Listing 3.6: Arquivo ex-vector-1-indent.cpp.
//Classes para entrada e sada #include < iostream > //Classe pra formatao de entrada e sada #include < iomanip > //Classe de vetores, do container vector #include < vector > //Classe para algoritimos genricos //#include <algorithm> //Define estar usando espao de nomes std using namespace std ; //Definio da funo main int main () { //Cria vector, do tipo int, com nome v vector < int >v; int data ; cout < < " No DOS um ctrl +d encerra a entrada de dados ." cout < < " No Mac um ctrl +d encerra a entrada de dados ." cout < < " No Linux um ctrl +d encerra a entrada de dados ." do { cout < < "\ nEntre com o dado (" < < setw (3) < < v. size cin > > data ; cin . get () ; //acidiona ao final do vetor o objeto data v. push_back ( data ); }

< < endl ; < < endl ; < < endl ;

() < < "):";

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 3. OS PROGRAMAS DIFF, PATCH, INDENT


while ( cin . good () ); //Acessa partes do vector usando funes front e back cout < < "\ nPrimeiro elemento do vetor = " < < v. front () << "\ nltimo elemento do vetor = " < < v. back () < < endl ; //mostra o vetor for (int i = 0; i < v. size () ; i ++) { cout < < "v[" < < setw (3) < < i < < " ]= " < < setw (5) < < v[i ] < < ; } cout < < endl ; cout < < ( v. empty () ? " vazio " : " no vazio ") < < endl ; //Chama funo clear v. clear () ; cout < < ( v. empty () ? " vazio " : " no vazio ") < < endl ; cout < < endl ; cin . get () ; return 0; }

35

Sentenas para o indent Opes padres do padro -gnut -nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2 -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai -saw -nsc -nsob No cdigo voc pode desabilitar ou habilitar o indent. /* * indent_on */, /* * indent_off * */. Para maiores informaes sobre o indent consulte as informaes do programa usando info indent. Para ver todas as opes do indent use: man indent.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 4 Compilando com gcc, g++


Neste captulo apresenta-se o compilador gcc/g++ da GNU. O mesmo pode ser baixado no site da gnu individualmente, ou como parte do pacote do EGCS (que inclui um conjunto de programas acessrios).

4.1

Prottipo e parmetros do gcc/g++

Apresenta-se aqui o prottipo e os parmetros que voc pode passar para o compilador da gnu. Posteriormente, atravs dos exemplos, voc compreender melhor cada parmetro. Prottipo do gcc/g++: g++ [opes] [parmetros] arquivos. -v -wall -onome -w -I/path -ggdb -O -c -S -lcomplex -lm -E -C -g -qdigraph Mostra detalhes da compilao. Mostra todos os warnings. Dene o nome do arquivo de sada (opcional). Elimina mensagens de warning. Acrescenta path include. Informaes extras para o gdb. Otimiza o cdigo (-O1,-O2,-O3). Somente compila (gera o arquivo *.o). Somente compila o arquivo, no linka. Inclue biblioteca dos complexos. Inclue biblioteca matemtica. Cria somente o arquivo pr-processado. No inclue comentrios no executvel. Gera informaes para o debuger (cdigo lento). Adiciona teclas dgrafas. 36

-l/path/lib Inclue biblioteca (lib).

CAPTULO 4. COMPILANDO COM GCC, G++ -qcompact Deixa o cdigo mais compacto. -xlinguagem Especica a linguagem (C, C++,assembler). -p -pg -m686 -static -p -pg Informaes para o proler proff. Informaes para o groff. Especica que a mquina alvo um 686. Especica que a linkagem deve ser esttica. Especica incluso de instrues para o proler. Especica incluso de instrues para o proler da gnu (gprof).

37

4.2

Arquivos gerados pelo gcc/g++

A medida que os arquivos so compilados e linkados, so gerados alguns arquivos adicionais. Lista-se a seguir os arquivos de entrada (*.h, *.cpp) e os arquivos de sada gerados pelo g++. *.h *.i *.ii Arquivos header. Arquivos de pr-processamento para programas em C. Arquivos de pr-processamento para programas em C++.

.c,.cc,.C,.c++,.cpp, Arquivos de fonte. .o .s .a .sa .so.n a.out Arquivo objeto. Arquivo assembler. Arquivo de biblioteca esttica. Blocos de bibliotecas estticas linkados ao programa. Arquivo de biblioteca dinmica. Arquivo de sada (executvel).

4.3

Exemplo de uso do gcc/g++

Apresenta-se a seguir um exemplo bsico. 1. Edita o programa hello.cpp com o emacs. Abra um terminal e execute emacs hello.cpp. #include <iostream> using namespace std; int main() { cout < < hello! < < endl; Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 4. COMPILANDO COM GCC, G++ return; } /*No emacs use ctrl+x ctrl+s para salvar o arquivo e ctrl+x ctrl+q para sair do emacs*/ 2. Cria o arquivo de pr-processamento [opcional]. g++ -E hello.cpp 3. Compila o mdulo hello (gera o hello.o). g++ -c hello.cpp 4. Linka o programa e gera o executvel. g++ -ohello hello.o 5. Executa o programa. ./hello 6. Observe que os passos 2, 3 e 4 podem ser executados usando: g++ -v -ohello hello.cpp

38

O -v mostra um conjunto de informaes a respeito dos passos da compilao. Neste exemplo o nome do programa executvel hello e foi especicado com a opo -ohello. Se voc no especicar um nome, o programa executvel se chamar a.out. Tarefa: Compare o tamanho dos cdigos (dos executveis) gerados com as opes: g++ hello.cpp g++ -g2 hello.cpp g++ -o3 hello.cpp #comum #com debuger #com otimizao

4.4

Sentenas para o compilador da gnu

Para conhecer em detalhes o gcc baixe o manual do gcc no site da gnu.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 5 Make
No captulo anterior voc aprendeu a usar o g++ para compilar um programa, como voc pode constatar, fcil. Mas se seu programa for grande, voc vai ter de executar o g++ para cada arquivo *.cpp, o que se transforma em trabalho tedioso. Para evitar este trabalho, foram desenvolvidos os arquivos de projeto. Neste captulo vamos descrever o que , como escrever e como usar arquivos de projeto e o programa make.

5.1

Um arquivo de projeto1

Um arquivo de projeto permite a compilao de diversos arquivos com uso do programa make. Voc pode compilar seus programas diretamente (digitando a instruo de compilao), ou usando arquivos makele. Um arquivo makele um arquivo de projeto no formato ASCII, que pode ser editado em editores simples, como o emacs. Por padro, um arquivo de projeto makele tem o nome makele ou Makele. Um arquivo de projeto pode ser simples ou complexo, vai depender do tamanho do programa e dos recursos utilizados. Podemos criar um arquivo Makele com instrues de compilao. Estas instrues de compilao sero lidas e executadas pelo programa make, automatizando a compilao de programas complexos. Descreve-se a seguir como funciona o programa make.

5.2

Prottipo e parmetros do make

Apresenta-se a seguir o prottipo e os parmetros do programa make. Por padro, o make procura no diretrio corrente o arquivo makele e depois o arquivo Makele. A opo -f usada para passar o nome do arquivo makele.
arquivo de projeto do Borland C++ e do MFC tem um formato proprietrio, que s pode ser lido por estes programas. Um arquivo de projeto do kdevelop um arquivo ASCII, podendo ser editado em qualquer editor simples.
1 Um

39

CAPTULO 5. MAKE Prottipo do make: make [ -f arq_makele ] [ opes ] ... alvos ... -e -k -n -p -r -t -s

40

Indica variveis do ambiente que devem prevalecer sobre atribuies feitas no make. Desconsiderar erros. Apenas lista os comandos, sem execut-los. Imprime alguns resultados. Despreza regras intrnsecas. Atualiza data e hora. Modo silencioso.

-f arq_makele Especica o nome do arquivo makele.

5.3

Formato de um arquivo Makele

Basicamente, um arquivo makele dividido em uma parte com denies de variveis e outra parte com sub-rotinas a serem executadas. A primeira parte dene variveis a serem utilizadas. As variveis incluem o nome do compilador, as paths de incluso de arquivos e bibliotecas e listagens de arquivos a serem processados.

5.3.1

Criando variveis em um arquivo Makele

O make aceita que voc dena variveis em seu arquivo makele e depois use estas variveis nas etapas de compilao. No exemplo a seguir cria uma varivel e usa seu contedo. Observe que para obter o valor da varivel voc deve usar um $(). Ao usar $(VARIAVEL), o make substitue o nome da varivel pelo seu valor. Exemplo: NOMEVARIAVEL = valor $(NOMEVARIAVEL) Por conveno, as variveis denidas em um arquivo makele so todas maisculas. Voc pode criar variveis da forma CC = g++ E a seguir modicar seu valor, acrescentando algo em modo append CC += -O2 2 Make usa um conjunto de variveis com nomes pr-denidos. AR Especica o programa de manuteno de arquivos. www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Apostila de Programao Para Linux/Unix

CAPTULO 5. MAKE CC CPP RM CFLAGS Especica o compilador, default=cc. Especica o pr-processador C++. Programa de remoo de arquivos, default = rm -f . Flags que devem ser passados para o compilador C.

41

CPPFLAGS Flags que devem ser passados para o compilador C++. LDFLAGS Flags que devem ser passados para o linker.

5.3.2

Criando alvos em um arquivo Makele

A segunda parte de um arquivo makele contm alvos a serem executados. O formato padro para um alvo dado por: Prottipo de um alvo: alvo: Dependncias Instrues a serem executadas As instrues a serem executadas iniciam com um tab (e no 8 espaos). Geralmente o alvo o nome de um arquivo, uma biblioteca ou um programa a ser compilado. Alvos usuais em arquivos makele so: all install uninstal dist check clean Executar todas as dependncias. Instalar o programa. Desinstalar o programa. Gerar uma distribuio no formato .tar.gz. Vericar a consistncia da instalao. Eliminar arquivos temporrios (*.obj).

5.4

Exemplo de um arquivo Makele


Listing 5.1: Arquivo makele.

Veja na listagem a seguir um exemplo de arquivo makele.


# Toda linha comeada com # uma linha de comentrio #-------------------------------------------------# ParteI : Definio de variveis ARQUIVOS = e06a - hello . cpp OBJETOS = e06a - hello .o DIRINCLUDE = - I/ usr / include /g ++ - I/ usr / include DIRETORIOLIB = PARAMETROSLIB = - lm COMPILADOR = g ++ #--------------------------------------------------

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 5. MAKE
# Parte II : alvos # all o alvo , e06a - hello .o e e06a - hello so as dependncias all : e06a - hello .o e06a - hello # e06a - hello .o o alvo , $ ( ARQUIVOS ) so as dependncias #e $ ( COMPILADOR ) .. a instruo e06a - hello .o : $( ARQUIVOS ) $( COMPILADOR ) -c $( ARQUIVOS ) $( DIRINCLUDE ) $( DIRECL ) -o e06a - hello .o

42

e06a - hello : $( OBJETOS ) $( COMPILADOR ) $( OBJETOS ) $( DIRINCLUDE ) $( DIRETORIOLIB ) $( PARAMETROSLIB ) -o e06a - hello clean : rm -f *. o *. obj

Veja na listagem a seguir uma seqencia de execuo do programa make usando o arquivo makele listado em ??. Listing 5.2: Exemplo de uso do programa make.
// Limpa os arquivos anteriores [ andre@mercurio Cap - GNU ]$ make clean rm -f *. o *. obj // Compila o arquivo e06a - hello .o [ andre@mercurio Cap - GNU ]$ make e06a - hello .o g ++ - c e06a - hello . cpp -I/ usr / include /g ++ - I/ usr / include // Gera o programa executvel [ andre@mercurio Cap - GNU ]$ make e06a - hello g ++ e06a - hello . cpp -I/ usr / include /g ++ - I/ usr / include

-o e06a - hello .o

-lm -o e06a - hello

// Veja abaixo que o make no compila novamente o que esta atualizado [ andre@mercurio Cap - GNU ]$ make e06a - hello make : e06a - hello est atualizado . // Limpando os arquivos obj [ andre@mercurio Cap - GNU ]$ make clean rm -f *. o *. obj // Observe abaixo que o alvo e06a - hello chama o alvo e06a - hello .o [ andre@mercurio Cap - GNU ]$ make e06a - hello g ++ - c e06a - hello . cpp -I/ usr / include /g ++ - I/ usr / include -o e06a - hello .o g ++ e06a - hello . cpp -I/ usr / include /g ++ - I/ usr / include -lm -o e06a - hello Dica : Observe a forma como os alvos foram traduzidos . O alvo : e06a - hello : $( ARQUIVOS ) $( OBJETOS ) $( COMPILADOR ) $( ARQUIVOS ) $( DIRETORIOINCLUDE ) $( DIRETORIOLIB ) $( PARAMETROSLIB ) -o e06a - hello Foi traduzido da forma : g ++ e06a - hello . cpp -I/ usr / include /g ++ - I/ usr / include

-lm -o e06a - hello

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 5. MAKE

43

5.5

Sentenas para o make

Para conhecer em detalhes o make baixe o manual do make no site da gnu (http://www.gnu.org). Os arquivos especicados nas dependncias devem existir. Se no existirem vai acusar erro. Os arquivos de cabealho *.h tambm devem ser includos nas dependncias. Isto evita a mensagem de erro do compilador pela falta dos mesmos. Make inteligente, se voc pediu para executar o alvo 2 e este depende do alvo 1, o make executa primeiro o alvo 1 e depois o alvo 2. Se alguma dependncia sofre modicaes, o make recompila os arquivos que foram modicados. Alvos sem dependncia no so automaticamente executados. Ao editar um arquivo makele ou Makele no emacs, o mesmo aparece com sintaxe especial. Auxiliando a implementao do arquivo makele.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 6 Bibliotecas
Apresenta-se neste captulo um conjunto de programas auxilares que so utilizados para montagens de bibliotecas no mundo GNU/Linux. A seguir apresenta-se um exemplo de montagem de biblioteca esttica e um exemplo de montagem de biblioteca dinmica.

6.1

Introduo a montagem de bibliotecas

Uma biblioteca uma coleo de objetos (funes, classes, objetos) agrupados em um nico arquivo. De um modo geral, um conjunto de arquivos com a extenso *.o, so reunidos para gerar um arquivo libNome.a (para biblioteca esttica) ou libNome.so (para biblioteca dinmica). O GNU/Linux tem um conjunto de programas auxiliares que so utilizados para criar, manter e gerenciar bibliotecas estticas e dinmicas. Apresenta-se a seguir uma breve descrio destes programas. Para obter informaes detalhadas de cada programa d uma olhada no man page ou nos manuais dos programas (os manuais podem ser baixados no site da gnu (http://www.gnu.org)).

6.1.1

ar

O programa ar utilizado para manipular arquivos em um formato bem estruturado. O ar tambm cria tabelas com smbolos e referncias cruzadas. O programa ar que aglutina todos os objetos em uma lib, isto , agrupa os arquivos *.o em uma lib. Veja a seguir o prottipo e um exemplo de uso do ar. Prottipo e parmetros do ar: ar [opes] arquivos. -t -r -q -s -c -v Lista os objetos da lib (biblioteca). Substitue funes quando necessrio (arquivos antigos). Adiciona no modo apend. Atualiza a tabela de smbolos. Cria o arquivo se este no existe. Modo verbose.

44

CAPTULO 6. BIBLIOTECAS Exemplo: ar cru libNome.a arq1.o arq2.o arq3.o

45

Neste exemplo o programa ar vai juntar os arquivos arq1.o arq2.o arq3.o e gerar o arquivo libNome.a. Veja a seguir a lista completa de opes do comando ar. A mesma pode ser obtida em seu sistema digitando ar - -help. Listing 6.1: Sada do comando ar - -help.
Usage : ar [ - X32_64 ] [ -]{ dmpqrstx }[ abcfilNoPsSuvV ] [ member - name ] [ count ] archive file file ... ar -M [ < mri - script ] commands : d - delete file (s) from the archive m[ ab ] - move file (s) in the archive p - print file (s) found in the archive q[f ] - quick append file (s) to the archive r[ ab ][ f ][ u ] - replace existing or insert new file (s) into the archive t - display contents of archive x[o ] - extract file (s) from the archive command specific modifiers : [a ] - put file (s) after [ member - name ] [b ] - put file (s) before [ member - name ] ( same as [ i ]) [N ] - use instance [ count ] of name [f ] - truncate inserted file names [P ] - use full path names when matching [o ] - preserve original dates [u ] - only replace files that are newer than current archive contents generic modifiers : [c ] - do not warn if the library had to be created [s ] - create an archive index ( cf . ranlib ) [S ] - do not build a symbol table [v ] - be verbose [V ] - display the version number [- X32_64 ] - ( ignored ) Report bugs to bug - binutils@gnu . org and and hjl@lucon . org

6.1.2

ranlib

Gera os ndices para a biblioteca, isto , gera um mapa de smbolos que sero utilizados pelos programas para localizar corretamente as funes a serem executadas. Prottipo e parmetros do ranlib: ranlib [-v -V] arquivo. -v Verso do ranlib.

Exemplo: ramlib libNome.a

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS

46

6.1.3 nm
Mostra os smbolos da biblioteca. Prottipo e parmetros do nm: nm [opes] arquivo. -C |demangle Mostra nomes de forma clara para o usurio. -S |print-armap Imprime ndice dos smbolos. Exemplo: nm libNome.a Use o comando nm - -help para obter as opes do comando nm. Listing 6.2: Sada do comando nm help .
Usage : nm [ OPTION ]... [ FILE ]... List symbols from FILEs ( a. out by default ). -a , - - debug - syms Display debugger - only symbols -A , - - print - file - name Print name of the input file before every symbol -B Same as -- format = bsd -C , - - demangle [={ auto ,gnu , lucid ,arm ,hp ,edg ,gnu -v3 , java , gnat , compaq }] Decode low - level symbol names into user - level names --no - demangle Do not demangle low - level symbol names -- demangler =< dso : function > Set dso and demangler function -D , - - dynamic Display dynamic symbols instead of normal symbols -- defined - only Display only defined symbols -e ( ignored ) -f , - - format = FORMAT Use the output format FORMAT . FORMAT can be bsd , sysv or posix . The default is bsd -g , - - extern - only Display only external symbols -h , - - help Display this information -l , - - line - numbers Use debugging information to find a filename and line number for each symbol -n , - - numeric - sort Sort symbols numerically by address -o Same as -A -p , - -no - sort Do not sort the symbols -P , - - portability Same as -- format = posix -r , - - reverse - sort Reverse the sense of the sort -s , - - print - armap Include index for symbols from archive members --size - sort Sort symbols by size -t , - - radix = RADIX Use RADIX for printing symbol values -- target = BFDNAME Specify the target object format as BFDNAME -u , - - undefined - only Display only undefined symbols -V , - - version Display this program s version number -X 32 _64 ( ignored ) nm : supported targets : elf32 - i386 a.out - i386 - linux efi -app - ia32 elf32 - little elf32 - big srec symbolsrec tekhex binary ihex trad - core Report bugs to bug - binutils@gnu . org and and hjl@lucon . org .

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS

47

6.1.4 objdump
Imprime informaes sobre as bibliotecas e objetos. Prottipo e parmetros do objdump: objdump [opes][parmetros] -d, -syms -a -debugging. Tabela de smbolos. Informaes arquivo.

Exemplo: objdump -file-header file.o Dica: Para maiores detalhes, execute objdump - -help.

6.1.5 ldd
Lista as bibliotecas dinmicas que determinado programa usa. Prottipo e parmetros do ldd: ldd [-d-r] programa - -help - -version Imprime um help. Imprime a verso do ldd.

-d,- -data-relocs Processa uma realocao dos dados. r,- -function-relocs Processa uma realocao dos dados e funes. -v,- -verbose Imprime informaes em geral. Exemplo: ldd /bin/netscape Veja a seguir a sada do comando ldd /usr/bin/lyx. Lembre-se que LYX o editor utilizado para montar esta apostila. Observe o uso das bibliotecas libXForms, Xpm, X11 e libstdc++. Listing 6.3: Sada do comando ldd /usr/bin/lyx.
libforms . so .0.88 = > / usr / lib / libforms . so .0.88 (0 x40032000 ) libXpm . so .4 = > / usr / X11R6 / lib / libXpm . so .4 (0 x400b4000 ) libSM . so .6 = > / usr / X11R6 / lib / libSM . so .6 (0 x400c3000 ) libICE . so .6 = > / usr / X11R6 / lib / libICE . so .6 (0 x400cc000 ) libX11 . so .6 = > / usr / X11R6 / lib / libX11 . so .6 (0 x400e3000 ) libstdc ++ - libc6 .2 -2. so .3 = > / usr / lib / libstdc ++ - libc6 .2 -2. so .3 (0 x401d9000 ) libm . so .6 = > / lib / i686 / libm . so .6 (0 x4021c000 ) libc . so .6 = > / lib / i686 / libc . so .6 (0 x4023f000 ) / lib /ld - linux . so .2 = > / lib /ld - linux . so .2 (0 x40000000 )

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS

48

6.1.6 ldcong
O programa ldcong determina os links necessrios em tempo de execuo para bibliotecas compartilhadas (shared libs)1 . Prottipo e parmetros do ldcong: ldcong [-p-v]libs -p -v Mostra bibliotecas compartilhadas. Modo verbose.

6.2

Conveno de nomes para bibliotecas

O nome de uma biblioteca deve iniciar com lib. A extenso ser *.a para bibliotecas estticas. A extenso ser *.so para bibliotecas dinmicas. Verses: libNome.so.VersoMaior.VersoMenor.Patch A verso maior uma verso incompatvel com as demais. A verso menor inclue novidades. A patch inclue correes de bugs. Uma biblioteca que tem o nome encerrado com -g contm instrues de debugagem. Uma biblioteca que tem o nome encerrado com -p contm instrues para o proler (gprof).

6.3 Bibliotecas usuais


Apresenta-se na Tabela ?? algumas bibliotecas usuais.

6.4 Montando uma biblioteca esttica (libNome.a)


Para utilizar a biblioteca o programador precisa dos arquivos com o cabealho (formato como os objetos e as funes foram construdos) e o arquivo da lib. Seqencia para criar uma biblioteca esttica no GNU/Linux: 1. Cria o arquivo de cabecalho *.h (declarao das funes em C e das classes em C++) emacs Tponto.h TPonto.h class TPonto { .....}; //ctrl+x ctrl+s para salvar //ctrl+x ctrl+c para sair
1 Descrito

no livro Linux Unleashed, no disponvel em minha mquina.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS Tabela 6.1: Bibliotecas usuais. Biblioteca libGL.so libjpeg.so libpbm.so libpgm.so libpng.so libpnm.so libpthread.so libvga.so libz.so glibc magick++ Uso Interface para OpenGL Interface para arquivos jpeg Interface para bitmaps monocromticos Interface para bitmaps tons de cinza Interface para arquivos portable bitmap format Interface para bitmaps pbm, ppm, pgm Posix Threads Acesso a tela vga Biblioteca para compactao de arquivos Biblioteca padro C <magick++.h> Biblioteca grca Include <GL/gl.h> <jpeglib.h> <pbm.h> <pgm.h> <png.h> <pnm.h> <pthread.h> <vga.h> <zlib.h>

49

2. Cria o arquivo de cdigo *.cpp (denio das funes) emacs TPonto.cpp /*Define funes da classe*/ .... 3. Compila os arquivos de cdigo (*.cpp) gerando os arquivos (*.o) g++ -c TPonto.cpp 4. Cria a biblioteca (a lib) ar -q libNome.a TPonto.o 5. Publica a biblioteca com ranlib libTPonto.a Observe que os tens 1 e 2 se referem a edio dos arquivos do programa. Em 3, o programa compilado. Pode-se utilizar um arquivo makele para automatizar esta tarefa. Em 4, cria-se a biblioteca, gerando-se o arquivo libTPonto.a. Em 5 a biblioteca publicada no sistema.

6.4.1

Usando uma biblioteca esttica

No exemplo a seguir compila o programa Prog.cpp e pede para linkar em modo esttico (-static) a biblioteca nomeLib que esta localizada em pathLib. Exemplo: g++ Prog.cpp -static -LpathLib -lnomeLib

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS

50

6.5

Montando uma biblioteca dinmica (libNome.so)

Roteiro para criar uma biblioteca dinmica no GNU/Linux: 1. Cria o arquivo de cabecalho *.h (declarao das funes e classes) emacs TPonto.h class TPonto { .....}; 2. Cria o arquivo de cdigo *.cpp (denio das funes) emacs TPonto.cpp /*Define funcoes da classe*/ 3. Compila os arquivos de cdigo (*.cpp) gerando os arquivos *.o A opo -fPIC, gera o cdigo com posicionamento independente, podendo o mesmo ser carregado em qualquer endereo. g++ -fPIC -c TPonto.cpp -o TPonto.o 4. Cria a biblioteca dinmica A opo -WL passa informaes para o linker ld. g++ -shared -Wl,-soname,TPonto.so.1 -o libTPonto.so.1.0 TPonto.o 5. Copia a lib para /usr/local/lib (como root) cp libTPonto.so.1.o /usr/local/lib 6. Pode-se criar links simblicos para a lib cd /usr/local/lib/ ln -s libTPonto.so.1.o libTPonto.so.1 ln -s libTPonto.so.1.o libTPonto.so 7. Publica a lib (#inclue na tabela de bibliotecas dinmicas, cria link, e inclue em /etc/ld.so.cache) /sbin/ldconfig

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS

51

6.5.1 Usando uma biblioteca dinmica


O exemplo ilustrado a seguir inclue o arquivo #include <dlfcn.h>, um arquivo de incluso de bibliotecas dinmicas. Veja no exemplo outras informaes (extrado da fonte [5]). #include <dlfcn.h> #include <fstream.h>.... main() { //Cria ponteiro para a lib void* ptrLib; //Cria ponteiro para funo da lib void (*ptrFuncaoLib)(); //Carrega a lib //dlopen(const char* fileName, int flag); ptrLib = dlopen("nomeLib.so.1.0",RTLD_LAZY); //Verifica se no tem erro com a funo dlerror //const char* dlerror(); cout < < dlerror(); //Obtm endereo da funo //void* dlsym(void* handle,char* simbolo); ptrFuncaoLib = dlsym(ptrLib,"NomeFuncaoNaLib"); //Usa a funo int x = (*ptrFuncaoLib)(); //Fecha a lib //int dlclose(void * handle); dlclose(ptrLib); }

6.5.2

Vantagens/desvantagens da biblioteca dinmica

Em uma biblioteca esttica o programa maior porque inclue todas as bibliotecas. Quando o programa linkado com bibliotecas dinmicas, o mesmo ca menor, pois as bibliotecas so carregadas em tempo de execuo. Um programa que faa uso de uma biblioteca dinmica no precisa ser recompilado se ocorreram modicaes na biblioteca. S ser necessrio modicar o programa que acessa a biblioteca dinmica se o mesmo utilizar objetos da biblioteca que sofreram modicaes na sua interface. Veja a seguir um arquivo makele para gerar o programa e87-Polimorsmo.cpp, anteriormente apresentado. Parte da listagem inclue instrues para o programa libtool que ser apresentado no Captulo ??. Listing 6.4: Arquivo makele com bibliotecas estticas e dinmicas.
#============================== DEFINICOES ================================== ARQUIVOS = e87 - TCirculo . cpp e87 - TElipse . cpp e87 - TPonto . cpp e87 - Polimorfismo . cpp

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS
OBJETOS = e87 - TCirculo .o e87 - TElipse .o e87 - TPonto .o DIRINCLUDE = - I/ usr / include /g ++ - I/ usr / include DIRLIBD = / home / andre / Andre / ApostilasPessoais / ApostilaProgramacao / Exemplos / cursocpp /Cap - GNU / biblioteca PARAMETROSLIB = - lm COMPILADOR = g ++ LIBS = TPonto LIBD = TPonto PROG = e87 - Polimorfismo . cpp #--------------- Lista de opes . # list : # " obj : Gera objetos comuns # exe : Gera executvel comum " # all : obj exe # libs : Gera biblioteca esttica # exes : Gera executvel usando biblioteca esttica # alls : libs exelibs # libd : Gera biblioteca dinmica # exed : Gera executvel usando biblioteca dinmica # libs_libtool : Gera biblioteca estatica usando lib_tool # exes_libtool : Gera executvel usando biblioteca estatica e libtool # init_doc : Inicializa o doxygem # doc : Gera documentao a partir de cdigo documentado # clean : Apaga arquivos " #--------------- Compilao padro all : obj exe obj : $( ARQUIVOS ) $( COMPILADOR ) -c $( ARQUIVOS )

52

$( DIRINCLUDE ) $( DIRECL )

exe : $( PROG ) $( OBJETOS ) $( COMPILADOR ) $( PROG ) $( OBJETOS ) $( DIRINCLUDE ) $( DIRETORIOLIB ) $( PARAMETROSLIB ) -o e87 - Polimorfismo #--------------- Criando biblioteca esttica alls : libs exelibs $( OBJETOS ) ar -q libTPonto .a $( OBJETOS ) # ar - cru libTPonto .a $( OBJETOS ) ranlib libTPonto .a # publica a lib # Criando executavel usando a biblioteca esttica exelibs : libs $( COMPILADOR ) e87 - PolimorfismoStatic . cpp - static -L. - l$ ( LIBS ) -o e87 PolimorfismoStatic #--------------- Criando biblioteca dinmica alld : objd libd objd : $( ARQUIVOS ) $( COMPILADOR ) - fPIC -c $( ARQUIVOS ) libs :

$( DIRINCLUDE ) $( DIRECL )

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS
libd : $( OBJETOS ) $( COMPILADOR ) - shared -Wl ,- soname , TPonto . so .1 - o libTPonto . so .1.0 $( OBJETOS ) ln -s libTPonto . so .1.0 libTPonto . so .1 ln -s libTPonto . so .1.0 libTPonto . so / sbin / ldconfig # publica a biblioteca ( como root )

53

#--------------- Criando executavel usando a biblioteca dinmica exelibd : e87 - PolimorfismoDinamic . cpp libd $( COMPILADOR ) e87 - PolimorfismoDinamic . cpp - L$ ( DIRLIBD ) - l$ ( LIBD ) -o e87 PolimorfismoDinamic #--------------- Limpeza . clean : rm -f *. o *. obj *. so * a. out e87 - PolimorfismoDinamic e87 PolimorfismoStatic *.*~ *~ libTPonto .*

#============================== USANDO LIBTOOL ========================== # Para ficar portvel , todas as etapas devem ser realizadas com o libtool # obj_libtool : $( ARQUIVOS ) # libtool $( COMPILADOR ) -c $( ARQUIVOS ) #--------------- Criando biblioteca estatica usando o libtool libs_libtool : $( ARQUIVOS ) libtool $( COMPILADOR ) -o libTPonto .a $( ARQUIVOS ) #--------------- Criando executavel usando libtool com biblioteca estatica # Incompleto exes_libtool : e87 - PolimorfismoStatic . cpp libs_libtool libtool $( COMPILADOR ) e87 - PolimorfismoStatic . cpp - static -L. - l$ ( LIBS ) o e87 - PolimorfismoStatic - libtool #--------------- Criando biblioteca dinmica usando o libtool libd_libtool : $( ARQUIVOS ) libtool $( COMPILADOR ) -o libTPonto . la $( ARQUIVOS ) #--------------- Criando executavel usando libtool com biblioteca dinmica # Incompleto exed_libtool : e87 - PolimorfismoStatic . cpp libd_libtool libtool $( COMPILADOR ) e87 - PolimorfismoDinamic . cppp libTPonto . la -o e87 PolimorfismoDinamic - libtool

#--------------- Criando documentao com doxygem init_doc : doxygen -g doxygem . config doc : $( ARQUIVOS ) doxygen doxygem . config

Faa cpias do e87-Polimorsmo.cpp criando os arquivos e87-PolimorsmoStatic.cpp e e87-PolimorsmoDinamic.cpp e ento execute a seqencia ilustrada a seguir. Listing 6.5: Arquivo mostrando o uso do makele.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 6. BIBLIOTECAS
[ root@mercurio biblioteca ]# make clean rm -f *. o *. obj *. so * a. out e87 - PolimorfismoDinamic e87 - PolimorfismoStatic *.*~ *~ libTPonto .*

54

[ root@mercurio biblioteca ]# make all g ++ - c e87 - TCirculo . cpp e87 - TElipse . cpp e87 - TPonto . cpp e87 - Polimorfismo . cpp I/ usr / include /g ++ - I/ usr / include g ++ e87 - Polimorfismo . cpp e87 - TCirculo .o e87 - TElipse .o e87 - TPonto .o -I/ usr / include /g ++ - I/ usr / include -lm -o e87 - Polimorfismo [ root@mercurio biblioteca ]# make alls ar -q libTPonto .a e87 - TCirculo .o e87 - TElipse .o e87 - TPonto .o ranlib libTPonto .a # publica a lib g ++ e87 - PolimorfismoStatic . cpp - static -L. - lTPonto -o e87 - PolimorfismoStatic [ root@mercurio biblioteca ]# make alld g ++ - fPIC -c e87 - TCirculo . cpp e87 - TElipse . cpp e87 - TPonto . cpp e87 - Polimorfismo . cpp -I/ usr / include /g ++ - I/ usr / include g ++ - shared -Wl ,- soname , TPonto . so .1 - o libTPonto . so .1.0 e87 - TCirculo .o e87 TElipse .o e87 - TPonto .o ln -s libTPonto . so .1.0 libTPonto . so .1 ln -s libTPonto . so .1.0 libTPonto . so / sbin / ldconfig # publica a biblioteca ( como root ) [ root@mercurio biblioteca ]# make libs_libtool libtool g ++ - o libTPonto .a e87 - TCirculo . cpp e87 - TElipse . cpp - Polimorfismo . cpp ar cru libTPonto .a ranlib libTPonto .a

e87 - TPonto . cpp e87

[ root@mercurio biblioteca ]# make libd_libtool libtool g ++ - o libTPonto . la e87 - TCirculo . cpp e87 - TElipse . cpp e87 - TPonto . cpp e87 - Polimorfismo . cpp rm - fr . libs / libTPonto . la . libs / libTPonto .* . libs / libTPonto .* ar cru . libs / libTPonto . al ranlib . libs / libTPonto . al creating libTPonto . la ( cd . libs && rm -f libTPonto . la && ln -s ../ libTPonto . la libTPonto . la )

6.6

Sentenas para bibliotecas

O padro para o nome da lib : libNome.so.versao.subversao.release. Voc pode acrescentar novas paths para bibliotecas dinmicas modicando a varivel de ambiente LD_LIBRARY_PATH.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 7 Libtool
Neste captulo apresenta-se o libtool, mais um pacote da gnu, utilizado para facilitar o desenvolvimento de programas em mltiplas plataformas.

7.1

Introduo ao libtool2

Como ser descrito nos captulos seguintes, o libtool mais um programa da gnu que facilita o desenvolvimento de bibliotecas multiplataforma. O mesmo usado para desenvolvimento de bibliotecas no ambiente GNU/Linux. Vantagens do uso do libtool Maior elegncia. Integrado ao autoconf e automake. Maior portabilidade. Trabalha com bibliotecas estticas e dinmicas.

7.2

Forma de uso do libtool

Como fao para usar o libtool ? De um modo geral, basta digitar o comando libtool seguido do comando que voc usaria para compilar seu programa ou biblioteca. Exemplos de uso do libtool esto listados no diretrio do libtool. Veja a seguir a sada do comando libtool - - help. Listing 7.1: Arquivo libtool - -help.
Usage : libtool [ OPTION ]... [ MODE - ARG ]... Provide generalized library - building support services . -- config -- debug -n , - - dry - run show all configuration variables enable verbose shell tracing display commands without modifying any files

55

CAPTULO 7. LIBTOOL
-- features -- finish -- help -- mode = MODE -- quiet -- silent -- version

56
display basic configuration information and exit same as -- mode = finish display this help message and exit use operation mode MODE [ default = inferred from MODE - ARGS ] same as -- silent don t print informational messages print version information

MODE must be one of the following : clean compile execute finish install link uninstall remove files from the build directory compile a source file into a libtool object automatically set library path , then run a program complete the installation of libtool libraries install libraries or executables create a library or an executable remove libraries from an installed directory Try libtool -- help -- mode = MODE for

MODE - ARGS vary depending on the MODE . a more detailed description of MODE .

7.3 Criando uma biblioteca sem o libtool


Reveja a seguir como criar uma biblioteca esttica sem uso do libtool. Exemplo: ar cru libNome.a a.o b.o c.o ranlib libNome.a Para criar uma biblioteca esttica usando o arquivo makele anteriormente apresentado execute o comando: Exemplo: make clean make libs A sada gerada pelo makele dada por: [andre@mercurio libtool-biblioteca]$ make libs g++ -c -o e87-TCirculo.o e87-TCirculo.cpp g++ -c -o e87-TElipse.o e87-TElipse.cpp g++ -c -o e87-TPonto.o e87-TPonto.cpp ar -q libTPonto.a e87-TCirculo.o e87-TElipse.o ranlib libTPonto.a

e87-TPonto.o

7.4

Criando uma biblioteca esttica com o libtool

Veja a seguir como usar o libtool para gerar a biblioteca esttica. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 7. LIBTOOL Exemplo: libtool g++ -o libTPonto.a e87-TPonto.cpp e87-TElipse.cpp e87-TCirculo.cpp Veja a seguir a sada gerada pelo libtool. mkdir .libs ar cru libTPonto.a ranlib libTPonto.a

57

7.5

Criando uma biblioteca dinmica com o libtool

O mesmo exemplo usando o libtool e biblioteca dinmica. Observe que a nica alterao o nome da biblioteca, que agora se chama libTPonto.la. Exemplo: libtool g++ -o libTPonto.la e87-TPonto.cpp e87-TElipse.cpp e87-TCirculo.cpp Veja a seguir a sada gerada pelo libtool. rm -fr .libs/libTPonto.la .libs/libTPonto.* .libs/libTPonto.* ar cru .libs/libTPonto.al ranlib .libs/libTPonto.al creating libTPonto.la (cd .libs && rm -f libTPonto.la && ln -s ../libTPonto.la libTPonto.la)

7.6

Linkando executveis
Exemplo: g++ -o nomeExecutvel nomePrograma.cpp libNome.la

Formato usual:

Formato usando o libtool: Exemplo: libtool g++ -o nomeExecutvel nomePrograma.cpp libNome.a

7.7

Instalando a biblioteca
Exemplo: //como root cp libNome.a /usr/lib ranlib /usr/lib/libNome.a

Formato usual:

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 7. LIBTOOL Formato usando o libtool: Exemplo: libtool cp libNome.a /usr/lib/ //ou libtool install -c libNome.a /usr/lib/libNome.la //ou libtool install -c .libs/libNome.a /usr/lib/libNome.so.0.0 libtool install -c .libs/libNome.a /usr/lib/libNome.la libtool install -c .libs/libNome.a /usr/lib/libNome.a

58

7.8

Modos do libtool

Para saber mais sobre o funcionamento de cada um dos mdulos abaixo listados, execute o comando: libtool - -help - -mode = MODO. Compilao, o libtool atua chamando o compilador do sistema: libtool - -help - -mode=compile Linkagem, o libtool atua executando a linkagem: libtool - -help - -mode=link Instalao, o libtool atua instalando o programa: libtool - -help - -mode=install Execuo, o libtool atua executando o programa: libtool - -help - -mode=execute Desinstalao, o libtool atua desinstalando o programa: libtool - -help - -mode=uninstall

7.9 Sentenas para o libtool


Para executar o gdb com o libtool use: libtool gdb nomePrograma Para obter informaes do libtool: libtool - -help Para gerar apenas bibliotecas estticas, passar o ag: --disable-shared Durante o desenvolvimento costuma-se usar biblioteca esttica com opo de debugagem.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 7. LIBTOOL Em 9/2001 o libtool ainda no era totalmente compatvel com C++.

59

Leia o livro GNU AUTOCONF, AUTOMAKE, AND LIBTOOL disponvel gratuitamente no site (http://sources.redhat.com/autobook/). Bibliotecas compartilhadas usam a especicao PIC (position independent code).

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 8 Debug (Depuradores, Debuggers)


Apresenta-se neste captulo informaes sobre o debuger da gnu, o gdb.

8.1

Introduo ao debuger

Bem, voc um bom programador, mas..., ainda existem alguns probleminhas, e voc ter de rastrear o seu cdigo para eliminar aqueles pequenos insetos. No adianta, voc vai ter de debugar seu cdigo. Mas anal de contas o que e para que serve um debuger ? Um debuger um programa que monitora a execuo de outros programas. Com o debuger voc pode acompanhar a execuo do programa e identicar onde o mesmo esta com problemas. Para tal, o debuger possibilita a avaliao do contedo das variveis e o acompanhamento passo a passo da execuo do programa. O GNU/Linux, Unix tem o gdb, um debug em modo texto e seus frontends o xgdb e o kdbg. Antes de mais nada, para poder debugar o seu cdigo, voc precisa acrescentar as informaes para o debug passando a opo de compilao -g (CPPFLAGS= -g). Desta forma o gdb poder examinar o seu executvel (ou o arquivo core) para vericar o que aconteceu.

8.2

Comandos do gbd

Apresenta-se na Tabela ?? uma lista com os comandos do gdb.

8.3

Exemplo de uso do gdb


Exemplo (gdb) Run (gdb) backtrace (gdb) break 23 (gdb) list (gdb) p var (gdb) c

Um pequeno exemplo de uso do gdb. //Roda o programa //Mostra a pilha (o ltimo comando executado) //Acrescenta breakpoint na linha 23 //Mostra o cdigo fonte perto do breakpoint //Mostra o contedo da varivel //Continua execuo 60

CAPTULO 8. DEBUG (DEPURADORES, DEBUGGERS) Tabela 8.1: Comandos do gdb. Comando gdb run prog run prog arg bt break func list arq.cpp break 25 (ou b25) delete (d) c step step 10 next next 12 print var what atributo quit help com Ao Executa o debuger. Executa o programa prog. Roda o programa com os argumentos. Apresenta um rastreamento da pilha. Cria breakpoint na funo func. Visualiza o arq.cpp. Acrescenta breakpoint na linha 25. Deleta os breakpoint. Continua. Executa um passo. Executa os prximos 10 passos. Executa uma linha. Executa as prximas 12 linhas. Imprime o contedo da varivel. Mostra contedo do atributo/varivel. Abandona o debug. Help sobre o comando.

61

8.4

Sentenas para o gdb

No GNU/Linux, quando um programa trava ou encerrado de forma inesperada, gerado um arquivo core. O arquivo core pode ser aberto pelo gdb para localizar a posio onde o programa travou. No gnu voc pode simplicar o trabalho de debugagem incluindo a macro __FUNCTION__ que imprime o nome da funo que esta sendo executada. Exemplo: cout < < na funo : < < __FUNCTION__ < < endl;

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 9 Proler (gprof)2


Neste captulo apresenta-se brevemente o gprof, o proler da gnu.

9.1

Introduo ao gprof

Um proler um programa utilizado para avaliar o desempenho do seu programa, permitindo encontrar os gargalos (pontos onde o programa demora mais). O proler apresenta um grco com o tempo de execuo de cada funo. Primeiro compila o programa incluindo a opo -pg. Criando o executvel a.out que aberto pelo gprof g++ -pg ex-funcaoobjeto1.cpp A seguir executa o gprof gprof --brief -p Veja abaixo a sada gerada pelo gprof [andre@mercurio Cap4-STL]$ gprof --brief -p Flat profile:
Each sample counts as 0.01 seconds. no time accumulated % cumulative self self total time seconds seconds calls Ts/call Ts/call name 0.00 0.00 0.00 28 0.00 0.00 _Deque_iterator<int, int &, int *, 0>::_S_buffer_size(void) 0.00 0.00 0.00 21 0.00 0.00 _Deque_iterator<int, int &, int *,0>::operator!= (_Deque_iterator<int, int &, int *, 0> const &) const 0.00 0.00 0.00 17 0.00 0.00 _Deque_iterator<int, int &, int *, 0>::operator(_Deque_iterator<int, int &, int *, 0> const &) const 0.00 0.00 0.00 15 0.00 0.00 _Deque_base<int, allocator<int>, 0>::~_Deque_base(void) 0.00 0.00 0.00 14 0.00 0.00 void destroy<int *>(int *, int *) 0.

Observe a direita o nome da funo e a esquerda o tempo de execuo.

9.2 Sentenas para o proler:


Para aprender a usar o gprof, baixe e leia o manual do gprof no site da gnu.

62

CAPTULO 9. PROFILER (GPROF)2

63

Se voc quer um compilador mais rpido e usa mquinas com processadores pentium pense em usar o pgcc. Um compilador descendente do compilador da gnu e otimizado para processadores pentium. Procure por pgcc na internet. Voc s deve se preocupar com performance (e com o gprof) depois que for um bom programador. Primeira faa com que os programas funcionem, a seguir se preocupe com bugs, faa a documentao,...., depois de tudo se preocupe com a performance.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 10 Verso de Depurao, Final e de Distribuio


Neste captulo apresenta-se as opes para criar a verso de depurao e a verso nal de seu programa. Apresenta-se ainda as formas de distribuio de programas.

10.1

Verso debug, release e de distribuio

A medida que o programa desenvolvido e os bugs corrigidos, costuma-se trabalhar com uma verso de debugagem (passando a opo -g para o compilador). Depois, quando deseja-se distribuir um release do programa, eliminam-se todas as opes de debugagem e colocam-se opes de otimizao.

10.1.1 Verso debug


1. Ativar a opo de debugagem (-g). 2. Ativar todos os warnigs (-Wall).

10.1.2 Verso nal (release)


1. Desativar todas as opes de debugagem (tirar -g). 2. Ativar as opes de otimizao (-O1,-O2,-O3). 3. Ativar todos os warnings (-Wall).

10.1.3 Distribuio dos programas e bibliotecas


Uma biblioteca pode ser vendida, distribuindo-se os arquivos de cabealho (*.h) e os arquivos da biblioteca (*.lib). Um programador que comprou as bibliotecas, pode usar as funes e objetos da biblioteca consultando os manuais e os arquivos de cabealho (*.h). Observe que como os arquivos *.cpp no so distribudos, o programador no tem acesso a forma como as funes foram implementadas, isto , no tem como avaliar a qualidade da biblioteca. Este o formato de distribuio de bibliotecas no ambiente Windows. Um sistema proprietrio que esconde de quem compra o programa o seu cdigo, o seu real funcionamento (suas qualidades e seus problemas). 64

CAPTULO 10. VERSO DE DEPURAO, FINAL E DE DISTRIBUIO

65

Um formato mais moderno e democrtico distribuir tanto os arquivos de cabealho (*.h) como os de implementao (*.cpp), este o sistema de distribuio do GNU/Linux. Para distribuir seu cdigo voc pode utilizar uma das opes descritas a seguir. Distribuir o seu cdigo fonte em um arquivo .tar.gz 1. Gera o arquivo de distribuio tar -cvzf nomeArquivo.tar.gz path_do_programa 2. Permite o acesso dos usurios pela internet ou pela distribuio de disketes (zip, cd). Distribuir o seu cdigo fonte com patchs (atualizaes) Alm de distribuir o seu cdigo com o arquivo .tar.gz voc pode distribuir upgrades, isto , distribuies que acrescentam apenas as modicaes que foram realizadas no cdigo. A grande vantagem que o usurio precisa baixar arquivos pequenos. O roteiro abaixo mostra como distribuir atualizaes de cdigo com patchs. Programador_etapa_1: 1. Gera o programa make testa se o programa esta ok... 2. Gera a distribuio .tar.gz

//se o arquivo makefile foi configurado para gerar uma distribuio make dist //ou cria um arquivo compactando todo o cdigo com o tar tar -cvzf prog.tar.gz path_do_programa Usurio_etapa_1: 1. Baixa, descompacta, compila e instala o programa. ftp site_com_o_programa login get prog.tar.gz quit tar -xvzf prog.tar.gz cd prog ./configure make make install

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 10. VERSO DE DEPURAO, FINAL E DE DISTRIBUIO Programador_etapa_2: 1. Faz atualizaes no cdigo (upgrades) Edita os arquivos com o programa e inclue atualizaes e correes de bugs 2. Gera os arquivos com as diferenas (coisas novas nos cdigos) diff arq1-old.cpp arq1.cpp > arq1.dif 3. Gera o pacote com as atualizaes tar -cvzf path-versaoold-versaonova.tar.gz *.dif Usurio_etapa_2: 1. Baixa e descompacta o arquivo path-versaoold-versaonova.tar.gz. ftp site_com_o_programa login get path-versaoold-versaonova.tar.gz tar -xvzf path-versaoold-versaonova.tar.gz

66

2. Executa o programa patch para que o cdigo antigo (arq1.cpp) seja alterado, incluindo as alteraes da nova verso, ou seja, gera um novo arquivo arq1 somando ao arquivo arq1 as novidades listadas no arquivo arq1.dif. cp arq1.cpp arq1.cpp~ patch arq1.cpp arq1.dif 3. Congura, compila e instala o programa ./configure make make install 4. As alteraes realizadas no arquivo arq1.cpp podem ser revertidas (voltar a ser o que era) executando-se patch -r arq1.cpp arq1.dif Distribuir o seu cdigo fonte atravs do uso do CVS Voc ter de ter um servidor de CVS instalado e funcionando. Deve criar um repositrio para o seu programa (com releases,...) e um sistema que permita aos usurios baixar os arquivos no servidor CVS para serem compilados. Veja exemplo de como baixar um programa de terceiros usando o cvs na seo ??. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 10. VERSO DE DEPURAO, FINAL E DE DISTRIBUIO Distribuir o programa (e os fontes) em pacotes rpm

67

O desenvolvimento de arquivo rpm um pouco complexo e esta fora do escopo desta apostila. Alguns ambientes de desenvolvimento, como o kdevelop, geram os arquivos rpm para voc.

10.2

Sentenas para distribuio de cdigo fonte

Se voc esta programando no GNU/Linux bem provvel que j tenha baixado e compilado o kernel do Linux. O mesmo disponibilizado no site http://kernel.org. V ao site do kernel do Linux e compare o tamanho das atualizaes do kernel, isto , compare os arquivos kernelversao.tar.bz2 e patch-versao.bz2. Veja o resultado a em baixo, de 23576Kb para 807Kb. patch-2.4.18.bz2 807 KB 25-02-2002 19:44:00 linux-2.4.18.tar.bz2 23596 KB 25-02-2002 19:40:00 File Use o patch, a atualizao dos programas ca muito mais rpida pois os arquivos de atualizaes so pequenos e podem ser baixados com extrema rapidez na internet. J que estamos falando do uso de patch para baixar arquivos menores pela internet, pense em usar mais a internet como um instrumento de aprendizado, de trabalho e de troca de dados. Evite span, evite baixar e mandar via email fotos e lmes com pouca utilidade.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 11 Documentao de Programas Usando Ferramentas GNU/Linux


Apresenta-se neste captulo o uso do formato JAVA_DOC para embutir documentao em seus programas. O uso do programa doxygem para gerar a documentao em diferentes formatos (html, tex, rtf). Cita-se ainda os formatos sgml e xml para gerao de manuais prossionais.

11.1

Introduo a documentao de programas

A documentao uma etapa fundamental para compreenso, aperfeioamento e manuteno de programas. Existem atualmente alguns programas e padres para documentao de cdigos em C++. Vou descrever brevemente o formato JAVA_DOC que aceito pelo gerador de documentao DOXYGEN. Como funciona ? Voc inclue em seu cdigo um conjunto de tags. Estes tags no interferem na compilao de seu programa, apenas incluem informaes que sero identicadas por um programa externo (o doxygem), para gerar a documentao das classes, dos atributos e dos mtodos. A primeira etapa incluir a documentao nos arquivos *.h e *.cpp, veja seo ??. A segunda etapa consiste em executar o doxygem (que j foi instalado e congurado) para gerar a documentao, veja seo ??.

11.2

Documentao embutida no cdigo com JAVA_DOC

O formato JAVA_DOC amplamente utilizado para documentao de programas em C++, tambm valido para documentao de cdigos em JAVA e IDL.

11.2.1 Exemplo de cdigo documentado


Para inserir um breve comentrio utilize trs barras invertidas.
///Breve comentrio (apenas uma linha).

68

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX Para inserir um breve comentrio e um comentrio mais detalhado use
/** Breve comentrio * Comentrio mais detalhado *........ *@class TNome *@file NomeArquivo */ class TNome { .

69

No exemplo acima observe a posio do breve comentrio e do comentrio detalhado. Veja ainda a forma de denio do nome da classe e do arquivo. Para inserir um comentrio embutido use:
int a; /**< Comentrio pequeno, embutido*/

Observe que o comentrio inicia com um /**< e termina com um */ . Veja a seguir outro exemplo.
/** Um enumerador (breve descrio) * Descrio detalhada do enumerador */ enum ENome { segunda, /**< Comentrio pequeno, embutido*/ terca, /**< Comentrio pequeno, embutido*/ } /** Breve descrio da funo * Descrio detalhada da funo *@param int a *@param int b *@return retorna a soma (int) *@see */ int Soma(int a, int b) {return a+b;};

No exemplo acima informa-se o nome dos parmetros e de retorno da funo soma.

11.2.2 Sentenas para documentao java_doc


Se houver documentao duplicada: na classe [*.h] e nos arquivos de denio [*.cpp]. Vai usar a breve descrio includa na classe [*.h] e a documentao detalhada includa na denio da funo [*.cpp]. Aceita os tags: class, struct, union, enum, fn(funo), var (atributos), def (dene), le(arquivo),namespace (um namespace), brief (breve comentrio). Para inserir uma lista:
/**

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX


* Nome Lista -tem A -# -# -tem B -# -# */ Subtem B.1 Subtem B.2 Subtem A.1 Subtem A.2

70

Para criar grupos:


/** @addgroup <NomeGrupo> */ /** @ingroup NomeGrupo */ /** @defgroup NomeGrupo */

Para detalhes, veja a documentao do formato JAVA_DOC.

11.3

Tutorial de congurao e uso do DOXYGEN

O doxygen um programa que gera a documentao (API) a partir de informaes includas no cdigo. As informaes so includas no cdigo utilizando-se o formato JAVA_DOC (veja seo ??). Breve tutorial de uso do doxygen 1. Baixar o programa doxygen (ou usar os CDs da sua distribuio GNU/Linux). Atualmente a maioria das distribuies GNU/Linux inclue o doxygen. Voc pode obter o doxygem no site http://www.stack.nl/~dimitri/doxygen/. 2. Instalar o doxygen usando o arquivo .tar.gz (./congure && make && make install), ou usando pacote rpm. 3. Criar um arquivo de congurao do projeto a ser documentado. doxygen -g nomeArquivoConfiguracao 4. Incluir a documentao em seu cdigo (veja seo ??). 5. Executar o doxygen (gera por default sada html). doxygen nomeArquivoConfiguracao 6. Para gerar sada latex setar a varivel
GENERATE_LATEX = YES V para o diretrio com os arquivos do latex e execute (make && make ps && make pdf). Para gerar 2 folhas por pgina, v para o diretrio com os arquivos do latex e execute: (make && make ps_2on1 && make pdf_2on1).

7. Voc pode adicionar ao doxygem o programa da graphviz. O mesmo usado para gerar diagramas de relacionamento das diversas classes. Procure pelo programa no site (http: //www.research.att.com/sw/tools/graphviz/). Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX

71

Apresenta-se nas linhas abaixo um arquivo de congurao do doxygen. O arquivo inclue comentrios dentro de parenteses. Listing 11.1: Exemplo de arquivo de congurao do doxygen com comentrios.
..# Doxyfile 0.1 #--------------------------------------------------------------------------# General configuration options #--------------------------------------------------------------------------PROJECT_NAME = " Biblioteca de objetos - LIB_LMPT " ( nome projeto ) PROJECT_NUMBER = 0.4 ( verso ) OUTPUT_DIRECTORY = / home / andre / Andre / Desenvolvimento / LIB_LMPT - api / ( diretrio de sada ) OUTPUT_LANGUAGE = English ( linguagem ) EXTRACT_ALL = YES ( extrair todas as informaes ) EXTRACT_PRIVATE = YES ( incluir atributos / funes privados ) EXTRACT_STATIC = YES ( incluir atributos / funes estticas ) HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO #--------------------------------------------------------------------------# configuration options related to the LaTeX output #--------------------------------------------------------------------------GENERATE_LATEX = YES LATEX_OUTPUT = ( diretrio opcional , por default cria diretrio latex ) COMPACT_LATEX = NO PAPER_TYPE = a4wide ( formato da folha ) EXTRA_PACKAGES = LATEX_HEADER = ( link para header ) PDF_HYPERLINKS = YES ( gerar links para pdf ) USE_PDFLATEX = YES ( gerar arquivo pdf ) LATEX_BATCHMODE = NO #--------------------------------------------------------------------------# configuration options related to the RTF output #--------------------------------------------------------------------------GENERATE_RTF = NO RTF_OUTPUT = COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------# configuration options related to the man page output #--------------------------------------------------------------------------GENERATE_MAN = NO MAN_OUTPUT = MAN_EXTENSION = MAN_LINKS = NO #--------------------------------------------------------------------------# configuration options related to the XML output #--------------------------------------------------------------------------GENERATE_XML = NO #--------------------------------------------------------------------------# Configuration options related to the preprocessor #--------------------------------------------------------------------------ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = #--------------------------------------------------------------------------# Configuration :: addtions related to external references #--------------------------------------------------------------------------TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO PERL_PATH = #--------------------------------------------------------------------------# Configuration options related to the dot tool #--------------------------------------------------------------------------HAVE_DOT = YES CLASS_GRAPH = NO ( se true , desabilita gerao do grafico das heranas e gera grfico das heranas e relaes ) COLLABORATION_GRAPH = YES ( grafico da hierarquia e relacionamentos ) INCLUDE_GRAPH = YES ( grafico dos arquivos include ) INCLUDED_BY_GRAPH = YES GRAPHICAL_HIERARCHY = YES ( gera diagrama de heranas ) DOT_PATH = / home / SYSTEM / gv1 .7 c/ bin MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 GENERATE_LEGEND = YES DOT_CLEANUP = YES ( deleta arquivos temporrios ) #--------------------------------------------------------------------------# Configuration :: addtions related to the search engine #---------------------------------------------------------------------------

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX


SEARCHENGINE CGI_NAME CGI_URL DOC_URL DOC_ABSPATH BIN_ABSPATH EXT_DOC_PATHS = NO = = = = = =

72

Observe na listagem acima a opo de uso do programa auxiliar dot tool. O mesmo utilizado para gerar diagramas de relacionamento entre as classes. Para obter informaes gerais sobre o doxygem execute: doxygem --help A sada do comando (doxygem - -help) dada por Listing 11.2: Sada do comando doxygen - -help.
Doxygen version 1.2.8.1 Copyright Dimitri van Heesch 1997 -2001 You can use doxygen in a number of ways : 1. Use doxygen to generate a template configuration file : doxygen [ -s] -g [ configName ] If - is used for configName doxygen will write to standard output . 2. Use doxygen to update an old configuration file : doxygen [ -s] -u [ configName ] 3. Use doxygen to generate documentation using an existing configuration file : doxygen [ configName ] If - is used for configName doxygen will read from standard input . 4. Use doxygen to generate a template style sheet file for RTF , HTML or Latex . RTF : doxygen -w rtf styleSheetFile HTML : doxygen -w html headerFile footerFile styleSheetFile [ configFile ] LaTeX : doxygen -w latex headerFile styleSheetFile [ configFile ] 5. Use doxygen to generate an rtf extensions file RTF : doxygen -e rtf extensionsFile If -s is specified the comments in the config file will be omitted . If configName is omitted Doxyfile will be used as a default .

11.3.1

Exemplo de programa documentado

A listagem a seguir apresenta um exemplo de programa documentado. Listing 11.3: Exemplo de cdigo documentado no formato JAVA_DOC para uso com o programa doxygem.
#ifndef TTeste_h #define TTeste_h /* ========================================================================= PROJETO: Biblioteca LIB_LMPT Assunto/Ramo: TTeste... =========================================================================

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX


Desenvolvido por: Laboratorio de Meios Porosos e Propriedades Termofisicas [LMPT]. @author Andr Duarte Bueno @file TTeste.h @begin Sat Sep 16 2000 @copyright (C) 2000 by Andr Duarte Bueno @email andre@lmpt.ufsc.br */ //----------------------------------------------------------------------//Bibliotecas C/C++ //----------------------------------------------------------------------//----------------------------------------------------------------------//Bibliotecas LIB_LMPT //----------------------------------------------------------------------//#include <Base/_LIB_LMPT_CLASS.h> /* ========================================================================= Documentacao CLASSE: TTeste ========================================================================= */ /** @short Classe de teste das diversas classes da LIB_LMPT. O objetivo dentro da main criar e chamar TTeste que cria e chama as demais classes. Assunto: Teste da LIB_LMPT Superclasse: TTeste @author Andr Duarte Bueno @version verso... @see veja assunto... */ class TTeste { //--------------------------------------------------------------Atributos private: protected: public: //-------------------------------------------------------------Construtor //Construtor TTeste () { }; //--------------------------------------------------------------Destrutor //Destrutor virtual ~ TTeste () { };

73

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX


//----------------------------------------------------------------Mtodos private: protected: public: /** Funo principal, executada por main. Vai solicitar ao usurio o tipo de objeto a ser criado, criar o objeto e passar o controle do programa para o objeto criado */ void Run () ; }; //-----------------------------------------------------------------Friend //Declarao de Funes Friend //ostream& operator<< (ostream& os, TTeste& obj); //istream& operator>> (istream& is, TTeste& obj); #endif

74

11.3.2

Exemplo de diagramas gerados pelo doxygen

Voc pode instalar em seu sistema o programa da graphvis. O programa da graphvis utilizado para gerar diagramas das classes, ilustrando as diversas classes e seus relacionamentos. Gera ainda diagramas das dependncias dos arquivos. Procure pelo programa no site (http://www.research. att.com/sw/tools/graphviz/). Voc pode congurar o doxygen para que use o programa da graphivs, possibilitando assim a incluso dentro da documentao (html, tex), de Figuras ilustrando as hierarquias das diversas classes. Para ilustrar a documentao api gerada pelo doxygen, inclu na distribuio desta apostila o arquivo LIB_LMPT-api.tar.gz. Voc pode descompactar este arquivo e ver como ca a documentao gerada com o seu bronser (netscape). A ttulo ilustrativo, apresenta-se na Figura ?? a hierarquia TMatriz da biblioteca LIB_LMPT. Figura 11.1: Ilustrao da hierarquia TMatriz da biblioteca LIB_LMPT.

Apresenta-se na Figura ?? a hierarquia da classe TRotulador3D. Observe a relao da classe TRotulador3D com as demais classes. Apresenta-se na Figura ?? as dependncias do arquivo TRotulador3D.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX Figura 11.2: Ilustrao da hierarquia da classe TRotulador3D da biblioteca LIB_LMPT.

75

11.4

Documentao prossional com sgml/xml (LYX)

Vimos que a documentao de cdigo um tipo de documentao que includa dentro do cdigo, utilizando o formato JAVA_DOC. Que o programa doxygem utilizado para gerar diversos arquivos html que incluem a documentao de cada arquivo da biblioteca ou programa, e que com o doxygem pode-se gerar sada em outros formatos (como pdf, latex, rtf, xml, manpage). Mas voc tambm vai gerar um manual do usurio e talvez um manual cientco. Neste caso como devo proceder para criar estes manuais ? No mundo GNU/Linux, utiliza-se o DOCBOOK. O docbook um document type denition -DTD, uma especicao de formato de documento. Voc pode implementar o docbook usando sgml (standardized general markup language) ou xml (extensible markup language). mais ou menos assim: Com docbook voc dene o formato do manual, com sgml/xml voc dene a formatao de cada pargrafo. Se voc instalou todos os pacotes de desenvolvimento de sua distribuio, provavelmente j tem disponibilizados os pacotes necessrios. No meu sistema tenho instalados os pacotes: [andre@mercurio Cap4-STL]$ $rpm -qa | egrep docb && rpm -qa | egrep jade docbook-dtd41-xml-1.0-7 docbook-utils-0.6.9-2 docbook-dtd30-sgml-1.0-10 docbook-dtd41-sgml-1.0-10 docbook-utils-pdf-0.6.9-2 docbook-dtd412-xml-1.0-1 docbook-dtd40-sgml-1.0-11 docbook-dtd31-sgml-1.0-10 docbook-style-dsssl-1.64-3 Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX Figura 11.3: Ilustrao das dependncias do arquivo TRotulador3D.

76

jadetex-3.11-4 openjade-1.3-17 Veja detalhes do docbook, sgml e xml no site (http://www.xml.org). Apresenta-se na Figura ?? o site do programa LYX. O programa LYX1 , tem total suporte aos formatos docbbok. Desta forma voc pode gerar o manual do usurio em um programa muito simples de usar (o LYX) e no nal pode gerar verses do seu manual nos formatos html, pdf, sgml, txt.

1 Repito,

que o LYX (

) utilizado para gerar esta apostila.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 11. DOCUMENTAO DE PROGRAMAS USANDO FERRAMENTAS GNU/LINUX

77

Figura 11.4: O site do LYX.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 12 Seqencia de Montagem de Um Programa GNU2


Neste captulo vamos apresentar o desenvolvimento de programas multiplataforma utilizando as ferramentas da GNU.

12.1 Introduo a programao multiplataforma com GNU


Um projeto comum pode ser montado apenas com os arquivos de cdigo (*.h,*.cpp) e o arquivo Makele. O problema deste formato a existncia de centenas de Unix, GNU/Linux, sendo, cada um destes, um pouco diferentes entre si. Por exemplo, o compilador pode se chamar CC, gcc, c++, g++. Na prtica isto implica na necessidade de se corrigir os arquivos Makele para cada mquina alvo. Para solucionar este problema, foram desenvolvidos pela GNU, um conjunto de programas que automatizam a gerao de cdigo, para as mais variadas plataformas. Dentre estes programas, os mais usuais so o aclocal, o autoheader, o automake, o autoconf e o libttol1 . Estes programas so brevemente descritos neste captulo. Observe que ao desenvolver um programa utilizando as ferramentas multiplataforma da GNU, voc poder compilar seu cdigo em qualquer mquina Unix, GNU/Linux, Aix, Solaris, MacOS X, Windows. Pois um projeto GNU inclui o ./congure, um script de shell, que cria os arquivos Makele para cada mquina. Observe na Tabela ??, o diagrama das tarefas executadas pelo programador2 . O primeiro programa a ser executado o aclocal, o mesmo recebe como entrada um conjunto de arquivos de cdigo e um arquivo congure.in, gerando os arquivos aclocal.m4 e acsite.m4. A seguir, executa-se o ifnames para identicao dos includes e denes em comum. O programador usa o autoscan para gerar um esqueleto inicial do arquivo congure.scan, a seguir, o programador usa um editor como o emacs para modicar o arquivo congure.scan, gerando o congure.in. O autoheader usado para gerar o arquivo cong.h. O programador deve gerar diversos arquivos makele.am, um para cada diretrio e ento executar o automake. O automake converte os arquivos makele.am em makele, podendo os mesmos ser executados com o programa make.
1 descrito 2O

no Captulo ??. ambiente de desenvolvimento do kdevelop tem um wizard que gera automaticamente todos estes arquivos para

voc.

78

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

79

Finalmente, o programador executa o programa autoconf. O autoconf gera um script de congurao do programa, usando para isto o arquivo congure.in. A sada do autoconf o arquivo congure, o mesmo ser executado pelo usurio para gerar os makeles especcos para a mquina do usurio. Veja na Tabela ?? a sequncia executada pelo usurio. Tabela 12.1: Sequncia executada pelo programador para montagem de programas multi-plataforma usando o padro GNU. Entrada. *.h, *.cpp congure.in *.h*, *.cpp *.h, *.cpp congure.scan congure.in cong.h.top accong.h cong.h.bot Makele.am aclocal.m4 acsite.m4 congure.in Programa executado aclocal* Sada. aclocal.m4 acsite.m4 Lista dos denes dos diversos arquivos congure.scan congure.in acsite.m4 cong.h.in Makele.am Makele.in

2 3 4 5

ifnames* autoscan* usurio

autoheader* usurio automake*

6 7

autoconf*

congure

Apresenta-se na Tabela ?? a sequncia de tarefas executadas pelo usurio. Esta sequncia executada na mquina do usurio para gerar o programa para a sua mquina. Observe que uma das grandes vantagens deste tipo de distribuio, que se o usurio tem uma mquina Pentium IV, o compilador vai receber instrues para compilar o programa para um Pentium IV e no para um antigo 386. Tabela 12.2: Sequncia executada pelo usurio. Entrada Makele.in cong.h.in Makele.in Makele Cdigo compilado Programa executado ./congure cong.status* make make install Sada Makele cong.cache confg.log cong.h Makele Cdigo Compilado Programa Instalado

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

80

12.2

aclocal

O programa aclocal gera o arquivo aclocal.m4. O aclocal procura todos os arquivos *.m4 na path do automake/autoconf, depois procura o arquivo congure.in, copiando todas as macros encontradas para o arquivo aclocal.m4. Ou seja, todas as macros sero copiadas para o arquivo aclocal.m4. Prottipo e parmetros do aclocal: aclocal [opes] - -help Help do aclocal.

- -acdir=dir Dene o diretrio. - -output=le Dene nome do arquivo de sada. - -verbose Modo verbose (detalhado). - -version Mostra verso do aclocal.

12.3

ifnames

O programa ifnames pesquisa toda a estrutura de diretrios e lista todos os denes dos arquivos *.h e *.cpp. O programa ifnames agrupa todos os denes em um nico arquivo o que til para gerar o arquivo cong.h.in Prottipo do ifnames: ifnames [-h][- -help][-mdir][--macrodir=dir][- -version][le...] - -help[-h] Mostra help. - -verbose[-v] Modo verbose. - -version Mostra verso.

12.4

autoscan

O autoscan pesquisa a estrutura de diretrios e busca arquivos *.h e *.cpp, gerando o arquivo congure.scan. O autoscan extrai informaes do cdigo e dos headers, como chamadas de funes. Prottipo e parmetros do autoscan: autoscan [- -macrodir=dir][- -help][- -verbose] - -help - -version - -srcdir Mostra help. Mostra verso. Diretrio a ser escaneado.

- -verbose[-v] Modo verbose.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

81

12.4.1 Roteiro do autoscan


1. Execute o autoscan para gerar o congure.scan. O arquivo congure.scan serve de esboo inicial para o arquivo congure.in 2. Corrija o arquivo congure.scan, incluindo ali as macros e denies necessrias. 3. Renomeie o arquivo congure.scan para congure.in. Observe que o arquivo congure.in um gabarito usado para gerar o arquivo congure nal.

12.5

autoheader

O autoheader pode ser usado para gerar o arquivo cong.h.in. O arquivo cong.h.in usado pela macro AC_CONFIG_HEADER(le) para gerar o arquivo cong.h. O arquivo cong.h contm denies compartilhadas por todos os arquivos do pacote ( um header comum a todo pacote). Prottipo e parmeros do autoheader: autoheader - -help[-h] Mostra help. - -localdir=dir[-l dir] - -macrodir=dir[-m dir] - -version Mostra verso.

12.5.1

Roteiro do autoheader

1. Crie um arquivo cong.top com as instrues iniciais do cong.h.in. 2. Criar o arquivo accong.h /* Define if the C++ compiler supports BOOL */ #undef HAVE_BOOL #undef VERSION #undef PACKAGE /* Define if you need the GNU extensions to compile */ #undef _GNU_SOURCE 3. Crie um arquivo cong.bot com as instrues nais do cong.h.in. 4. Execute o autoheader. 5. Edite o arquivo cong.h.in gerado pelo autoheader. 6. Inclua no arquivo congure.in a macro AC_CONFIG_HEADER().

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

82

12.6

automake

12.6.1 Introduo ao automake


O automake uma ferramenta para automatizar a criao de makeles independentes de plataforma. Basicamente o programador escreve um arquivo Makele.am para cada diretrio, o automake l estes arquivos e o arquivo congure.in e cria os arquivos Makele.in. O arquivo Makele.in um gabarito para gerao do Makele nal, isto , os arquivos Makele.in sero usados pelo ./congure para gerao dos arquivos Makele nais. A grande vantagem no precisar reescrever os arquivos Makele para cada mquina em que voc vai compilar o programa. Vimos no captulo Make como criar um arquivo makele simples. O automake cria arquivos makele complexos. O automake suporta trs tipos de estruturas de diretrio at deep shallow Todos os arquivos esto em um nico diretrio. Existem vrios subdiretrios e arquivos de congurao no diretrio base. Dentro do Makele.am existe a macro SUBDIRS. O cdigo primrio esta no diretrio de mais alto nvel e os outros cdigos em subdiretrios (usado em bibliotecas).

O automake suporte trs tipos de opes de vericao foreign gnu gnits Checa somente o necessrio (adotado pelo kdevelop). o default, verica a presena dos arquivos padres da gnu (INSTALL, NEWS, README, COPYING, AUTHORS, Changelog) um padro que verica arquivos adicionais ao padro gnu. o mais extenso.

Padronizao do formato dos nomes Os nomes das macros do automake obedecem um padro uniforme. Se o seu pacote tem um programa chamado meu-programa.1, o mesmo ser tratado como meu_programa_1, ou seja substitui - por _ e . por _ . Prottipo e parmetros do automake: automake [opes] -a [add-missing] - -amdir=dir Dene diretrio. - -help Ajuda / Help. - -generate-deps Gera dependncias. - -output-dir=dir Diretrio de output/sada. - -srcdir=dir Diretrio de fonte. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 - -v[verbose] Modo verbose (detalhado). Como um arquivo makele, existem instrues como: PROGRAMS= lista dos programas a serem compilados. EXTRA_PROGRAMS= programas adicionais. bin_PROGRAMS = programas binrios. sbin_PROGRAMS = @PROGRAMS@. Exemplo: bin_PROGRAMS = nomeDoPrograma nomeDoPrograma_SOURCES = nome.h nome.cpp ... nomeDoPrograma_LDADD = @LIBOBJS@

83

Dica: A varivel @LIBOBJS@ copiada do arquivo congure.in para o arquivo makele (substituio simples). Observe que o valor da varivel @LIBOBJS@ denida quando o usurio executa o ./congure. Roteiro do automake Apresenta-se a seguir o roteiro de execuo do automake em um projeto simples. 1. Edite o congure.in, acrescentando as macros: AM_INIT_AUTOMAKE(nome_programa,versao) AC_REPLACE_FUNCS LIBOBJS=listaobjetos da biblioteca AC_SUBST(LIBOBJS) 2. Cria e edita o arquivo makele.am SUBDIRS = lib_lmpt EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO ORGANIZATION HOWTO AUTOMAKE_OPTIONS = foreign bin_PROGRANS= nomePrograma nomePrograma= lista arquivos cpp nomePrograma_LDADD= @LIBOBJS@ 3. Executa o automake. Macros do automake Uma macro realiza um conjunto de operaes. Apresenta-se a seguir um conjunto de macros que podem ser includas nos arquivos congure.in e makele.am. Estas macros so usadas para interfacear o automake com o autoconf. As macros do autoconf iniciam com AC e as do automake com AM. AC_CONFIG_HEADER O automake requer a macro AM_CONFIG_HEADER que similar a AC_CONFIG_HEADER. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 AC_PATH_XTRA Insere as denies do AC_PATH_XTRA em cada arquivo Makele.am. LIBOBJS Inclui os arquivos *.o na lista do LIBOBJS. AC_PROG_RANLIB Necessrio se o pacote compila alguma biblioteca. AC_PROGCXX Necessrio se existe cdigo em C++. AM_PROG_LIBTOOL Executa o pacote libtool. ALL_LINGUAS Checa o diretrio po e os arquivos .po para especicaes relativas a linguagens.

84

AUTOMAKE_OPTIONS Varivel especial denida nos arquivos Makele.am. Suporta um subconjunto de variveis que realizam tarefas especcas. Exemplos: dist-tarZ Cria uma distribuio do pacote no formato .tar.gz. Apresenta-se a seguir um conjunto de macros que podem ser includas no arquivo congure.am e que so fornecidas pelo automake. Estas macros so usadas para interfacear o automake com o autoconf. AM_INIT_AUTOMAKE(nomePacote,verso) Inicializa o automake, rodando um conjunto de macros necessrias ao congure.in AM_CONFIG_HEADER Recongurar o arquivo cong.h levando em conta parmetros do automake AM_ENABLE_MULTILIB AM_FUNC_MKTIME AM_PROG_CC_STDC Se o compilador no esta em ANSIC tenta incluir parmetros para deix-lo no formato ANSIC AM_SANITY_CHECK Verica se os arquivos *.o criados so mais novos que os de cdigo

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 A macro AM_INIT_AUTOMAKE

85

Existe um conjunto de tarefas que precisam ser realizadas, e que so realizadas automaticamente pela macro AM_INIT_AUTOMAKE. As mesmas podem ser executadas manualmente por uma sequncia da forma: Denio das variveis PACKAGE e VERSION Uso da macro AC_ARG_PROGRAM Uso da macro AM_SANITY_CHECK Uso da macro AC_PROG_INSTALL

12.6.2 Sentenas para o automake


Leia o manual do automake, a parte principal, com exemplos no extensa. Qualquer varivel ou macro denida em um arquivo makele.am sobrescreve variveis denidas no congure.in. Voc pode incluir variveis do sistema em seu arquivo Makele.am. Desta forma, pode passar parmetros para diversos Makele.am de forma simplicada. Exemplo: CXXFLAGS = -I${PATH_LIB_LMPT_INCLUDES} -I${PATH_LIB_IMAGO} -I${PATH_LIB_COILIB} DEFS = -D__LINUX__ -D__INTEL__ -D__X11__ -D__MESA__

12.7 autoconf
12.7.1 Introduo ao autoconf
O autoconf uma ferramenta que objetiva automatizar a congurao de seu software para a plataforma alvo. O autoconf inicializa pesquisando as macros instaladas com o pacote autoconf, a seguir verica a presena do arquivo opcional acsite.m4 (no diretrio de instalao do autoconf) e pelo arquivo aclocal.m4 (no diretrio do programa). O arquivo aclocal.m4 criado pelo aclocal. O resultado da execuo do autoconf a criao do arquivo congure. O arquivo congure ser executado pelos usurios para gerao dos arquivos Makele, adaptados a plataforma onde o programa vai ser compilado3 . Dica de portabilidade: Se for usar uma biblioteca no portvel, procure criar um mdulo separado.
3 Lembre-se, quando voc faz o download de um programa no formato .tar.gz, voc primeiro descompacta o arquivo e a seguir executa: ./congure && make && make install. Observe que quando voc executa o ./congure, que realiza uma srie de vericaes em seu sistema e cria os arquivos makeles nais.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

86

12.7.2 Prottipo do autoconf


Prottipo e parmeros do autoconf: autoconf help[-h] Mostra um help.

localdir=dir[-l dir] Dene diretrio local. macrodir=dir[-m dir] Dene diretrio de macros. version Mostra verso.

Vamos apresentar a seguir um exemplo de arquivo congure.in e depois descrever rapidamente as macros que voc pode incluir no congure.in.

12.7.3

Roteiro do autoconf

1. Edite o congure.in, acrescentando as macros: AM_INIT_AUTOMAKE(nome_programa,versao) AC_REPLACE_FUNCS LIBOBJS=listaobjetos da biblioteca AC_SUBST(LIBOBJS)

12.7.4

Estrutura de um arquivo congure.in

Como visto, voc pode utilizar o autoscan para gerar um esboo inicial do arquivo congure.in. O arquivo congure.in usado pelo autoconf para montagem do programa shell congure. O congure.in composto de um conjunto de macros que sero usadas para testar a congurao de seu micro (qual compilador esta instalado, sua localizao,...). Basicamente o programador escreve um arquivo congure.in contendo: Inclue Inclue checks checks checks checks checks checks checks checks Inclue as macros de inicializao AC_INIT as macros de testes for prograns for libraries for headers files for typedefs for structures for compiler caracterstics for library functions for system services as macros de finalizao AC_OUTPUT

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

87

12.7.5 Exemplo de um arquivo congure.in


Apresenta-se a seguir o exemplo de um arquivo congure.in. Observe que uma linha dnl uma linha de comentrio. O nome do arquivo dentro do AC_INIT(Makele.am) usado apenas para vericar o diretrio. Os arquivos gerados pelo autoconf esto em AC_OUTPUT. Observe neste exemplo que dentro da macro AC_OUTPUT esto listados os diversos arquivos makele a serem criados. dnl Exemplo de arquivo configure.in dnl linha de comentrio dnl Process this file with autoconf to produce a configure script. AC_INIT(Makefile.am) AM_CONFIG_HEADER(config.h) AM_INIT_AUTOMAKE(lib_lmpt,0.1) dnl Checks for programs. AC_PROG_CC AC_PROG_CXX AC_PROG_RANLIB dnl Checks for libraries. dnl Checks for header files. dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for library functions. AC_OUTPUT(Makefile lib_lmpt/Makefile lib_lmpt/include/Base/Makefile lib_lmpt/include/Makefile lib_lmpt/source/Base/Makefile lib_lmpt/source/Makefile) Dica: No deixar espaos entre o nome da macro e os paranteses.

12.7.6 Macros do autoconf


Lista-se a seguir um conjunto de macros que podem ser utilizadas para testar a presena de algo. Estas macros fazem parte do autoconf e devem ser includas no arquivo congure.in. Observe que iniciam com AC se forem macros do autoconf e AM se forem macros do automake. As principais macros a serem includas no arquivo congure.in so a AC_INIT e AC_OUTPUT. AC_INIT(arquivo) Processa os parmetros da linha de comando, e Pesquisa a estrutura de diretrios pelos arquivos *.h e *.cpp. O nome do arquivo dentro do AC_INIT usado apenas para vericar se o diretrio esta correto. AC_OUTPUT([arquivo[,comandosextras[,comandos inicializao]]]) Macro que gera os arquivos de sada do comando autoconf. Gera os arquivos Makele.in e congure. Observe que voc pode passar comandos extras e comandos de inicializao. Ou seja, no AC_OUTPUT sero colocados os nomes dos arquivos que sero gerados.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

88

Mas existem muitas outras macros que esto disponveis e que voc pode usar, macros para testes em geral, para pesquisar se determinado programa/biblioteca esta instalado(a), se determinadas funes esto disponveis, entre outros. Lista-se a seguir as macros mais utilizadas. Testes de uso geral AC_CONFIG_AUX_DIR Conguraes auxiliares. AC_OUTPUT_COMMANDS Execuo de comandos de shell adicionais. AC_PROG_MAKE_SET Usado para denir a varivel MAKE=make. AC_CONFIG_SUBDIRS Rodar o congure em cada um dos subdiretrios includos nesta listagem. AC_PREFIX_DEFAULT(prex) Seta o prexo default para instalao (o padro /usr/local). AC_PREFIX_PROGRAM(program) Se o usurio no entrar com prex, procura por um prexo na PATH AC_PREREQ(version) Informa a verso do autoconf que deve ser utilizada, se a verso instalada for anterior emite mensagem de erro. AC_REVISION(revision-info) Inclue mensagem no incio dos arquivos informando o nmero da reviso. Pesquisando programas AC_PROG_CPP Seta a varivel CPP com o nome do pr-processador C existente. AC_PROG_CXX Verica se j foi denida a varivel CXX ou CCC (nesta ordem). Se no denida procura o compilador C++ e seta a varivel CXX. Se o compilador for da GNU, seta a varivel GXX=yes. Se CXXFLAGS no foi denido seta como -g -o2. AC_PROG_CC Identica o compilador C, e dene a varivel CC com o nome do compilador encontrado. Adicionalmente se encontrou o GNU-GCC dene a varivel GCC=yes caso contrrio GCC=. AC_PROG_CXXCPP Seta a varivel CXXCPP com o nome do pr-processador C++. AC_PROG_INSTALL Seta a varivel INSTALL com a path compatvel com o programa de instalao BSD. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 AC_PROG_LN_S Verica se o sistema aceita links simblicos e seta a varivel LNS como ln -s. AC_PROG_RANLIB Seta a varivel RANLIB se o ranlib esta presente.

89

AC_CHECK_PROG(varivel,programa,aoTrue,aoFalse) Checa a existncia da varivel e do programa, se ok realiza ao true se false realiza ao false. AC_CHECK_PROGS(varivel,programas,aoTrue,aoFalse) Checa a existncia da varivel e dos programas, se ok realiza ao true se false realiza ao false. Pesquisando bibliotecas AC_CHECK_LIB(biblioteca,funo,aoTrue,aoFalse) Verica se a funo pertence a biblioteca. AC_HAVE_LIBRARY(biblioteca,aoTrue,aoFalse) Verica se a biblioteca existe. AC_SEARCH_LIB(funo,listaDeBibliotecas,aoTrue,aoFalse) Pesquisa a funo no conjunto de bibliotecas listadas. AC_TRY_LINK AC_TRY_LINK_FUNC AC_COMPILE_CHECK Pesquisando funes AC_CHECK_FUNC(funo,aoTrue,aoFalse) Verica se a funo existe, e executa o comando de shell. AC_CHECK_FUNCS(funo...,aoTrue,aoFalse) Verica se a funo existe, e executa o comando de shell. AC_REPLACE_FUNCS(funo...) Adiciona a funo com o nome funo.o a varivel LIBOBJS. Pesquisando arquivos *.h e *.cpp AC_CHECK_HEADER(header,aoTrue,aoFalse) Verica a existncia do header, se existe executa aoTrue. AC_CONFIG_HEADER(header_a_ser_criado) Arquivo a ser criado com os #denes. Substitui @DEFS@ por -DHAVE_CONFIG_H, o nome padro para o arquivo cong.h. Usado para criar o arquivo cong.h com os header comuns ao pacote. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 AC_CHECK_FILE(arquivo,aoTrue,aoFalse) Checa se o arquivo existe. AC_CHECK_FILES(arquivos,aoTrue,aoFalse) Checa um conjunto de arquivos. AC_TRY_CPP(includes[,aesTrue,aesFalse]) Procura pelos arquivos include, se localizou realiza a ao true, caso contrrio a ao false. AC_EGREP_HEADER(padroPesquisa,headerFile,ao) Se a pesquisa do padro no arquivo header foi ok, realiza a ao. AC_EGREP_CPP(padroPesquisa,cppFile,ao) Se a pesquisa foi ok, realiza a ao. AC_TRY_COMPILE(includes,corpoDaFuno,aoTrue,aoFalse) Cria um programa de teste, com a funo especicada para vericar se a funo existe.

90

PS: Arquivos de headers especicados pelas macros HEADERS..., geralmente no so instalados, e os headers listados em ..._SOURCES no podem ser includos nos ..._HEADERS. Rodando programas de teste AC_TRY_RUN(programa,aoTrue,aoFalse) Tenta rodar o programa, se ok realiza aoTrue. Pesquisando estruturas: Pesquisando typedefs: Veja manual do autoconf. Veja manual do autoconf.

Pesquisando caractersticas do compilador C AC_C_CONST Verica se o compilador suporta variveis const. AC_C_INLINE Verica se o compilador suporta funes inline. AC_CHECK_SIZEOF(tipo[,tamanho]) Ex: AC_CHECK_SIZEOF(int *).

12.7.7 Como aproveitar os resultados das pesquisas realizadas pelo autoconf


Voc coloca um conjunto de macros no arquivo congure.in para testar o seu programa. Os resultados das pesquisas realizadas pelo autoconf podem ser salvas. Como exemplos, denies de diretrizes de pr-processador, denio de variveis de shell. Voc pode salvar os resultados em caches, ou imprimir os resultados das pesquisas na tela. As macros abaixo mostram como fazer: Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 AC_DEFINE(varivel,valor,descrio) Cria varivel dene. Ex: AC_DEFINE(EQUATION, $a > $b) AC_SUBST(varivel) Cria uma varivel de sada a partir de varivel de shell. Dene o nome de uma varivel que dever ser substituda nos arquivos Makele. AC_SUBST_FILE(varivel) O mesmo que acima. AC_CACHE_VAL(cache-id,comando_do_id) Veja manual do autoconf. AC_CACHE_CHECK Verica o cache. AC_CACHE_LOAD Carrega algo do cache. AC_CACHE_SAVE Salva algo no cache. AC_MSG_CHECKING(descrio) Informa o usurio que executou o ./congure o que esta fazendo. AC_MSG_RESULT(descrio_do_resultado) Normalmente uma mensagem com o resultado do que foi checado. AC_MSG_ERROR(descrio_da_mensagem_de_erro) Emite uma mensagem de erro. AC_MSG_WARN(descrio_da_mensagem_de_warning) Emite uma mensagem de warning. Como denir variveis no congure.in e usar no makele.am

91

Apresenta-se a seguir um exemplo de denio de varivel no arquivo congure.in que vai ser usada no arquivo makele.am. No arquivo congure.in SUBDIRS= source doc AC_SUBST(SUBDIRS) No arquivo makele.am ##linha de comentrio VARIAVEL=valor PROG_SOURCES= prog.cpp $(VARIAVEL) SUBDIRS= @SUBDIRS@ Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

92

12.7.8 Variveis denidas no arquivo congure.in e que sero substitudas no arquivo Makele
Alm de testar o sistema como um todo, o autoconf permite a incluso de denies no arquivo congure.in que sero substitudas nos arquivos Makele. Desta forma, voc no precisa car conferindo se uma varivel denida em cada arquivo Makele.am esta coerente. Basta denir a varivel no congure.in, que a mesma ser copiada para cada arquivo Makele. Apresenta-se a seguir uma lista resumida das variveis que so denidas no congure.in para uso do makele.am. bindir Diretrio de instalao do executvel. congure_input Para incluir um comentrio informando que o arquivo foi gerado pelo autoconf. datadir Diretrio para instalao dos arquivos ready-only. exec_prex Prexo dos arquivos executveis que dependem da arquitetura. includedir Diretrio para instalao dos arquivos de headers. infodir Diretrio para instalao dos arquivos de documentao. libdir Diretrio para instalao dos objetos das bibliotecas. libexecdir Diretrio para instalao de executveis que outros programas executam. prex Prexo para arquivos dependentes de plataforma. CXXCOMPILE Comando para compilao de cdigos C++, normalmente setado como: CXXCOMPILE= $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXX Nome do compilador C++. DEFS Opo -D para compiladores C. CFLAGS Opes de debugagem e otimizao para compiladores C. CPPFLAGS Diretrio com arquivos headers e outros parmetros para o pr-processador e compilador C. CXXFLAGS Opes de debugagem e otimizao para compiladores C++. CXXLINK Comando para linkagem de programas C++, normalmente setado como: CXXLINK=$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS)

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 LDFLAGS Opes para o linker. LIBS Opes -l e -L para o linker.

93

Voc pode incluir em seus arquivos makele.am variveis denidas no shell. Ou seja, antes de executar o ./congure && make && make install, o usurio dene algumas variveis em seu shell (ex: PATH_INCLUDE_LIB_LMPT=/usr/include/lib_lmpt). Escrevendo suas macros para utilizao com o autoconf Apresentou-se acima um conjunto de macros disponveis no pacote autoconf para uso no arquivo autoconf.in. Adicionalmente, voc pode construir suas prprias macros e incluir no arquivo congure.in. Veja o manual do autoconf. Variveis relacionadas ao autoconf Veja o manual do autoconf. Variveis de ambiente setadas pelo autoconf Veja o manual do autoconf. Variveis geradas pelo autoconf Veja o manual do autoconf. Denes usados pelo autoconf (e que voc no deve usar nos seus programas) Veja o manual do autoconf. Lista das macros do autoconf (macros que podem ser includas no congure.in) Veja o manual do autoconf. Dica: Observe que no arquivo congure.in existem macros do autoconf (iniciadas com AC_) e do automake (iniciados com AM_), mostrando uma interdependncia do automake e do autoconf .

12.8 autoreconf
Pacote utilizado para reconstruir aquilo que o autoconf construiu, no caso de alteraes na instalao. O autoreconf atualiza os scripts congure. Prottipo e parmetros do autoreconf: autoreconf Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 help[-h] force localdir=dir[-l dir] Dene diretrio. macrodir=dir[-m dir] verbose[-v] Modo verbose. version Mostra verso. Mostra help.

94

12.9

./congure

A execuo do ./congure gera: Um conjunto de arquivos Makele. Um arquivo de header com denes. Um arquivo cong.status. Um arquivo de shell que salva os dados de congurao em um cache. Um arquivo cong.log com as informaes da execuo do ./congure.

12.10

Como incluir instrues do libtool em seu pacote gnu

Voc precisa incluir os arquivos: cong.gues Nomes cannicos. cong.sub Validao de nomes. ltmain.sh Implementa funes bsicas do libtool. Voc pode usar o programa libtoollize. O programa libtoolize adiciona aos seus arquivos as instrues para dar suporte ao libtool, adicionando os arquivos cong.gues cong.sub ltmain.sh. Prottipo e parmetros do libtoolize: libtoolize [opes] automake copy -n force help Copia os arquivos e no os links para o diretrio. No modica os arquivos, apenas mostra as modicaes. Fora a substituio dos arquivos existentes do libtool. Ajuda.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

95

12.10.1 Exemplo de arquivo makele.am usando o libtool


Exemplo: bin_PROGRANS = prog prog.debug #Gera o programa prog_SOURCES = *.cpp prog_LDADD= libNome.a ##-dlopen #Gera o programa com debug prog_debug_SOURCES = *.cpp prog_debug_LDADD= libNome.a ##-dlopen prog_debug_LDFLAGS= -static

12.10.2

Exemplo de arquivo congure.in usando o libtool

Exemplo, acrescentar as macros: ##suporte do autoconf ao libtool AC_PROG_LIBTOOL ##suporte do automake ao libtool AM_PROG_LIBTOOL ##suporte a bibliotecas dinmicas (?) AC_LIBTOOL_DLOPEN Sentenas: Leia os captulos Using Libttol e integrating libttol do manual do libtool. Basicamente o libtool suportado pela varivel LTLIBRARIES.

12.11

Exemplo Completo

Apresenta-se a seguir os arquivos do programa LIB_LMPT. A estrutura de diretrios da forma LIB_LMPT LIB_LMPT/lib_lmpt (Arquivos main.cpp, teste.cpp, teste.h) LIB_LMPT/lib_lmpt/source/base (Arquivos TOperacao.cpp, TMath.cpp) LIB_LMPT/lib_lmpt/include/base (Arquivos TOperacao.h, TMath.h) LIB_LMPT/lib_lmpt/docs LIB_LMPT/Makele.am SUBDIRS = lib_lmpt EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO ORGANIZATION HOWTO AUTOMAKE_OPTIONS = foreign

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 LIB_LMPT/Madele.dist

96

default: all dist: @echo "This file is to make it easier for you to create all you need" aclocal autoheader # use --include-deps, if you want to release the stuff. Dont use it for yourself automake --include-deps autoconf touch stamp-h.in LIST=find ./po -name "*.po"; \ for i in $$LIST; do \ file2=echo $$i | sed -e "s#\.po#\.gmo#"; \ msgfmt -o $$file2 $$i; \ done rm -f Makefile.dist all: aclocal autoheader automake autoconf LIB_LMPT/accong.h /* Define if the C++ compiler supports BOOL */ #undef HAVE_BOOL #undef VERSION #undef PACKAGE /* Define if you need the GNU extensions to compile */ #undef _GNU_SOURCE LIB_LMPT/aclocal.m4 Arquivo grande contendo um conjunto de macros. LIB_LMPT/cong.cache # # # # # # # # # # # # # # This file is a shell script that caches the results of configure tests run on this system so they can be shared between configure scripts and configure runs. It is not useful on other systems. If it contains results you dont want to keep, you may remove or edit it. By default, configure uses ./config.cache as the cache file, creating it if it does not exist already. You can give configure the --cache-file=FILE option to use a different cache file; that is what configure does when it calls configure scripts in subdirectories, so they share the cache. Giving --cache-file=/dev/null disables caching, for debugging configure. config.status only pays attention to the cache file if you give it the --recheck option to rerun configure.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

97

ac_cv_path_install=${ac_cv_path_install=/usr/bin/install -c} ac_cv_prog_CC=${ac_cv_prog_CC=gcc} ac_cv_prog_CXX=${ac_cv_prog_CXX=c++} ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=ranlib} ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross=no} ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes} ac_cv_prog_cc_works=${ac_cv_prog_cc_works=yes} ac_cv_prog_cxx_cross=${ac_cv_prog_cxx_cross=no} ac_cv_prog_cxx_g=${ac_cv_prog_cxx_g=yes} ac_cv_prog_cxx_works=${ac_cv_prog_cxx_works=yes} ac_cv_prog_gcc=${ac_cv_prog_gcc=yes} ac_cv_prog_gxx=${ac_cv_prog_gxx=yes} ac_cv_prog_make_make_set=${ac_cv_prog_make_make_set=yes} LIB_LMPT/cong.h.in /* config.h.in. Generated automatically from configure.in by autoheader. */ /* Name of package */ #undef PACKAGE /* Version number of package */ #undef VERSION LIB_LMPT/config.h /* config.h. Generated automatically by configure. */ /* config.h.in. Generated automatically from configure.in by autoheader. */ /* Name of package */ #define PACKAGE "lib_lmpt" /* Version number of package */ #define VERSION "0.1" LIB_LMPT/cong.log This le contains any messages produced by compilers while running congure, to aid debugging if congure makes a mistake. configure:561: checking for a configure:614: configure:671: configure:717: configure:730: configure:743: configure:756: configure:769: configure:786: configure:899: configure:915: configure:941:

BSD compatible install checking whether build environment is sane checking whether make sets ${MAKE} checking for working aclocal checking for working autoconf checking for working automake checking for working autoheader checking for working makeinfo checking for gcc checking whether the C compiler (gcc ) works gcc -o conftest conftest.c 1>&5 checking whether the C compiler (gcc ) www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Apostila de Programao Para Linux/Unix

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2

98

is a cross-compiler configure:946: checking whether we are using GNU C configure:974: checking whether gcc accepts -g configure:1010: checking for c++ configure:1042: checking whether the C++ compiler (c++ ) works configure:1058: c++ -o conftest conftest.C 1>&5 configure:1084: checking whether the C++ compiler (c++ ) is a cross-compiler configure:1089: checking whether we are using GNU C++ configure:1117: checking whether c++ accepts -g configure:1151: checking for ranlib LIB_LMPT/cong.status #! /bin/sh # Generated automatically by configure. # Run this file to recreate the current configuration. LIB_LMPT/congure #O arquivo configure um arquivo de shell grande ( 50k) #criado pelo autoconf e que quando executado #faz centenas de testes no sistema do usurio e cria os arquivos Makefile. # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 LIB_LMPT/lib_lmpt/Makele.am bin_PROGRAMS = lib_lmpt lib_lmpt_SOURCES = TTeste.cpp main.cpp lib_lmpt_LDADD = ./source/Base/libBase.a SUBDIRS = include source EXTRA_DIST = main.cpp TTeste.cpp TTeste.h LIB_LMPT/lib_lmpt/include/Makele.am SUBDIRS = Base LIB_LMPT/lib_lmpt/include/Base/Makele.am EXTRA_DIST = TMath.h TOperacao.h LIB_LMPT/lib_lmpt/source/Makele.am SUBDIRS = Base

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 12. SEQENCIA DE MONTAGEM DE UM PROGRAMA GNU2 LIB_LMPT/lib_lmpt/source/Base/Makele.am noinst_LIBRARIES = libBase.a libBase_a_SOURCES = TOperacao.cpp TMath.cpp EXTRA_DIST = TMath.cpp TOperacao.cpp LIB_LMPT/lib_lmpt/docs/en/Makele.am EXTRA_DIST = index.html index-1.html index-2.html index-3.html index-4.html index-5.html index-6.html

99

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Captulo 13 Introduo ao Controle de Verses Com o CVS


Neste captulo vamos apresentar o CVS, um sistema para controle das verses de seu programa ou projeto. Vamos ver o que o cvs, os comandos e a seqencia de trabalho. Este captulo foi escrito usando as referncias [1, 8, 6, 13].

13.1

O que o CVS1?

CVS um sistema de controle de verses (Concurrent Versions System). Com CVS voc pode gerenciar diferentes verses de um programa (ou projeto). Pode atualizar, adicionar e eliminar arquivos e diretrios ao programa. Pode criar ramicaes de um projeto. Mltiplos programadores podem trabalhar ao mesmo tempo no mesmo projeto. Informaes recentes sobre o CVS voc encontra no site (http://www.cvshome.org/). O que o repositrio? um diretrio com todos os arquivos e subdiretrios do projeto. Adicionalmente, contm arquivos criados pelo programa cvs para o gerenciamento das verses. O que uma verso, um tag, um release ? Todo arquivo tem uma verso que automaticamente denida pelo cvs. Um tag um nome simblico dado a uma determinada verso do projeto, pode ser usado para delimitar etapas do desenvolvimento de um projeto. Um release uma verso denitiva de todos os arquivos do projeto.
que o CVS no ? CVS no um sistema para construo do soft. No substitui o gerenciamento do soft. No substitui a necessidade de comunicao entre o grupo de desenvolvimento. No serve para testar o soft.
1O

100

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS O que um branch (ramo)?

101

Um branch (ramo) usado para dividir um projeto. Normalmente existe o ramo mestre e os ramos secundrios.

13.2

Comandos do cvs

Veja a seguir o prottipo do programa cvs. Observe que voc passa um conjunto de opes para o cvs; depois, o nome do comando a ser executado e um conjunto de argumentos relativos ao comando. Protocolo: cvs [cvs-options] command [command-options-and-arguments] Os principais comandos do cvs so o cvs checkout que baixa os arquivos do repositrio para seu local de trabalho, o cvs update que atualiza os arquivos do local de trabalho, e o cvs commit, que devolve ao repositrio os arquivos que voc modicou. Lista-se a seguir a sada do comando cvs - -help-options que mostra a lista de opes do programa cvs. Listing 13.1: Sada do comando: cvs - -help-options
[ andre@mercurio cvs ]$ cvs -- help - options CVS global options ( specified before the command name ) are : -H Displays usage information for command . -Q Cause CVS to be really quiet . -q Cause CVS to be somewhat quiet . -r Make checked - out files read - only . -w Make checked - out files read - write ( default ). -l Turn history logging off . -n Do not execute anything that will change the disk . -t Show trace of program execution - - try with -n. -v CVS version and copyright . -T tmpdir Use tmpdir for temporary files . -e editor Use editor for editing log information . -d CVS_root Overrides $CVSROOT as the root of the CVS tree . -f Do not use the ~/. cvsrc file . -z # Use compression level # for net traffic . -x Encrypt all net traffic . -a Authenticate all net traffic . -s VAR = VAL Set CVS user variable .

Lista-se a seguir a sada do comando cvs - -help-commands o mesmo apresenta a lista de comandos do cvs. Listing 13.2: Sada do comando: cvs - -help-commands
CVS commands are : add admin annotate checkout commit diff edit Add a new file / directory to the repository Administration front end for rcs Show last revision where each line was modified Checkout sources for editing Check files into the repository Show differences between revisions Get ready to edit a watched file

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS


editors export history import init kserver log login logout pserver rannotate rdiff release remove rlog rtag server status tag unedit update version watch watchers

102

See who is editing a watched file Export sources from CVS , similar to checkout Show repository access history Import sources into CVS , using vendor branches Create a CVS repository if it doesn t exist Kerberos server mode Print out history information for files Prompt for password for authenticating server Removes entry in . cvspass for remote repository Password server mode Show last revision where each line of module was modified Create patch format diffs between releases Indicate that a Module is no longer in use Remove an entry from the repository Print out history information for a module Add a symbolic tag to a module Server mode Display status information on checked out files Add a symbolic tag to checked out version of files Undo an edit command Bring work tree in sync with repository Show current CVS version (s) Set watches See who is watching a file

Para obter um help especco sobre um determinado comando use o comando: cvs -H comando. Como alguns comandos podem ser repetidos com freqncia, os mesmos possuem sinnimos. A listagem a seguir apresenta estes sinnimos. Listing 13.3: Sada do comando: cvs- -help-synonyms
[ andre@mercurio cvs ]$ cvs -- help - synonyms CVS command synonyms are : add ad new admin adm rcs annotate ann checkout co get commit ci com diff di dif export exp ex history hi his import im imp log lo login logon lgn rannotate rann ra rdiff patch pa release re rel remove rm delete rlog rl rtag rt rfreeze status st stat tag ta freeze update up upd version ve ver

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

103

13.3

Seqencia de trabalho

Apresenta-se nas sees que seguem os comandos e exemplos de uso do cvs. Primeiro vamos criar o repositrio, a seguir vamos importar um projeto antigo (que j existia) para dentro do repositrio. Denido o repositrio e importado o projeto, podemos iniciar o uso efetivo do cvs. Vamos criar um diretrio de trabalho e com o comando checkout copiar os arquivos do repositrio para dentro de nosso diretrio de trabalho. Vamos aprender a adicionar novos arquivos e diretrios ao projeto. Finalmente, vamos devolver para o repositrio os arquivos modicados com o comando commit.

13.3.1 Roteiro para criar um repositrio


1. Setar a varivel CVSROOT no arquivo prole (ou no arquivo ~/.bash_prole): CVSROOT=/home/REPOSITORY export CVSROOT Se estiver usando o cshel setenv CVSROOT = /home/REPOSITORY 2. A seguir, voc deve criar o diretrio onde o repositrio vai ser armazenado (se necessrio, como root): mkdir /home/REPOSITORY Todos os usurios que vo usar o cvs devem ter acesso a este diretrio. A dica criar um grupo de trabalho com permisso de leitura e escrita ao diretrio do repositrio. 3. Voc pode criar um grupo cvs, adicionar ao grupo cvs os usurios que tero acesso ao repositrio e mudar as permisses de acesso ao repositrio. chown -R cvs /home/REPOSITORY chmod g+rwx /home/REPOSITORY 2 A varivel CVSUMASK usada para controlar a forma como os arquivos e diretrios so criados. Consulte um manual de GNU/Linux, Unix, MacOs X para maiores detalhes. 4. O comando init inicializa o uso do cvs, adicionando ao diretrio do repositrio (/home/REPOSITORY) alguns arquivos de controle do programa cvs. cvs init D uma olhada no diretrio /home/REPOSITORY, observe que foi criado o subdiretrio /home/REPOSITORY/CVSROOT. Este subdiretrio contm os arquivos de administrao do cvs. Os arquivos com *,v so read-only.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

104

13.3.2 Para importar os arquivos de seu projeto antigo para dentro do repositrio
Voc provavelmente j tem um diretrio com projetos antigos e com arquivos de programao (*.h, *.cpp). O comando import copia o seu diretrio para dentro do repositrio. Prottipo: cd path_completa_projeto_antigo cvs import -m mensagem path_proj_no_repositorio nome_release nome_tag -m msg uma mensagem curta contento informao sobre o projeto.

path_proj_no_repositorio a path para o diretrio do projeto no repositrio. nome_release o nome do release inicial. nome_tag Informa o tag inicial do projeto (normalmente = start).

Vamos adicionar ao repositrio o projeto exemplo-biblioteca-gnu localizado, em minha mquina, no diretrio: ~/ApostilaProgramacao/Exemplos/Cap-GNU/biblioteca. cd ~/ApostilaProgramacao/Exemplos/Cap-GNU/biblioteca cvs import -m Exemplo de biblioteca usando ferramentas gnu exemplo-biblioteca-gnu R1 start A sada gerada pelo comando import apresentada na listagem a seguir. Observe que a letra N indica um arquivo novo, a letra I um arquivo ignorado (arquivos *.bak *.~so ignorados pelo cvs). A biblioteca recebe um L de library. Listing 13.4: Sada do comando: cvs import
[ andre@mercurio biblioteca ]$ cvs import -m " Exemplo de biblioteca usando ferramentas gnu " exemplo - biblioteca - gnu R1 start N exemplo - biblioteca - gnu /e87 - Polimorfismo . cpp N exemplo - biblioteca - gnu /e87 - Programa . cpp N exemplo - biblioteca - gnu /e87 - TCirculo . cpp I exemplo - biblioteca - gnu / doxygem . config . bak N exemplo - biblioteca - gnu / makefile N exemplo - biblioteca - gnu /e87 - TCirculo .h N exemplo - biblioteca - gnu / doxygem . config N exemplo - biblioteca - gnu /uso - makefile N exemplo - biblioteca - gnu /e87 - PolimorfismoStatic . cpp N exemplo - biblioteca - gnu /e87 - TElipse . cpp N exemplo - biblioteca - gnu /e87 - TElipse .h N exemplo - biblioteca - gnu /e87 - PolimorfismoDinamic . cpp N exemplo - biblioteca - gnu / Makefile N exemplo - biblioteca - gnu /e87 - TPonto . cpp N exemplo - biblioteca - gnu /e87 - TPonto .h N exemplo - biblioteca - gnu /e87 - Polimorfismo I exemplo - biblioteca - gnu /e87 - Polimorfismo . cpp ~ N exemplo - biblioteca - gnu / makefile - libtool cvs import : Importing / home / REPOSITORY / exemplo - biblioteca - gnu /. libs N exemplo - biblioteca - gnu /. libs / libTPonto . al

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS


L exemplo - biblioteca - gnu /. libs / libTPonto . la No conflicts created by this import

105

Voc pode executar o comando ls /home/REPOSITORY ou tree /home/REPOSITORY para ver como os arquivos foram importados para dentro do repositrio. Listing 13.5: Como ca o repositorio aps a importao
/ home / REPOSITORY / | - - CVSROOT | | - - modules | | - - notify | | - - ....... | -- verifymsg ,v -- exemplo - biblioteca - gnu | - - Makefile ,v | - - doxygem . config ,v | - - doxygem . configold ,v | - - e87 - Polimorfismo ,v | - - e87 - Polimorfismo .cpp ,v | - - e87 - PolimorfismoDinamic .cpp ,v | - - e87 - PolimorfismoStatic .cpp ,v | - - e87 - Programa .cpp ,v | - - e87 - TCirculo .cpp ,v | - - e87 - TCirculo .h ,v | - - e87 - TElipse .cpp ,v | - - e87 - TElipse .h ,v | - - e87 - TPonto .cpp ,v | - - e87 - TPonto .h ,v | - - makefile ,v | - - makefile - funciona ,v | - - makefile - libtool ,v | - - makefile -ok ,v -- uso - makefile ,v

Dica: Depois de importar seus projetos para dentro do repositrio, faa um backup dos projetos (tar -cvzf NomeProjeto.tar.gz NomeProjeto) e remova os arquivos do projeto (rm -fr NomeProjeto). Desta forma voc elimina a possibilidade de trabalhar acidentalmente nos arquivos de seu projeto em vez de trabalhar com os arquivos do repositrio.

13.3.3

Para baixar o projeto

O nosso repositrio j foi criado, j denimos um grupo de trabalho e j copiamos para dentro do repositrio um projeto. Agora vamos iniciar o uso efetivo do cvs. Para copiar os arquivos de dentro do repositrio para o diretrio onde voc deseja trabalhar, usa-se o comando checkout. Veja na listagem a seguir o prottipo e os parmetros do comando checkout. Listing 13.6: Sada do comando: cvs -H checkout
[ andre@mercurio cvs ]$ cvs -H checkout Usage : cvs checkout [ - ANPRcflnps ] [ - r rev ] [ - D date ] [ - d dir ] [-j rev1 ] [ - j rev2 ] [ - k kopt ] modules ...

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS


-A Reset any sticky tags / date / kopts . -N Don t shorten module paths if -d specified . -P Prune empty directories . -R Process directories recursively . -c " cat " the module database . -f Force a head revision match if tag / date not found . -l Local directory only , not recursive -n Do not run module program ( if any ). -p Check out files to standard output ( avoids stickiness ). -s Like -c , but include module status . -r rev Check out revision or tag . ( implies -P) ( is sticky ) -D date Check out revisions as of date . ( implies -P) ( is sticky ) -d dir Check out into dir instead of module name . -k kopt Use RCS kopt -k option on checkout . ( is sticky ) -j rev Merge in changes made between current revision and rev . ( Specify the -- help global option for a list of other help options )

106

V para o diretrio onde deseja trabalhar e crie uma cpia de trabalho com checkout. Exemplo mkdir /tmp/workdir cd /tmp/workdir cvs checkout exemplo-biblioteca-gnu cd exemplo-biblioteca-gnu ls -la Observe que todos os arquivos do projeto foram copiados para o diretrio /tmp/workdir/exemplobiblioteca-gnu. Tambm foi criado o diretrio cvs. Este diretrio mantido pelo programa cvs.

13.3.4 Para criar mdulos


Bem, com o comando checkout, zemos uma cpia de trabalho do projeto exemplo-bibliotecagnu. Mas o nome exemplo-biblioteca-gnu muito extenso e seria melhor um nome abreviado. Um mdulo exatamente isto, um nome abreviado para uma path grande no diretrio do repositrio. Veja a seguir como criar um mdulo. 1. Baixa o arquivo modules, localizado em /home/REPOSITORY/CVSROOT/modules cvs checkout CVSROOT/modules 2. Edita o arquivo modules emacs CVSROOT/modules

3. Inclua a linha abaixo (nome_mdulo path) lib-gnu exemplo-biblioteca-gnu 4. Salva o arquivo e envia para o repositrio com o comando

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS cvs commit -m "adicionado o mdulo exemplo-biblioteca-gnu ->lib-gnu"

107

O comando commit usado para devolver para o repositrio todos os arquivos novos ou modicados. Veja na listagem a seguir o prottipo do comando commit. Listing 13.7: Sada do comando: cvs -H commit
[ andre@mercurio cvs ]$ cvs -H commit Usage : cvs commit [ - nRlf ] [ - m msg | - F logfile ] [ - r rev ] files ... -n Do not run the module program ( if any ). -R Process directories recursively . -l Local directory only ( not recursive ). -f Force the file to be committed ; disables recursion . -F logfile Read the log message from file . -m msg Log message . -r rev Commit to this branch or trunk revision . ( Specify the -- help global option for a list of other help options )

Veja na listagem a seguir a sada do comando commit executada no diretrio de trabalho aps a modicao do arquivo CVSROOT/modules. Listing 13.8: Sada do comando cvs commit aps adio de um mdulo
[ andre@mercurio workdir ]$ cvs commit -m " adicionado o mdulo exemplo - biblioteca gnu - > lib - gnu " cvs commit : Examining CVSROOT cvs commit : Examining exemplo - biblioteca - gnu cvs commit : Examining exemplo - biblioteca - gnu /. libs Checking in CVSROOT / modules ; / home / REPOSITORY / CVSROOT / modules ,v <-- modules new revision : 1.2; previous revision : 1.1 done cvs commit : Rebuilding administrative file database

Agora voc pode executar o comando checkout de forma abreviada, usando o nome do mdulo. mkdir /tmp/workdir2 cd /tmp/workdir2 cvs checkout lib-gnu Para que o comando casse ainda mais curto, poderia-se ter utilizado a forma abreviada de checkout. cvs co lib-gnu

13.3.5 Para adicionar/remover arquivos e diretrios


O comando add agenda a adio de arquivos e diretrios que s sero copiados para o repositrio com o comando commit. Da mesma forma, o comando remove agenda a remoo de arquivos e diretrios que s sero removidos do repositrio com o comando commit. Veja a seguir o prottipo destes comandos. Observe que para os comandos funcionarem, voc deve estar no diretrio de trabalho (/tmp/workdir).

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS Para adicionar um arquivo

108

Vamos criar um arquivo leiame.txt, o mesmo contm alguma informao sobre o projeto. Vamos cri-lo com o editor emacs (use o que lhe convier). emacs leiame.txt ...inclui observaes no arquivo leiame.txt... Agora vamos agendar a adio do arquivo com o comando add. A sada do comando apresentada em itlico. cvs add -m "adicionado arquivo leiame.txt" leiame.txt cvs add: scheduling file leiame.txt for addition cvs add: use cvs commit to add this file permanently Depois de modicar outros arquivos, podemos efetivamente adicionar o arquivo leiame.txt no repositrio usando o comando commit. Observe, em itlico, a sada gerada pelo comando commit. cvs commit cvs commit: Examining . cvs commit: Examining .libs cvs commit: Examining novoDir RCS file:/home/REPOSITORY/exemplo-biblioteca-gnu/leiame.txt,v done Checking in leiame.txt; /home/REPOSITORY/exemplo-biblioteca-gnu/leiame.txt,v <-leiame.txt initial revision: 1.1 done Alguns comandos do programa cvs podem abrir um editor de texto para que voc inclua alguma mensagem relativa a operao que foi realizada. No exemplo acima, depois do cvs commit, o cvs abriu o editor emacs. Na sua mquina provavelmente ir abrir o vi. Voc pode alterar o editor a ser aberto pelo cvs, setando no arquivo ~./.bash_prole a varivel de ambiente CVSEDITOR (Em minha mquina: export CVSEDITOR=emacs). Para adicionar vrios arquivos: O procedimento o mesmo, primeiro agenda a adio com add e depois adiciona efetivamente com commit. cvs add -m "adicionados diversos arquivos" * cvs commit Para adicionar um diretrio: A seqencia envolve a criao do diretrio (mkdir novoDir), o agendamento da adio (cvs add novoDir), e a efetiva adio do diretrio com commit. mkdir novoDir cvs add novoDir cvs commit -m "adicionado novo diretrio" novoDir Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

109

Para adicionar toda uma estrutura de diretrios num projeto existente: o mesmo procedimento utilizado para importar todo um projeto. A nica diferena que a path de importao no repositrio vai estar relativa a um projeto j existente. Veja o exemplo: cd novoDir cvs import -m msg path_proj_no_repositorio/novodir nome_release nome_tag. Para remover um arquivo: Voc deve remover o arquivo localmente, agendar a remoo e ento efetivar a remoo com commit. rm leiame.txt cvs remove leiame.txt cvs commit leiame.txt O comando a seguir remove o arquivo localmente e no cvs ao mesmo tempo. cvs remove -f leiame.txt Para remover vrios arquivos: Voc deve remover os arquivos, agendar a remoo e ento remover efetivamente com commit. rm -f * cvs remove cvs commit -m "removidos diversos arquivos" Dica: Se voc zer alteraes locais em um arquivo e depois remover o arquivo, no poder recuperlas. Para que possa recuperar as alteraes, deve criar uma verso do arquivo usando o comando commit. Para remover diretrios: V para dentro do diretrio que quer deletar, e delete todos os arquivos e o diretrio usando: cd nomeDir cvs remove -f * cvs commit //A seguir delete o diretrio: cd .. cvs remove nomeDir/ cvs commit Para renomear arquivos: V para dentro do diretrio onde esta o arquivo a ser renomeado e execute os passos: cd diretorio mv nome_antigo nome_novo cvs remove nome_antigo cvs add nome_novo cvs commit -m Renomeado nome_antigo para nome_novo Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

110

13.3.6 Para atualizar os arquivos locais


Como o cvs permite o trabalho em grupo. Um segundo usurio pode ter copiado e alterado os arquivos do projeto no repositrio. Um segundo usurio realizou as tarefas a seguir2 : mkdir /tmp/workdir3 cd /tmp/workdir3 cvs checkout lib-gnu cd lib-gnu emacs arquivo-usuario2.txt cvs add arquivo-usuario2.txt cvs commit -m arquivo adicionado pelo usuario2 Se outros usurios do projeto modicaram os arquivos do repositrio, ento os arquivos com os quais voc esta trabalhando podem estar desatualizados. Isto , se um outro usurio modicou algum arquivo do repositrio, voc precisa atualizar os arquivos em seu diretrio de trabalho. Bastaria realizar um comando cvs commit devolvendo para o repositrio todos os arquivos que voc modicou, e um comando cvs checkout, que copiaria todos os arquivos do repositrio, atualizados, para seu diretrio de trabalho. Mas este procedimento pode ser lento. Seria mais rpido se o cvs copia-se para seu diretrio de trabalho apenas os arquivos novos e modicados. exatamente isto que o comando update faz. O prottipo do comando update listado a seguir. Listing 13.9: Sada do comando: cvs -H update
[ andre@mercurio cvs ]$ cvs -H update Usage : cvs update [ - APCdflRp ] [ - k kopt ] [ - r rev ] [ - D date ] [ - j rev ] [-I ign ] [ - W spec ] [ files ...] -A Reset any sticky tags / date / kopts . -P Prune empty directories . -C Overwrite locally modified files with clean repository copies . -d Build directories , like checkout does . -f Force a head revision match if tag / date not found . -l Local directory only , no recursion . -R Process directories recursively . -p Send updates to standard output ( avoids stickiness ). -k kopt Use RCS kopt -k option on checkout . ( is sticky ) -r rev Update using specified revision / tag ( is sticky ). -D date Set date to update from ( is sticky ). -j rev Merge in changes made between current revision and rev . -I ign More files to ignore (! to reset ). -W spec Wrappers specification line .

Veja no exemplo como deixar seu diretrio de trabalho com os arquivos atualizados. cd /tmp/workdir cvs update
que o nome do diretrio obtido pelo usurio 1 exemplo-biblioteca-gnu e do usurio 2 lib-gnu. Isto , se voc usa cvs checkout path_proj_no_repositorio o cvs cria o diretrio path_proj_no_repositorio. Se voc usa cvs checkout nome_modulo, o cvs cria o diretrio nome_modulo.
2 Observe

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS cvs update: Updating . U arquivo-usuario2.txt cvs update: Updating .libs cvs update: Updating novoDir

111

Observe que o arquivo arquivo-usuario2.txt criado pelo usurio 2 foi adicionado a sua cpia de trabalho.

13.4

Verses, tags e releases

Descrevemos no incio deste captulo o que um release e um tag. Apresenta-se a seguir como criar e usar releases e tags.

13.4.1

Entendendo as verses

Todos os arquivos do projeto que foram importados ou adicionados ao repositrio tem uma verso. A verso denida automaticamente pelo programa cvs e se aplica aos arquivos individualmente, isto , cada arquivo tem sua verso. De uma maneira geral a verso do arquivo redenida a cada alterao do arquivo que foi comutada com o repositrio. Assim, se o arquivo leiame.txt, que tem a verso 1.1, foi alterado. Quando o mesmo for devolvido ao repositrio com o comando cvs commit, o mesmo passa a ter a verso 1.2. Veja Figura ??.

Figura 13.1: Verses de um arquivo. No exemplo a seguir vai para o diretrio de trabalho e modica o arquivo leiame.txt. Depois realiza um commit. Observe a alterao na verso. cd /tmp/workdir/exemplo-biblioteca-gnu emacs leiame.txt ...faa alteraes no arquivo leiame.txt...e depois salve o arquivo. cvs commit cvs commit: Examining . cvs commit: Examining .libs cvs commit: Examining novoDir Checking in leiame.txt; /home/REPOSITORY/exemplo-biblioteca-gnu/leiame.txt,v new revision: 1.2; previous revision: 1.1 done

<--

leiame.tx

13.4.2

Para criar tags

Como dito acima, cada arquivo do repositrio vai ter uma verso. Entretanto, voc pode realizar diversas modicaes no arquivo leiame.txt (1.1 -> 1.2 -> 1.3 -> 1.4 -> 1.5), algumas modicaes no arquivo makele (1.1 -> 1.2 -> 1.3) e nenhuma modicao no arquivo NomePrograma.cpp (1.1). Ou Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

112

seja, cada arquivo tem um nmero de verso diferente. Seria interessante se voc pudesse se referir a todos os arquivos do projeto em uma determinada data com um mesmo nome simblico. Um tag exatamente isto, um nome simblico usado para obter os arquivos do projeto em determinada data. Veja na Figura ?? como criado um novo tag. Observe que a verso de cada arquivo no alterada.

Figura 13.2: Criando um tag. Assim, em determinado dia eu quero criar um tag simblico, um nome que vou utilizar para todos os arquivos do projeto naquela data. Prottipo para criar um tag para um nico arquivo: cd /tmp/workdir cvs tag nome_release_simblico nome_arquivo Prottipo para criar um tag para todos os arquivos do projeto: cd /tmp/workdir cvs tag nome_release_simblico Veja na listagem a seguir a sada do comando, cvs tag tag1 * executada em nosso diretrio de trabalho. Listing 13.10: Sada do comando: cvs -tag nome
[ andre@mercurio exemplo - biblioteca - gnu ]$ cvs tag tag1 * cvs tag : warning : directory CVS specified in argument cvs tag : but CVS uses CVS for its own purposes ; skipping CVS directory T arquivo - usuario2 . txt T doxygem . config T e87 - Polimorfismo T e87 - Polimorfismo . cpp T e87 - PolimorfismoDinamic . cpp T e87 - PolimorfismoStatic . cpp T e87 - Programa . cpp T e87 - TCirculo . cpp T e87 - TCirculo .h T e87 - TElipse . cpp T e87 - TElipse .h T e87 - TPonto . cpp T e87 - TPonto .h T leiame . txt

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS


T makefile T Makefile T makefile - libtool T uso - makefile cvs tag : Tagging novoDir

113

Para recuperar a verso completa do projeto usando o tag que acabamos de criar: cd /tmp/workdir/exemplo-biblioteca-gnu cvs checkout -r tag1 lib-gnu Observe que para baixar o mdulo lib-gnu usamos cvs checkout lib-gnu, e para baixar o tag1 do mdulo lib-gnu, usamos, cvs checkout -r tag1 lib-gnu. Ou seja, apenas adicionamos aps o comando checkout, o parmetro -r e o nome do tag.

13.4.3

Para criar releases

Geralmente utilizamos um tag para criar uma verso do projeto que esteja funcionando, ou que compreenda a nalizao de um determinado conjunto de tarefas que estavam pendentes. Assim, com o nome do tag voc pode recuperar o projeto naquela data usando um nome abreviado. Entretanto, depois de nalizado o programa ou uma verso funcional, voc pode criar um release do programa. A diferena entre o tag e o release, que o tag no modica a verso dos arquivos do projeto. O release modica a verso de todos os arquivos, dando a todos os arquivos um mesmo nmero de verso. Veja na Figura ?? como ca um novo release.

Figura 13.3: Criando um release. Um release geralmente um pacote funcional, se aplica a todos os arquivos do projeto. Depois de denido o release o mesmo no pode ser modicado. Voc deve criar um release sempre que tiver nalizado uma parte importante de seu programa. Veja a seguir o prottipo para criar um release. Prottipo: cvs commit -r nmero_release

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS cd /tmp/workdir cvs commit -r 2

114

Alm de criar o release, abre o vi3 , para edio de um arquivo de log. Inclua algum comentrio a respeito do release que foi criado. Veja na listagem a seguir a sada do comando cvs commit -r 2. Observe que todos os arquivos passam a ter a mesma verso. Listing 13.11: Sada do comando: cvs commit -r 2
[ root@mercurio lib - gnu ]# cvs commit -r 2 cvs commit : Examining . cvs commit : Examining . libs cvs commit : Examining novoDir Checking in Makefile ; / home / REPOSITORY / exemplo - biblioteca - gnu / Makefile ,v <-- Makefile new revision : 2.1; previous revision : 1.1 done Checking in arquivo - usuario2 . txt ; / home / REPOSITORY / exemplo - biblioteca - gnu / arquivo - usuario2 .txt ,v <-- arquivo usuario2 . txt new revision : 2.1; previous revision : 1.1 done .... .... Checking in leiame . txt ; / home / REPOSITORY / exemplo - biblioteca - gnu / leiame .txt ,v <-- leiame . txt new revision : 2.1; previous revision : 1.3 done

Prottipo para criar um release e j deletar a cpia do diretrio local: cvs release -d diretrio_de_trabalho

13.4.4 Recuperando mdulos e arquivos


O cvs permite que tanto os cdigos novos como os antigos possam ser recuperados. De uma maneira geral basta passar o nome do arquivo e sua verso (tag, release, mdulo). Prottipo para recuperar um release: #Pode-se baixar um release antigo, passando o nome do release. cvs checkout -r nome_release path_projeto_no_cvs #ou o nome do mdulo cvs checkout -r nome_release nome_modulo Prottipo para recuperar um arquivo de uma verso antiga: cvs update -p -r nome_release nome_arquivo > nome_arquivo -p Envia atualizaes para sada padro (a tela). -r nome_release Indica a seguir o nome do release.
3 ou

o editor setado com CVSEDITOR. No vi digite esc :q para sair, esc :q!. para sair sem salvar alteraes.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS nome_arquivo O nome do arquivo a ser baixado > nome_arquivo Redireciona da tela para o arquivo nome_arquivo. No exemplo a seguir, recupera o arquivo leiame.txt do tag1. cvs update -p -r tag1 leiame.txt > leiame-tag1.txt

115

====================================================== Checking out leiame.txt RCS: /home/REPOSITORY/exemplo-biblioteca-gnu/leiame.txt,v VERS: 1.2 ***************

13.5

Para vericar diferenas entre arquivos

O programa cvs tem suporte interno ao programa diff (apresentado no Captulo ??), permitindo comparar os arquivos que esto sendo usados localmente com os do repositrio. Prottipo: #Compara arq local e arq do repositrio cvs diff arq #Verica diferenas de todos os arquivos cvs diff O usurio 2, modicou o arquivo leiame.txt depois de criado o release 2. Veja na listagem a seguir a sada do comando cvs diff, executado pelo usurio 1. Listing 13.12: Sada do comando: cvs-diff
[ andre@mercurio exemplo - biblioteca - gnu ]$ cvs diff cvs diff : Diffing . Index : leiame . txt =================================================================== RCS file : / home / REPOSITORY / exemplo - biblioteca - gnu / leiame .txt ,v retrieving revision 2.2 diff - r2 .2 leiame . txt 7 ,11 d6 < Alterao realizada depois de criado o tag1 . < < < Modificaes realizadas depois do release . < Pelo usurio 2. cvs diff : Diffing . libs cvs diff : Diffing novoDir

13.6

Vericando o estado do repositrio

O cvs tem um conjunto de comandos que voc pode usar para vericar o estado dos arquivos armazenados no repositrio. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

116

13.6.1

Histrico das alteraes

Voc pode obter uma lista com o histrico das alteraes realizadas. Mostra: data, hora, usurio, path usada (ou mdulo, ou ramo), diretrio de trabalho: Prottipo: cvs history

13.6.2

Mensagens de log

Voc pode obter uma lista dos logs do arquivo. Mostra: path no repositrio, verso, nomes simblicos, revises e anotaes realizadas. Prottipo: cvs log arquivo Veja a seguir a sada do comando cvs -log leiame.txt. Observe as diferentes revises e anotaes, o nome do autor. Observe nos nomes simblicos o tag1 e a referencia a verso 1.2, isto signica que quando o usurio solicitar o tag1, corresponde a verso 1.2 do arquivo leiame.txt. Listing 13.13: Sada do comando: cvs -log leiame.txt
RCS file : / home / REPOSITORY / exemplo - biblioteca - gnu / leiame .txt ,v Working file : leiame . txt head : 2.2 branch : locks : strict access list : symbolic names : tag1 : 1.2 keyword substitution : kv total revisions : 5; selected revisions : 5 description : adicionado arquivo leiame . txt ---------------------------revision 2.2 date : 2002/08/12 23:28:55; author : andre ; state : Exp ; lines : +4 -0 Modificaes realizadas no leiame . txt depois de criado o release . ---------------------------revision 2.1 date : 2002/08/12 23:12:05; author : andre ; state : Exp ; lines : +0 -0 Criado o release 2. ---------------------------revision 1.3 date : 2002/08/12 23:10:32; author : andre ; state : Exp ; lines : +1 -0 Alteraes no leiame . txt depois de criado o tag1 . ---------------------------revision 1.2 date : 2002/08/12 22:45:56; author : andre ; state : Exp ; lines : +5 -0 Modificaes no arquivo leiame . txt ---------------------------revision 1.1 date : 2002/08/12 21:33:43; author : andre ; state : Exp ; Efetivamente adicionado o arquivo leiame . txt =============================================================================

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

117

13.6.3

Anotaes

Voc pode obter uma lista das anotaes realizadas. Mostra: verso, nome usurio, data, mensagem. Prottipo: cvs annotate

13.6.4 Vericando o status dos arquivos


O comando status mostra uma srie de informaes a respeito do arquivo. O mesmo pode ser utilizado para vericar quais arquivos precisam ser atualizados. Veja a seguir o prottipo. Prottipo: cvs status -v -R -l Mostra ainda os tags. Processamento recursivo. Somente este diretrio.

Informaes listadas pelo comando status: Up-to-date O arquivo no foi alterado. Locally modied O arquivo foi modicado localmente. Locally added O arquivo foi adicionado localmente. Locally removed O arquivo foi removido localmente. Needs checkout O arquivo foi alterado por terceiro e precisa ser atualizado (Com um update baixa o arquivo mesclando-o com o local. Com um commit atualiza no servidor). File had conicts on merge O arquivo apresenta conitos aps a mistura. Veja na listagem a seguir a sada do comando status. Observe que o arquivo foi localmente modicado. Listing 13.14: Sada do comando: cvs -status leiame.txt
[ andre@mercurio exemplo - biblioteca - gnu ]$ cvs status leiame . txt =================================================================== File : leiame . txt Status : Locally Modified Working revision : Repository revision : txt ,v Sticky Tag : Sticky Date : Sticky Options : 2.2 2.2 ( none ) ( none ) ( none ) Result of merge / home / REPOSITORY / exemplo - biblioteca - gnu / leiame .

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

118

13.7

Ramos e Misturas (Branching and Merging)

O programa cvs permite que voc crie um ramo principal para seu projeto e ramos derivados. Posteriormente voc pode misturar os diferentes ramos. Veja na Figura ?? a disposio de um novo ramo.

Figura 13.4: Como cam os ramos. Depois de nalizado um release de um programa, bastante usual a criao de trs ramos. Digamos que voc esteja trabalhando no projeto gnome, e que o release 1.0 j foi sucientemente testado, podendo ser publicado. Ento, voc cria o release 1.0. Release gnome-1.0. Observe que a verso nal do gnome 1.0. Agora voc pode criar um ramo de patch, o mesmo vai conter os arquivos da verso 1.0, mas com correes de bugs que tenham sido localizados. Assim, se foi identicado algum bug na verso 1.0, voc faz as alteraes no ramo gnome 1.0-patch, deixando o release 1.0 inalterado. Ramo: gnome-1.0-patch Voc pode criar um ramo novo, onde caro os arquivos da nova verso do gnome. Ramo: gnome-1.1 Ou seja, vamos ter trs ramos. O release 1.0 que no ser mais alterado. O patch que vai ter as correes de bugs da verso 1.0 e o 1.1 que ter os arquivos da nova gerao do gnome.

13.7.1 Trabalhando com ramos


Para criar um ramo a partir da cpia de trabalho local (-b de branch): cvs tag -b nome_do_ramo Para criar um ramo a partir de um release existente, sem uma cpia de trabalho local: cvs rtag -b -r nome_do_release nome_do_ramo path_no_repositorio Baixando um ramo: cvs checkout -r nome_do_ramo path_no_repositorio Atualizao dos arquivos locais de um dado ramo: Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS cvs update -r nome_do_ramo path_no_repositorio ou cvs update -r nome_do_ramo nome_modulo Para saber com qual ramo voc esta trabalhando, verique o nome do ramo em Existing tags. cvs status -v nome_arquivo

119

13.7.2 Mesclando 2 verses de um arquivo


Com a opo -j, voc pode vericar as diferenas entre 2 verses de um arquivo. Veja o prottipo e um exemplo a seguir. Prottipo: cvs update -j versoNova -j versoVelha nomeArquivo cvs update -j 2 -j tag1 leiame.txt U leiame.txt RCS file: /home/REPOSITORY/exemplo-biblioteca-gnu/leiame.txt,v retrieving revision 2.2 retrieving revision 1.2 Merging differences between 2.2 and 1.2 into leiame.txt Observe a mensagem apresentada. O cvs recupera a verso 2.2 (relativa ao release -j 2) e a verso 1.2 (relativa ao tag1) e mistura as duas no arquivo leiame.txt.

13.7.3 Mesclando o ramo de trabalho com o ramo principal


Digamos que voc esta trabalhando no ramo principal. Que um segundo usurio criou o ramo_B e fez alteraes no ramo_B. Agora voc quer incluir as alteraes do ramo_B no ramo principal. 1. Baixa o mdulo de trabalho cvs checkout nome_modulo 2. Baixa o upgrade do ramo_B. Ou seja, atualiza os arquivos locais mesclando os mesmos com os do ramo_B. cvs update -j ramo_B 3. Resolve os possveis conitos. Alguns arquivos que tenham sido modicados por outros usurios podem ter conitos de cdigo, voc precisa resolver estes conitos. Correo de possveis conflitos de cdigo... 4. Copia os arquivos de volta para o repositrio, atualizando o repositrio. cvs commit -m Ramo mestre mesclado com ramo_B 5. Para deletar o diretrio local de trabalho (use com cuidado). rm -f -r path_local/ Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

120

13.8

Congurao do cvs no sistema cliente-servidor3

Neste tipo de congurao o projeto principal ca na mquina servidora (ou seja o repositrio ca no servidor). O usurio baixa o programa para sua mquina local usando checkout, faz modicaes e depois copia as modicaes para o repositrio usando o comando commit. O servidor para uso do cvs pode ser um micro pouco potente (133MHz, 32Mb), com HD suciente (4 vezes o tamanho do projeto). O acesso ao repositrio dado por: :tipo_de_acesso:path_do_projeto onde :local: tipo_de_acesso: Voc esta na mquina servidora: Se estiver trabalhando na mesma mquina do repositrio, voc faz um acesso local ao projeto e pode acessar os arquivos do projeto diretamente com cvs checkout path_no_repositorio. Voc esta na mquina cliente: Se estiver remoto, deve-se incluir o nome do servidor : servidor: user@hostname:/path/to/repository Ex: export CVSROOT=:pserver: usuario1@nome_servidor:/path_repositorio cvs checkout path_no_repositorio.

:servidor:

Consulte o manual do cvs para ver como congurar o servidor. Exemplo: Por default, a conexo do cvs usa o protocolo RSH. Assim, se andre esta na mquina mercurio.lmpt.ufsc.br e o servidor enterprise.lmpt.ufsc.br no arquivo .rhosts deve ter a linha: mercurio.lmpt.ufsc.br andre Para testar: rsh -l bach enterprise.lmpt.ufsc.br echo $PATH Deve-se setar na mquina cliente o endereo do programa cvs no servidor com a varivel de ambiente CVS_SERVER.

13.8.1 Variveis de ambiente


Variveis de ambiente do cvs denidas no arquivo prole: $CVSROOT Diretrio de trabalho do cvs. $CVS_SERVER Endereo do programa cvs na mquina servidora. $CVSEDITOR Editor default do cvs. $CVSUMASK Dene o formato dos arquivos novos a serem criados. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

121

13.9

Como baixar programas de terceiros usando o cvs

Veja a seguir as instrues postadas no site http://www.devel.lyx.org/cvs.php3 e que so utilizadas para baixar o programa LYX usando o cvs. Anonymous CVS login In order to make anonymous CVS access easier, you should set your CVSROOT environment variable to :pserver:anoncvs@anoncvs.lyx.org:/usr/local/lyx/cvsroot (Alternatively, you can use the -d option to the cvs commands.). Now just do: cvs login The password is lyx. Finally, cvs checkout lyx-devel This will make a directory lyx-devel and download lots of les into that directory. Of course you can say cvs checkout lyx-1_0_x instead, depending on which module youd like to download.

13.10

Frontends

Existem front-ends para o programa cvs. Para o GNU/Linux, de uma olhada no cervisia, encontrado no site (http://cervisia.sourceforge.net/) e ilustrado na Figura ??. Um frontend para o Windows o wincvs, ilustrado na Figura ??.

13.11 Sentenas para o cvs


Quando voc passa como parmetro de algum comando do cvs um diretrio. Todos os arquivos do diretrio e subdiretrios sofrem o efeito do comando. Uma path, um mdulo, um ramo so equivalentes. Um tag, um release, uma verso so equivalentes. Ou seja, se o programa cvs espera uma path_do_repositrio voc tambm pode passar o nome de um mdulo ou de um ramo. Se o cvs espera um nome de verso, voc pode passar o nome do tag, ou o nome do release. Monte um grupo de trabalho: Para trabalhar em grupo em um projeto, voc deve-se denir um grupo no GNU/Linux, Unix, MacOS X. O grupo de trabalho ter acesso aos arquivos do repositrio num sistema clienteservidor. Pode-se denir diferentes formar de acesso aos arquivos, autenticaes e sistemas de segurana. D uma olhado no manual de congurao do cvs. Links para cvs: http://www.cvshome.org/, a casa do cvs. Outros frontends podem ser encontrados em http://www.cvsgui.org/download.html, e http://www.lincvs.org. Apostila de Programao Para Linux/Unix www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

122

Figura 13.5: Um frontend para o cvs no GNU/Linux, Unix (o cervisia).

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

123

Figura 13.6: Um frontend para o cvs no Windows.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

CAPTULO 13. INTRODUO AO CONTROLE DE VERSES COM O CVS

124

13.12

Um diagrama com os comandos do cvs

Veja na Figura ?? um diagrama com os comandos do cvs.

Figura 13.7: Diagrama com os comandos do cvs.

Apostila de Programao Para Linux/Unix

www.lmpt.ufsc.br - Eng. Andr Duarte Bueno

Referncias Bibliogrcas
[1] Per Cederqvist. Version Management with CVS. GNU, 1993. [2] Mendel Cooper. Building and Installing Software Packages for Linux - HOWTO. LDP, 1999. [3] Hank Dietz. Linux Parallel Processing HOWTO. nux/PPHOWTO/pphowto.html, 1998. LDP, http://yara.ecn.purdue.edu/ ppli-

[4] Ricardo Gratti. Bibliotecas Compartilhadas, volume 5. Revista do Linux, 1999. [5] Ricardo Gratti. Bibliotecas Compartilhadas, volume 5. Revista do Linux, 1999. [6] Cameron Hughs and Tracey Hughes. Object Oriented Multithreading using C++: architectures and components, volume 1. John Wiley Sons, 2 edition, 1997. [7] Guilherme Wunsch Manika. Super-Computador a Preo de Banana, volume 2. Revista do Linux, 1999. [8] Ralf Nolden and Kdevelop-Team. The User Manual to KDevelop. kdevelop team, 1998. [9] Jacek Radajewski and Douglas Eadline. Beowulf http://www.sci.usq.edu.au/staff/jacek/beowulf/BDP, 1998. HOWTO. LDP,

[10] Eric Steven Raymond. Software Release Practice HOWTO. LDP, 2000. [11] Alavoor Vasudevan. C-C++ Beautier HOWTO. LDP, 2001. [12] Alavoor Vasudevan. C++ Programming HOWTO. LDP, 2001. [13] Kurt Wall. Linux Programming Unleashed, volume 1. SAMS, 2 edition, 2001.

125

You might also like