.. title: Documentando código C com o Doxygen .. slug: documentando-codigo-c-com-doxygen .. date: 2023-09-28 22:48:59 UTC-03:00 .. tags: .. category: .. link: .. description: .. type: text A documentação é, sem dúvida, uma parte fundamental no processo de desenvolvimento de código. Ela permite que os usuários e desenvolvedores tenham uma maior compreensão do funcionamento do código e sua utilização, permitindo que a manutenção a médio e longo prazo seja feita de forma mais célere e que essas pessoas possam participar também do desenvolvimento do projeto. .. TEASER_END Para projetos em C/C++, o `Doxygen `__ é a ferramenta mais amplamente utilizada. Um exemplo de projeto que utiliza o Doxygen para documentação é o `KDE `__. O Doxygen gera a documentação a partir do código, anotado por blocos de comentário com `marcações especiais `__, e pode gerar uma saída em html e LaTeX. Vamos aqui criar um projeto simples em C para exemplificar a produção de documentação com o Doxygen. O projeto vai se chamar ``hello``, e contém apenas uma função, que irá mostrar ``"Hello World"`` na tela. Criando o código do projeto =========================== O nosso projeto terá uma estrutura bem simples, com todos os arquivos no mesmo diretório (que eu nomeei ``hello``): .. code:: mkdir hello && cd hello && touch hello.c hello.h main.c O conteúdo do cabeçalho ``hello.h`` é .. code:: c #ifndef __HELLO_H__ #define __HELLO_H__ #ifndef MY_CONST # define MY_CONST 42 #endif void hello (void); #endif /* __HELLO_H__ */ e o código da função no arquivo ``hello.c`` .. code:: c void hello (void) { printf ("Hello World\n"); } Para chamarmos a função ``hello``, vamos criar também o arquivo ``main.c``, que contém a função principal: .. code:: c #include "hello.h" int main (void) { hello (); return MY_CONST; } Para testar, podemos compilar o nosso projeto de uma forma simples no terminal: .. code:: $ gcc -c hello.c $ gcc -c main.c $ gcc hello.o main.o -o hello.exe Executando ``./hello.exe`` veremos a mensagem ``Hello World`` na tela: .. image:: /images/Screenshot_20230928_231256.png Instalando o Doxygen ==================== Você pode checar se o Doxygen está instalado através do comando: .. code:: $ doxygen -v Caso não tenha instalado, você pode olhar na `página oficial do projeto `__ ou na página da sua distribuição: os usuários do `Gentoo `__ (como eu) podem instalar com o `Portage `__, .. code:: # emerge --ask app-doc/doxygen e para usuários do `Debian `__/`Ubuntu `__, .. code:: # apt-get install doxygen Produzindo a documentação ========================= Como eu `falei anteriormente <#doxygen-how>`__, o Doxygen utiliza de anotações especiais no código para gerar a documentação. Para o nosso projeto, podemos reescrever o arquivo de cabeçalho ``hello.h`` da seguinte forma: .. code:: c /// @file hello.h #ifndef __HELLO_H__ #define __HELLO_H__ /** * The answer to the ultimate question about life, the Universe, and * everything. */ #ifndef MY_CONST # define MY_CONST 42 #endif /** * Say hello! */ void hello (void); #endif /* __HELLO_H__ */ Note a presença dos blocos :: /** * ... text ... */ no cabeçalho. Criando o Doxyfile ------------------ O ``Doxyfile`` é o arquivo de configuração que controla o Doxygen. Para criar um modelo de configuração, execute no diretório principal do projeto: .. code:: $ doxygen -g onde o ``-g`` significa ``generate``. Isso irá criar o arquivo ``Doxyfile`` no diretório do projeto. Gerando a documentação do Doxygen --------------------------------- Para criar a documentação com o Doxygen: .. code:: $ doxygen Isto irá gerar dois novos diretórios: - ``html/``, - ``latex/``. Por padrão, o Doxygen cria uma documentação em formato `LaTeX `__ além do HTML. Se você abrir o arquivo ``html/index.html`` no seu navegador, você vai ver algo parecido com isso: .. image:: /images/Screenshot_20230928_235627.png :width: 85% E entrando no menu ``Files > File List > hello.h``, você verá a documentação do arquivo ``hello.h``: .. image:: /images/Screenshot_20230928_235317.png Melhorando a cara da documentação ================================= Embora o resultado seja funcional, a página gerada possui um visual bem básico. Para tornar a aparência um pouco mais atrativa, o Doxygen oferece algumas `opções de customização `__, e entre elas, a opção de incluir estilos em CSS. É aí que entra o projeto `Doxygen Awesome `__, que fornece uma camada de estilo adicional para o Doxygen. Para utilizá-lo existem algumas opções de instalação na `página oficial `__, e eu vou seguir com a instalação manual, clonando o repositório como um submódulo do git: .. code:: git submodule add https://github.com/jothepro/doxygen-awesome-css.git cd doxygen-awesome-css git checkout v2.2.1 O projeto oferece dois layouts, e vou escolher o layout com barra lateral. Para isso é também necessário modificar as seguintes opções do ``Doxyfile``: .. code:: GENERATE_TREEVIEW = YES # required! DISABLE_INDEX = NO FULL_SIDEBAR = NO HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css \ doxygen-awesome-css/doxygen-awesome-sidebar-only.css HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5 E, invocando ``doxygen`` novamente, a documentação gerada será parecida com esta: .. image:: /images/Screenshot_20230929_002215.png :width: 85% :alt: alternate text Código de exemplo ================= O repositório contendo o código utilizado como exemplo está disponível em: https://github.com/padawanphysicist/c-api-doc-doxygen