Перейти к содержимому

Генерация UML диаграмм из кода

Генерация UML диаграмм при помощи clang-uml и PlantUML. Осуществляется в 3 этапа:

  1. Генерации базы данных компиляции compile_commands.json
  2. Генерация UML-диаграммы в формате разметки PlantUML
  3. Конвертация разметки PlantUML в выбранный формат

Генерация compile_commands.json зависит от системы сборки. Ниже перечислены способы для некоторых распространённых систем сборки:

Начиная с версии 2.8.5, CMake поддерживает опцию CMAKE_EXPORT_COMPILE_COMMANDS:

Окно терминала
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

Команда выше создаст файл compile_commands.json в директории сборки.

Файл автоматически создаётся в директории сборки.

Начиная с версии 1.2, можно передать аргументы командной строки -t compdb:

Окно терминала
ninja -t compdb > compile_commands.json

Прочие (специализированные) системы сборки

Заголовок раздела «Прочие (специализированные) системы сборки»

Некоторые системы сборки (напр. GNU Autotools) не поддерживают генерацию compile_commands.json. В этом случае базу данных компиляции можно сгенерировать при помощи внешних инструментов.

Установите пакет bear:

Окно терминала
sudo pacman -S bear
Статус сборки пакетов Статус сборки пакетов

Предположим, проект использует make, команда для сборки:

Окно терминала
make -j4

Тогда для генерации compile_commands.json при помощи bear нужно вызвать утилиту следующим образом:

Окно терминала
bear -- make -j4

Для генерации PlantUML-диаграммы используется утилита clang-uml.

Установите пакет clang-umlAUR:

Окно терминала
paru -S clang-uml
Статус сборки пакетов Статус сборки пакетов

Необходимо создать конфигурационный файл .clang-uml в той директории, из которой утилита будет запускаться. Базовая конфигурация может выглядеть следующим образом:

compilation_database_dir: <build-dir>
output_directory: diagrams
diagrams:
config_class:
type: class

<build-dir> необходимо заменить на путь до директории, в которой находится файл compile_commands.json.

Например, при использовании Meson:

  • Директорияproject/
    • Директорияbuilddir/ # Директория сборки Meson
      • compile_commands.json
    • .clang-uml
    • main.cpp
    • meson.build

в .clang-uml следует указать:

compilation_database_dir: builddir

Более подробную информацию о конфигурации см. в документации clang-uml.

Запустите clang-uml:

Окно терминала
clang-uml

В соответствии с конфигурацией, в директории <output_directory> будет сгенерирован .pump-файл. Для типовой конфигурации выше будет сгенерирован файл diagrams/config_class.puml.

Для конвертации .puml-файла можно использовать CLI-интерфейс PlantUML.

Установите пакеты graphviz и plantuml:

Окно терминала
sudo pacman -S graphviz plantuml
Статус сборки (graphviz) Статус сборки (graphviz)
Статус сборки (plantuml) Статус сборки (plantuml)

Запустите plantuml, указав путь до .puml-файла:

Окно терминала
plantuml ./diagrams/config_class.puml

Диаграмма будет конвертирована в diagrams/config_class.png.

Выходной формат можно изменить при помощи флагов

ФлагФормат
-tpngPNG
-tsvgSVG
-tpdfPDF

См. полный список форматов в документации PlantUML.

Ниже представлен простой пример проекта и генерации UML-диаграмм для него.

  • Директорияproject
    • bar.cpp
    • bar.hpp
    • foo.cpp
    • foo.hpp
    • main.cpp
    • Makefile
#include "bar.hpp"
Bar::Bar(Foo *foo) {
m_Foo = foo;
}
void Bar::printUnderlyingFooValue() {
if (m_Foo != nullptr) {
m_Foo->printValue();
}
}

Шаги для генерации UML-диаграммы:

  1. Сгенерировать compile_commands.json:

    Окно терминала
    bear -- make
  2. Создать конфигурационный файл .clang-uml:

    .clang-uml
    diagrams:
    config_class:
    type: class
  3. Сгенерировать диаграмму в формате PlantUML:

    Окно терминала
    clang-uml
  4. Конвертировать .puml-файл в изображение:

    Окно терминала
    plantuml -tsvg ./config_class.puml
UML-диаграмма из примера
Сгенерированная UML-диаграмма