Как установить doxygen
Перейти к содержимому

Как установить doxygen

  • автор:

Compiling from source on UNIX

If you downloaded the source distribution, you need at least the following to build the executable:

  • The GNU tools flex , bison , libiconv and GNU make
  • You need python (version 2.7 or higher, see https://www.python.org).
  • In order to generate a Makefile for your platform, you need cmake version 3.14 or later.

To take full advantage of doxygen’s features the following additional tools should be installed.

  • Qt Software’s GUI toolkit Qt version 5.14 or higher (including Qt 6). This is needed to build the GUI front-end doxywizard.
  • A $» width=»34″ height=»13″ /> distribution: for instance TeX Live This is needed for generating $» width=»34″ height=»13″ />, Postscript, and PDF output.
  • the Graph visualization toolkit version 2.38 or higher Needed for the include dependency graphs, the graphical inheritance graphs, and the collaboration graphs. If you compile graphviz yourself, make sure you do include freetype support (which requires the freetype library and header files), otherwise the graphs will not render proper text labels.
  • For formulas in the HTML output (when MathJax is not used) or in case you do not wish to use pdflatex , the ghostscript interpreter is needed. You can find it at www.ghostscript.com.

Compilation is now done by performing the following steps:

    Unpack the archive, unless you already have done that:

gunzip doxygen-$VERSION.src.tar.gz # uncompress the archive tar xf doxygen-$VERSION.src.tar # unpack it
cd doxygen-$VERSION mkdir build cd build
cmake -G "Unix Makefiles" ..

cmake tries to determine the platform you use, and will look for the requires tools. It will report if something is missing. If you have Qt-5.14 or higher installed and want to build the GUI front-end, you should enable it as follows:

cmake -Dbuild_wizard=YES ..

For an overview of other configuration options use

cmake -L ..
make
cmake -Dbuild_doc=YES .. make docs
cmake -DLIBCLANG_BUILD_STATIC=ON \ -DBUILD_SHARED_LIBS=OFF \ -DLLVM_ENABLE_PIC=OFF \ -DLLVM_BUILD_LLVM_DYLIB=OFF \ -DLLVM_BUILD_LLVM_C_DYLIB=OFF \ -DLLVM_ENABLE_TERMINFO=OFF \ path_to_llvm_root_source_dir

and then build doxygen with these options:

cmake -DCMAKE_BUILD_TYPE=Release \ "-DCMAKE_FIND_LIBRARY_SUFFIXES=.a" \ "-ldl;-lz;-lpthread" \ -Duse_libclang=YES \ path_to_doxygen_root_source_dir

Installing the binaries on UNIX

After the compilation of the source code do a make install to install doxygen. If you downloaded the binary distribution for Linux, type:

make install

Binaries are installed into the directory /usr/local/bin , man pages in /usr/local/man/man1 and documentation in /usr/local/doc/doxygen To change this just edit the Makefile.

Note You need the GNU install tool for this to work (it is part of the coreutils package). Other install tools may put the binaries in the wrong directory!

If you have a RPM or DEB package, then please follow the standard installation procedure that is required for these packages.

Compiling from source on Windows

From version 1.8.10 onwards, build files need to be generated by cmake. cmake can be downloaded from https://cmake.org/download/

At the moment only the community version of Visual Studio 2019 is tested, but other version might also work.

Alternatively, you can compile doxygen the UNIX way using Cygwin or MinGW.

The next step is to install modern versions of bison and flex (see https://sourceforge.net/projects/winflexbison/. After installation and adding them to your path rename win_flex.exe to flex.exe and win_bison.exe to bison.exe ) Furthermore you have to install python (version 2.7 or higher, see https://www.python.org). These packages are needed during the compilation process.

Download doxygen’s source tarball and put it somewhere (e.g. use c:\tools )

Now start a visual studio native command shell (for either x86 or x64) and type

cd c:\tools tar zxvf doxygen-x.y.z.src.tar.gz

to unpack the sources (you can obtain tar from e.g. https://gnuwin32.sourceforge.net/packages.html). Alternatively you can use an unpack program, like 7-Zip (see https://www.7-zip.org/) or use the built-in unpack feature of modern Windows systems).

Now your environment is setup to generate the required project files for doxygen .

change directory to the doxygen-x.y.z directory, create and change to a build directory

mkdir build cd build cmake -G "Visual Studio 14 2015" ..

This will create a project file then can be opened in Visual Studio.

If you prefer compiling from the command prompt you can use the following instead:

mkdir build cd build cmake -G "NMake Makefiles" .. nmake

Note that compiling Doxywizard requires Qt 5.14 or newer (see https://doc.qt.io/).

Also read the next section for additional tools you may need to install to run doxygen with certain features enabled.

Installing the binaries on Windows

Doxygen comes as a self-installing archive, so installation is extremely simple. Just follow the dialogs.

After installation it is recommended to also download and install GraphViz (version 2.38 or better is highly recommended). Doxygen can use the dot tool of the GraphViz package to render nicer diagrams, see the HAVE_DOT option in the configuration file.

If you want to produce compressed HTML files (see GENERATE_HTMLHELP) in the configuration file, then you need the Microsoft HTML help workshop. In the beginning of 2021 Microsoft took the original page, with a.o. the download links, offline the HTML help workshop was already many years in maintenance mode). You can download the HTML help workshop from the web archives at Installation executable.

If you want to produce Qt Compressed Help files (see QHG_LOCATION) in the configuration file, then you need qhelpgenerator which is part of Qt. You can download Qt from Qt Software Downloads.

In order to generate PDF output or use scientific formulas you will also need to install LaTeX and Ghostscript.

$\mbox<\LaTeX></p>
<p>For $» width=»34″ height=»13″ /> a number of distributions exists. Popular ones that should work with doxygen are MikTex and proTeXt.</p>
<p>Ghostscript can be downloaded from Sourceforge.</p>
<p><img decoding=

Go to the next section or return to the index.

  • Generated on Sat Oct 21 2023 21:20:29 for Doxygen Manual by 1.10.0

Как установить doxygen

Автор: Malaja.
Дата написания: 28.04.2009.
Права на статью принадлежат автору и Клубу программистов «Весельчак У».

Эта статья возникла после очередной попытки вспомнить, как оно там конфигурируется, чтобы все работало 😉

Сам Doxygen представляет собой инструмент для создания онлайн-документации к Вашему любимому и выстраданному коду. Он бесплатен, посему очень любим фирмами.

Инсталляция

Сначала загружаем сам doxygen, затем — графический инструмент graphviz, с помощью которого можно строить диаграммы:

  • http://www.stack.nl/~dimitri/doxygen/
  • http://www.graphviz.org/

Комментарии

Если мы хотим, чтобы в документации также появлялись наши комментарии, которые стоят в коде, их необходимо помечать таким образом:

/// сам комментарий
Остальные варианты — см. мануал.
Конфигурация
Теперь в нашей рабочей директории стартуем cmd, в котором набираем:
Соответственно, вместо мы пишем, что сами хотим (так, в моем примере это composTest_doxygen.cfg).

После выполнения этой команды будет создан стандартный конфиг. Для его обработки нам понадобится Doxywizard. Посему стартуем и приступаем к установкам, которые нам необходимы:

Если хотим увидеть список файлов, директорий и т.д.

Шаг 6. Смотреть дополнительное описание.

При включении опции GENERATE_TREEVIEW в документации появляется левая часть.

Рассмотрим последствия включения тех или иных тегов:
1. CALL_GRAPH и CALLER_GRAPH: создает схемы вызова функций:

2. COLLABORATION_GRAPH:

3. GRAPHICAL_HIERARCHY:

4. CLASS_DIAGRAMS и CLASS_GRAPH:

5. HAVE_DOT — должно быть включено для создания диаграмм.
6. HIDE_UNDOC_RELATIONS — лучше оставить выключенным.
7. DOT_IMAGE_FORMAT — попробовала установить jpg — не пошло. Оставила png.
8. DOT_PATH — указала место инсталляции графического инструмента.

9. MAX_DOT_GRAPH_DEPTH — в моем случае между установкой 0 или 50 разницы никакой. Но в каждом конкретном случае это надо смотреть самому.

Дополнительное описание

/*! \mainpage OMSp_MBT_ComposTest 
*
* \section intro_sec Introduction
*
* Developer:
* - имя
*
* \section requirements Requirements
* The application OMSp_MBT_ComposTest.dll requires the following external stuff:
* - lib1
* - dll1
*
* \section changelog Changelog
*
* - February 2009: initial release
*
* \section About_sec About this documentation
*
* \subsection step1 Location
*
* This documentation can be found on file://dir1/dir2/index.html
*
* \subsection step2 Updating
*
* Requirements
* - Installed doxygen package (from http://www.stack.nl/~dimitri/doxygen)
* - Optional: Installed graphviz tool for diagrams (from http://www.graphviz.org)
*
Note: you have add the bin path of the installation to the
* PATH environment variable

*
* Generating
*
* - go to source location dir1\project_dir
* - open a cmd window
* - type doxygen наш_конфиг_файл.cfg
*
* Configuration files
* - наш_конфиг_файл.cfg (text file; general configuration of input files and output)
* - имя_этого_файла.txt (text file for processing this Main Page)
*/

Документируем код эффективно при помощи Doxygen

Данная статья входит в получившийся цикл статей о системе документирования Doxygen:

  1. Документируем код эффективно при помощи Doxygen
  2. Оформление документации в Doxygen
  3. Построение диаграмм и графов в Doxygen

В этой статье мы сначала познакомимся с самой системой и её возможностями, затем разберёмся с её установкой и базовыми принципами работы, и, наконец, завершим знакомство рассмотрением различных примеров документации, примеров того, как следует документировать те или иные части кода. Словом, познакомимся со всем тем, что позволит вам освоиться и начать работать с этой замечательной системой.

Введение

Вероятнее всего, каждый из нас сталкивался с результатами работы различных генераторов документации. Общий принцип их работы следующий: на вход такого генератора поступает специальным образом комментированный исходный код, а иногда и другие компоненты программы, а на выходе создаётся готовая документация для распространения и использования.

Рассматриваемая система Doxygen как раз и выполняет эту задачу: она позволяет генерировать на основе исходного кода, содержащего комментарии специального вида, красивую и удобную документацию, содержащую в себе ссылки, диаграммы классов, вызовов и т.п. в различных форматах: HTML, LaTeX, CHM, RTF, PostScript, PDF, man-страницы.

  1. Документация к API игрового движка CrystalSpace
  2. Документация к Visualization Toolkit
  3. Документация к исходникам Abiword
  4. Документация к API KDE
  5. Документация к API Drupal

Впрочем, следуя сложившейся традиции, в примерах я буду использовать C++, однако это не должно смущать вас, если вы предпочитаете другой поддерживаемый язык, поскольку особой разницы на практике вы даже не заметите, и большинство сказанного далее будет справедливо и для вашего языка.

К слову, список проектов, использующих Doxygen имеется на официальном сайте, причём большинство из этих проектов свободные. Поэтому желающие могут скачать исходник того или иного проекта и посмотреть как там разработчики осуществляли документацию.

Установка и настройка

Скачать последнюю версию Doxygen можно на официальном сайте, дистрибутивы которой доступны для большинства популярных операционных систем, кроме того, вы можете воспользоваться вашим пакетным менеджером. Помимо этого для комфортной и полнофункциональной работы рекомендуется установить Graphviz.

Далее работа с Doxygen весьма тривиальна: достаточно запустить программу, указав ей путь к файлу с настройками.

doxygen

Но в этом файле и вся тонкость. Дело в том, что каждому проекту соответствует свой файл настроек, в котором может быть прописан путь до исходников проекта, путь, по которому должна быть создана документация, а также большое число других разнообразных опций, которые подробно описаны в документации, и которые позволяют максимально настроить документацию проекта под свои нужды.

В принципе, для редактирования данного файла и, вообще, работой с Doxygen, можно воспользоваться программой Doxywizard, которая чаще всего идёт вместе с Doxygen и которая позволяет чуть удобнее работать с файлом настроек (слева – Doxywizard; справа – файл открытый в текстовом редакторе):

Итак, приступим к созданию файла с настройками. Вообще, если вы используете Doxywizard, то он будет создан автоматически, в противном случае для создания этого файла необходимо запустить программу Doxygen с ключом -g (от generate):

doxygen -g

Рассмотрим основные опции, которые могут вам пригодится, чтобы создать первую вашу документацию:

Тэг Назначение По умолчанию
DOXYFILE_ENCODING Кодировка, которая используется для всех символов в данном файле настроек UTF-8
OUTPUT_LANGUAGE Устанавливает язык, на котором будет сгенерирована документация English
PROJECT_NAME Название проекта, которое может представлять собой единое слово или последовательность слов (если вы редактируете вне Doxywizard, последовательность слов необходимо поместить в двойные кавычки) My Project
PROJECT_NUMBER Данный тэг может быть использован для указания номера проекта или его версии
PROJECT_BRIEF Краткое однострочное описание проекта, которое размещается сверху каждой страницы и даёт общее представление о назначении проекта
OUTPUT_DIRECTORY Абсолютный или относительный путь, по которому будет сгенерирована документация Текущая директория
INPUT Список файлов и/или директорий, разделенных пробелом, которые содержат в себе исходные коды проекта Текущая директория
RECURSIVE Используется в том случае, если необходимо сканировать исходные коды в подпапках указанных директорий NO

После того, как мы внесли необходимые изменения в файл с настройками (например, изменили язык, названия проекта и т.п.) необходимо сгенерировать документацию.

Для её генерации можно воспользоваться Doxywizard (для этого необходимо указать рабочую директорию, из которой будут браться исходные коды, перейти на вкладку «Run» и нажать «Run doxygen») или запустив программу Doxygen, указав ей в качестве параметра путь к файлу с настройками:

doxygen
Основы документирования на Doxygen

Теперь, когда мы разобрались с тем, как настраивать Doxygen и работать с ним, впору разобраться с тем, как необходимо документировать код, основными принципами и подходами.

  1. Он может быть размещён перед или после объявления или определения класса, члена класса, функции, пространства имён и т.д.;
  2. Либо его можно располагать в произвольном месте (и даже другом файле), но для этого потребуется явно указать в нём, к какому элементу кода он относится. Мы не будет рассматривать этот подход, поскольку даже разработчики рекомендуют его избегать, но если интересно, то подробнее о нём можно прочитать в документации.

Сразу отметим, что, вообще, всего существует два основных типа документирующих блоков: многострочный блок и однострочный блок.

Разница между ними чуть более сильная, чем между однострочным и многострочным комментарием. Дело в том, что текст, написанный в однострочном блоке относится к краткому описанию документируемого элемента (сродни заголовку), а текст, написанный в многострочном блоке относится к подробному описанию. Про эту разницу не следует забывать.

Многострочный блок

Мы сказали, что любой блок – это комментарий, оформленный специальным образом. Поэтому необходимо определить каким таким «специальным образом». Вообще, существует целый ряд способов для описания многострочного блока, и выбор конкретного способа зависит от ваших предпочтений:

    JavaDoc стиль (напоминает обычный C комментарий, но начинающийся с двух звездочек):

/** * . первая строчка . * . вторая строчка . */ 

При этом звездочки не обязательно ставить на каждой строке. Такая запись будет эквивалентной:

/** . первая строчка . . вторая строчка . */ 
/*! * . первая строчка . * . вторая строчка . */ 

Для указания краткого описания может быть использована команда \brief. Указанный после команды текст, вплоть до конца параграфа будет относится к краткому описания, и для отделения подробного описания и краткого описания используется пустая строка.

/*! \brief Краткое описание и его продолжение. Подробное описание */ 
Однострочный блок

Для описания однострочного блока опять же существует целый ряд способов оформления, рассмотрим два из них:

    Можно использовать специальный комментарий в C++ стиле:

/// Краткое описание 
//! Краткое описание 

    Для указания подробного описания в однострочном документирующем блоке может быть использована команда \details:

/// \details Подробное описание 

Например следующие два способа документирования дадут один и тот же результат:

/// \brief Краткое описание /// \details Подробное описание 
///Краткое описание /*! Подробное описание */ 
Размещение документирующего блока после элемента

Во всех предыдущих примерах подразумевалось, что документирующий блок предварял документируемый элемент, но иногда бывают ситуации, когда удобнее разместить его после документируемого элемента. Для этого необходимо в блок добавить маркер »

int variable; ///< Краткое описание 
Пример документации

Теперь рассмотрим то, как это будет выглядеть на практике. Ниже представлен документированный код некоторого класса в соответствии с теми правилами, которые мы рассматривали ранее.

/*! \brief Родительский класс, не несущий никакой смысловой нагрузки Данный класс имеет только одну простую цель: проиллюстрировать то, как Doxygen документирует наследование */ class Parent < public: Parent(); ~Parent(); >; 

В итоге Doxygen сформирует на основе данных комментариев следующую красиво оформленную страничку (здесь приведена вырезка из неё):

Теперь, когда мы научились основам, пришла пора познакомиться с тем, как можно детализировать документацию. Инструментом для этого являются команды.

Команды

С несколькими из команд в Doxygen мы успели познакомиться (речь идёт о \brief и \details), однако на самом деле их значительно больше. Полный их список приведён в официальной документации.

Вообще, любая команда в Doxygen представляет собой слово на английском языке предваренное символом "\" или "@" (обе записи тождественны) и таких команд очень много, порядка двухсот. Приведём для примера несколько таких команд:

Команда Значение
\authors Указывает автора или авторов
\version Используется для указания версии
\date Предназначена для указания даты разработки
\bug Перечисление известных ошибок
\warning Предупреждение для использования
\copyright Используемая лицензия
\example Команда, добавляемая в комментарий для указания ссылки на исходник с примером (добавляется после команды)
\todo Команда, используется для описания тех изменений, которые необходимо будет сделать (TODO).

Пример использования некоторых команд и результат приведены ниже:

/*! \brief Дочерний класс \author Norserium \version 1.0 \date Март 2015 года \warning Данный класс создан только в учебных целях Обычный дочерний класс, который отнаследован от ранее созданного класса Parent */ class Son : public Parent < public: Son(); ~Son(); >; 

Далее будут использоваться следующие обозначения при описании аргументов команды, когда будет приводиться её общий формат:

Обозначение Значение
Угловые скобки показывают, что аргумент представляет собой одно слово
(. ) Круглые скобки показывают, что аргументом является весь текст вплоть до конца строки, на которой размещена команда
Фигурные скобки показывают, что аргументом является весь текст вплоть до до следующего параграфа. Параграфы разделяются пустой строкой или командой-разделителем

Кроме того, обратите внимание на то, что вы можете создавать и собственные команды. Подробно об этом можно прочитать в соответствующем разделе документации.

Документирование основных элементов исходного кода

Теперь мы можем рассмотреть специфичные особенности документирования различных элементов исходного кода, начиная от файлов в целом и заканчивая классами, структурами, функциями и методами.

Документирование файла

Хорошей практикой является добавление в начало файла документирующего блока, описывающегося его назначение. Для того, чтобы указать, что данный блок относится к файлу необходимо воспользоваться командой \file (причём в качестве параметра можно указать путь к файлу, к которому относится данный блок, но по умолчанию выбирается тот файл, в который блок добавляется, что, как правило, соответствует нашим нуждам).

/*! \file \brief Заголовочный файл с описанием классов Данный файл содержит в себе определения основных классов, используемых в демонстрационной программе */ #ifndef CLASSES_H #define CLASSES_H . #endif // CLASSES_H 
Документирование функций и методов

При документировании функций и методов чаще всего необходимо указать входные параметры, возвращаемое функцией значение, а также возможные исключения. Рассмотрим последовательно соответствующие команды.

Параметры

Для указания параметров необходимо использовать команду \param для каждого из параметров функции, при этом синтаксис команды имеет следующий вид:

\param []

  1. Имя параметра – это имя, под которым данный параметр известен в документируемом коде;
  2. Описание параметра представляет собой простое текстовое описание используемого параметра..
  3. Направление – это опциональный атрибут, который показывает назначение параметра и может иметь три значения "[in]", "[out]", "[in,out]";
/*! Копирует содержимое из исходной области памяти в целевую область память \param[out] dest Целевая область памяти \param[in] src Исходная область памяти \param[in] n Количество байтов, которые необходимо скопировать */ void memcpy(void *dest, const void *src, size_t n); 

В результате мы получим такую вот аккуратную документацию функции:

Возвращаемое значение

Для описание возвращаемого значения используется команда \return (или её аналог \returns). Её синтаксис имеет следующий вид:

\return

Рассмотрим пример с описанием возвращаемого значения (при этом обратите внимание на то, что параметры описываются при помощи одной команды и в результате они в описании размещаются вместе):

/*! Находит сумму двух чисел \param a,b Складываемые числа \return Сумму двух чисел, переданных в качестве аргументов */ double sum(const double a, const double b); 

Получаем следующий результат:

Исключения

Для указания исключения используется команда \throw (или её синонимы: \throws, \exception), которая имеет следующий формат:

\throw

Простейший пример приведён ниже:

\throw std::bad_alloc В случае возникновения ошибки при выделении памяти 
Документирование классов

Классы также могут быть задокументированы просто предварением их документирующим блоком. При этом огромное количество информации Doxygen получает автоматически, учитывая синтаксис языка, поэтому задача документирования классов значительно упрощается. Так при документировании Doxygen автоматические определяет методы и члены класса, уровни доступа к функциям, дружественные функции и т.п.

Если ваш язык не поддерживает явным образом определенные концепции, такие как например уровни доступа или создание методов, но их наличие подразумевается и его хотелось бы как-то выделить в документации, то существует ряд команд (например, \public, \private, \protected, \memberof), которые позволяют указать явно о них Doxygen.

Документирование перечислений

Документирование перечислений не сильно отличается от документирования других элементов. Рассмотрим пример, в котором иллюстрируется то, как можно удобно документировать их:

/// Набор возможных состояний объекта enum States < Disabled, ///< Указывает, что элемент недоступен для использования Undefined, ///< Указывает, что состояние элемента неопределенно Enabled, ///

То есть описание состояний указывается, собственно, после них самих при помощи краткого или подробного описания (в данном случае роли это не играет).

Результат будет иметь следующий вид:

Модули

Отдельное внимание следует обратить на создание модулей в документации, поскольку это один из наиболее удобных способов навигации по ней и действенный инструмент её структуризации. Пример хорошей группировки по модулям можете посмотреть здесь.

Далее мы кратко рассмотрим основные моменты и приведём пример, однако если вы хотите разобраться во всех тонкостях, то тогда придётся обратиться к соответствующему разделу документации.

Создание модуля

Для объявления модуля рекомендуется использовать команду \defgroup, которую необходимо заключить в документирующий блок:

\defgroup (заголовок модуля) 

Идентификатор модуля представляет собой уникальное слово, написанное на латинице, который впоследствии будет использован для обращения к данному модулю; заголовок модуля – это произвольное слово или предложение (желательно краткое) которое будет отображаться в документации.

Обратите внимание на то, что при описании модуля можно дополнить его кратким и подробным описанием, что позволяет раскрыть назначение того или иного модуля, например:

/*! \defgroup maze_generation Генерация лабиринтов \brief Данный модуль, предназначен для генерации лабиринтов. На данный момент он поддерживает следующие алгоритмы генерации лабиринтов: Eller's algorithm, randomized Kruskal's algorithm, cellular automaton algorithm, randomized Prim's algorithm. */ 
Размещение документируемого элемента в модуле

Для того, чтобы отнести тот или иной документируемый элемент в модуль, существуют два подхода.

Первый подход – это использование команды \ingroup:

\ingroup (заголовок модуля) 

Его недостатком является то, что данную команду надо добавлять в документирующие блоки каждого элемента исходного кода, поскольку их в рамках одного модуля может быть достаточно много.

Поэтому возникает необходимость в другом подходе, и второй подход состоит в использовании команд начала и конца группы: @ и @>. Следует отметить, что они используются наряду с командами \defgroup, \addtogroup и \weakgroup.

Пример использования приведён ниже:

/*! \defgroup (заголовок модуля) @ < */ документируемые_элементы /*! @>*/ 

Смысл примера должен быть понятен: мы объявляем модуль, а затем добавляем к ней определенные документируемые элементы, которые обрамляются при помощи символов начала и конца модуля.

Однако, модуль должен определяться один раз, причём это объявление будет только в одном файле, а часто бывает так, что элементы одного модуля разнесены по разным файлым и потому возникает необходимость использования команды \addtogroup, которая не переопределяет группу, а добавляет к ней тот или иной элемент:

/*! \addtogroup [(заголовок модуля)] @ < */ документируемые_элементы /*! @>*/ 

Название модуля указывать необязательно. Дело в том, что данная команда может быть использована как аналог команды \defgroup, и если соответствующий модуль не был определена, то она будет создана с соответствующим названием и идентификатором.

Наконец, команда \weakgroup аналогична команде \addtogroup, отличие заключается в том, что она просто имеет меньший приоритет по сравнению с ней в случае если возникают конфликты, связанные с назначение одного и того же элемента к разным модулям.

Создание подмодуля

Для создания подмодуля достаточно при его определении отнести его к тому или иному подмодулю, подобно любому другому документируемому элементу.

Пример приведён ниже:

/*! \defgroup main_module Главный модуль */ /*! \defgroup second_module Вложенный модуль \ingroup main_module */ 
Пример создания нескольких модулей

Далее представлен подробный пример создания модуля:
Файл generate_maze.h

/*! \defgroup generate_mazes Генерация лабиринтов \ingroup maze \brief Данный модуль, предназначен для генерации лабиринтов. На данный момент он поддерживает следующие алгоритмы генерации лабиринтов: Eller's algorithm, randomized Kruskal's algorithm, cellular automaton algorithm, randomized Prim's algorithm. */ ///@ < /*! \brief Функция генерации лабиринта на основе алгоритма Эллера \param width, height количество клеток в высоту и ширину в лабиринте \returns Лабиринт, представляющий собой экземпляр класса Maze с заданной шириной и высотой */ Maze generateEller(int width, int height); /*! \brief Функция генерации лабиринта на основе вероятностного алгоритма Крускала \param width, height количество клеток в высоту и ширину в лабиринте \returns Лабиринт, представляющий собой экземпляр класса Maze с заданной шириной и высотой */ Maze generateKruskal(int width, int height); /*! \brief Функция генерации лабиринта на основе вероятностного алгоритма Прима \param width, height количество клеток в высоту и ширину в лабиринте \returns Лабиринт, представляющий собой экземпляр класса Maze с заданной шириной и высотой */ Maze generatePrim(int width, int height); /*! \brief Функция генерации лабиринта на основе клеточных автоматов \param width, height количество клеток в высоту и ширину в лабиринте \returns Лабиринт, представляющий собой экземпляр класса Maze с заданной шириной и высотой */ Maze generateCellular(int width, int height); ///@>

Файл maze.h

/*! \defgroup maze Лабиринт \brief Основной модуль, содержащей в себе описания лабиринтов и содержащий другие модули для работы с ними */ ///@< class Maze < /* описание класса */ >; ///@> 

Обратите внимание на то, что вид документирующих блоков несколько изменился по сравнению с приведёнными ранее примерами, но как мы говорили ранее, принципиального значения это не играет и выбирайте тот вариант, который вам ближе.

В результате мы получим следующую документацию:

Оформления текста документации

Теперь, после того, как мы в общих чертах разобрались с тем как документировать основные элементы кода, рассмотрим то, как можно сделать документацию более наглядной, выразительной и полной.

Код внутри документации

Зачастую внутри пояснения к документации необходимо для примера добавить какой-то код, например для иллюстрации работы функции.

Команды \code и \endcode

Один из наиболее простых и универсальных способов сделать это – команды \code и \endcode, которые применяются следующим образом:

\code [ >] . \endcode 

Используемый язык определяется автоматически в зависимости от расширения файла, в котором располагается документирующий блок, однако в случае, если такое поведение не соответствует ожиданиям расширение можно указать явно.

Рассмотрим пример использования:

/*! \brief Алгоритм Евклида \param a,b Два числа, чей наибольший делитель мы хотим найти Данная функция реализует алгоритм Евклида, при помощи которого находится наибольшее общее кратное у двух чисел. Код функции выглядит следующим образом: \code int gcd(int a, int b) < int r; while (b) < r = a % b; a = b; b = r; >return r; > \endcode */ int gcd(int a, int b); 

Результат будет иметь следующий вид:

Примеры кода

Иногда удобнее приводить примеры использования кода хранить в отдельных файлах. Для этого эти файлы необходимо разместить в отдельной директории и прописать к ней путь в настройках:

EXAMPLE_PATH = путь_к_директории 

Рассмотрим, некоторые способы того, как примеры кода могут быть использованы в документации.

Команда \example
Данная команда показывает, что документирующий блок относится к примеру кода.

\example

Текст исходного кода будет добавлен в раздел «примеры», а исходный код примера будет проверен на наличие документированных элементов, и если таковые будут найдены, то к ним в описание будет добавлена ссылка на пример.

Файл gcd.h

/*! \brief Алгоритм Евклида \param a,b Два числа, чей наибольший делитель мы хотим найти Данная функция реализует алгоритм Евклида, при помощи которого находится наибольшее общее кратное у двух чисел. */ int gcd(int a, int b); /*! \example main.cpp Пример того, как использовать функцию */ 

Файл examples/main.cpp
В данном примере, значение EXAMPLE_PATH = examples

void main()

Команда \include
Для того, чтобы добавить в описание к документируемому элементу код примера используется команда \include, общий формат которой имеет следующий вид:

\include

Она полностью копирует содержимое файла и вставляет его в документацию как блок кода (аналогично оформлению кода в блок начинающийся командой \code и заканчивающийся командой \endcode).

Команда \snippet
Команда \snippet аналогична предыдущей команде, однако она позволяет вставлять не весь файл, а его определенный фрагмент. Неудивительно, что её формат несколько другой:

\snippet ( имя_фрагмента ) 

Для выделения определенного фрагмента кода необходимо в начале и в конце его разместить документирующий блок с указанием имени фрагмента:

/// [ имя_фрагмента ] . /// [ имя_фрагмента ] 
Автоматическое внедрение кода документируемого объекта

Наконец, Doxygen поддерживает возможность автоматической вставки тела функций, методов, классов, структур и т.п., в их подробное описание. Для этого используется следующая опция:

INLINE_SOURCES = YES 
Формулы с использованием LaTeX

Doxygen позволяет использовать TeX формулы прямо в документации, это очень удобно и результат получается весьма достойным. Однако стоит отметить, что при этом имеются ограничения: на данный момент формулы могут быть вставлены только в HTML и LaTeX документацию, но этого, как правило, вполне достаточно.

На данный момент существует два подхода к отображению формул:

    Отображение формул при помощи MathJax, для этого необходимо в файле настроек установить соответствующую опцию:

USE_MATHJAX = YES 
Способы добавление формул в документацию

Существуют три способа добавления формул в документацию. Последовательно рассмотрим каждый из них с примерами из документации:

    Использование строчных формул, которые обрамляются в начале и в конце при помощи команды "\f$". Пример представлен ниже:

 расстояние между \f$(x_1,y_1)\f$ и \f$(x_2,y_2)\f$ равно \f$\sqrt\f$. 

Результатом будет строка следующего вида: расстояние между и равно

 \f[ |I_2|=\left| \int_^T \psi(t) \left\< u(a,t)- \int_<\gamma(t)>^a \frac \int_^\theta c(\xi)u_t(\xi,t)\,d\xi \right\> dt \right| \f] 

Результатом будет строка следующего вида:

 \f< g &=& \frac \\ &=& \frac<(6.673 \times 10^<-11>\,\mbox^3\,\mbox^\, \mbox^)(5.9736 \times 10^\,\mbox)><(6371.01\,\mbox)^2> \\ &=& 9.82066032\,\mbox^2 \f> 

В итоге мы получим следующий результат (заметим, что окружение eqnarray* – это ненумерованное окружение для размещения нескольких формул):

Пример внедрения формул в документацию

Рассмотрим конкретный пример документации с использованием формул LaTeX:

/*! \brief Вычисление факториала числа \f$ n \f$ \param n - число, чей факториал необходимо вычислить \return \f$ n! \f$ Данная функция вычисляет значение факториала числа \f$ n \f$, определяемое по формуле: \f[ n! = \prod_^n i \f] */ int factorial(int n); 

Результат представлен ниже:

Кратко о Markdown

Markdown – это облегчённый язык разметки (почитать о нём можно, например, здесь, а также в специальном разделе в документации). Начиная с версии 1.8.0. Doxygen обеспечивает его пока ограниченную поддержку и он служит одним из способов оформить документацию (альтернативой могут быть, например, команды для оформления документации или HTML вставки, которые, впрочем, не универсальны).

Не хотелось бы сейчас расписывать подробности и принципы данного языка, поэтому ограничимся рассмотрением того, как данный язык позволяет «украсить» нашу документацию:

/*! Функция генерирующая псведослучайное число ------------------------------------------ Изначально планировалось реализовать в данной функции один из следующих методов генерации псевдослучайных чисел: - Линейный конгруэнтный метод; - Метод Фибоначчи; - Линейный регистр сдвига с обратной связью; - Вихрь Мерсенна. Но разработчики вспомнили про одну замечательную цитату: > Есть два способа создания дизайна программы. Один из них, это сделать его настолько простым, что в нем, очевидно, не будет недостатков. Другой способ — сделать его настолько запутанным, что в нем не будет очевидных недостатков. > — C.A. R. Hoare И выбрали первый путь. ![Описание функции](image.png) */ int getRandomNumber(); 

Результат представлен ниже:

Подводя итоги

На этой ироничной ноте я решил остановиться. Я прекрасно понимаю, что ещё многое не было описано и затронуто, но, надеюсь, что главные свои цели статья выполнила: познакомить с понятием генератора документации, познакомиться с системой Doxygen, объяснить основные принципы и подходы к документации, а также мельком затронуть вопросы, связанные с её оформление и детализацией, подготовив задел для вашей дальнейшей работы.

Спасибо за внимание!

Литература и ссылки для дальнейшего изучения

image

1. Основным источником, который был использован при написании статьи была официальная документация;
2. На большое количество вопросов, связанных с Doxygen, ответы были получены здесь (там есть и создатель Doxygen).
3. Продолжение цикла: оформление внешнего вида документации, построение графов и диаграмм в Doxygen.

Записки программиста

Генерируем документацию к проектам на C/C++ с Doxygen

12 февраля 2018

Программисты, как правило, не очень любят писать тесты. Но куда сильнее они не любят писать документацию. Тесты хотя бы представляют собой программы, а документация — это что? Просто текст. Вот пусть кто-нибудь другой его и пишет, технические писатели например! Впрочем, если речь идет не о пользовательской документации, а об описании классов и методов, предназначенном для других программистов, тут откосить вряд ли удастся. К счастью, есть Doxygen, способный существенно помочь со столь неприятной для многих работой.

Fun fact! Несмотря на то, что в рамках этого поста мы будем говорить о Doxygen исключительно в контексте языков C и C++, он также поддерживает языки Java, Python, PHP, и другие.

Установка Doxygen осуществляется как-то так:

# если у вас Ubuntu:
sudo apt-get install doxygen

# если у вас Arch Linux:
sudo pacman -S doxygen

Далее переходим в каталог с нашим проектом и создаем шаблонный файл Doxyfile командой:

В Doxyfile содержится краткое описание проекта, его версия и подобные вещи. Следующие значения стоит сразу изменить.

PROJECT_NAME = "Project Name"
PROJECT_NUMBER = 0.1

Краткое описание проекта:

PROJECT_BRIEF = "Yet another NoSQL DBMS"

Куда писать сгенеренные доки:

OUTPUT_DIRECTORY = doxygen

Отключаем LaTeX, так как HTML обычно достаточно:

GENERATE_LATEX = NO

Где искать файлы, из которых генерировать документацию — список файлов и директорий через пробел:

INPUT = src include

Включаем рекурсивный обход директорий:

RECURSIVE = YES

Всего в файле около 2500 строк с подробным описанием всех параметров. Однако помимо приведенных выше параметров вам вряд ли придется что-то менять.

Правила хорошего тона гласят, что для каждой процедуры или метода класса (независимо от того, публичные они или приватные) должно быть как минимум краткое описание того, что делает процедура или метод, описание каждого из аргументов, а также описание возвращаемого значения. Если метод делает еще что-то, например, как-то меняет состояние класса, это также обязательно нужно задокументировать.

Аналогично, краткое описание того, что они из себя представляют, должно быть у самих классов и структур. Не лишним будет рассказать, является ли класс копируемым или thread-safe. Краткое описание должно быть у каждого атрибута класса.

/**
* @brief Entry point
*
* Execution of the program
* starts here.
*
* @param argc Number of arguments
* @param argv List of arguments
*
* @return Program exit status
*/
int main ( int argc , char ** argv ) {

Doxygen генерирует документацию из комментариев, начинающихся с /** или /*! . Поддерживаются и другие метки, но, по моим наблюдениям, на практике они используются реже.

Для обозначения того, к чему именно относится часть комментария, используются специальные тэги. В терминологии Doxygen они зовутся командами. Команды начинаются со знака @ или \ . К наиболее частым командам я бы лично отнес следующие:

  • @brief — краткое описание метода или класса;
  • @param foo — описание аргумента foo процедуры или метода;
  • @return — описание возвращаемого значения;
  • @class Foo — описание конкретного класса Foo ;
  • @file fname — описание конкретного файла;
  • @mainpage Title — комментарий содержит текст для титульного листа документации;
  • @see Ref — ссылка на связанный класс или метод;
  • @throws Foo или @exception Foo — метод бросает исключение Foo ;
  • @warning — предупреждение. Очень ярко выделяется в документации, трудно не заметить;
  • @private — пометить класс или метод, как приватный. Удобно, когда не хочется палить в документации какие-то детали реализации;
  • @todo — что-то нужно доделать. Doxygen генерирует отдельную страницу со списком всех @todo ;
  • @deprecated — помечает класс или метод устаревшим. Как и с @todo , Doxygen генерирует отдельную страницу со списком всех устаревших классов и методов;

В действительности, Doxygen поддерживает куда больше команд. Например, он позволяет писать многостраничную ( @page ) документацию с разделами ( @section ) и подразделами ( @subsection ), указывать версии методов и классов ( @version ), и не только. Ознакомиться с полным списком команд можно здесь.

Fun fact! Doxygen понимает Markdown в комментариях. Краткую шпаргалку по Markdown вы найдете в заметке про создание статического блога на Pelican.

Для генерации и просмотра документации просто говорим:

doxygen
firefox doxygen / html / index.html

Если вас интересуют конкретные примеры, рекомендую посмотреть документацию по libevent, wxWidgets или Assimp. Любой проект куда проще поддерживать, если у него есть такая же классная документация.

Дополнение: Вас также может заинтересовать пост Построение UML-диаграмм с помощью PlantUML. В Doxygen имеется поддержка PlantUML.

Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *