Генерация UML диаграмм из кода
Генерация UML диаграмм при помощи
clang-uml
и
PlantUML. Осуществляется в 3 этапа:
- Генерации базы данных компиляции
compile_commands.json
- Генерация UML-диаграммы в формате разметки PlantUML
- Конвертация разметки PlantUML в выбранный формат
compile_commands.json
Заголовок раздела «compile_commands.json»Генерация 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
Заголовок раздела «Генерация диаграммы в формате PlantUML»Для генерации PlantUML-диаграммы используется утилита
clang-uml
.
Установите пакет clang-uml
AUR:
paru -S clang-uml
yay -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
.
Конвертация PlantUML в изображение
Заголовок раздела «Конвертация PlantUML в изображение»Для конвертации .puml
-файла можно использовать CLI-интерфейс PlantUML.
Установите пакеты graphviz
и plantuml
:
sudo pacman -S graphviz plantuml
Запустите plantuml
, указав путь до .puml
-файла:
plantuml ./diagrams/config_class.puml
Диаграмма будет конвертирована в diagrams/config_class.png
.
Выходной формат можно изменить при помощи флагов
Флаг | Формат |
---|---|
-tpng | PNG |
-tsvg | SVG |
-tpdf |
См. полный список форматов в документации 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(); }}
#ifndef BAR_HPP#define BAR_HPP
#include "foo.hpp"
class Bar { public: Bar(Foo *foo); void printUnderlyingFooValue();
private: Foo *m_Foo;};
#endif /* BAR_HPP */
#include <iostream>
#include "foo.hpp"
Foo::Foo(int v) { m_Value = v;}
void Foo::printValue() { std::cout << "Value is " << m_Value << std::endl;}
#ifndef FOO_HPP#define FOO_HPP
class Foo { public: Foo(int v); void printValue();
private: int m_Value;};
#endif /* FOO_HPP */
#include "bar.hpp"#include "foo.hpp"
int main() { Foo *foo = new Foo(69); Bar *bar = new Bar(foo);
bar->printUnderlyingFooValue();
return 0;}
# При копировании файла замените пробелы перед командами на табуляцию.
build: bar.o foo.o main.o g++ -o my-binary bar.o foo.o main.o
bar.o: bar.cpp bar.hpp g++ -c bar.cpp
foo.o: foo.cpp foo.hpp g++ -c foo.cpp
main.o: main.cpp g++ -c main.cpp
clean: rm -rf my-binary *.o
Шаги для генерации UML-диаграммы:
-
Сгенерировать
compile_commands.json
:Окно терминала bear -- make -
Создать конфигурационный файл
.clang-uml
:.clang-uml diagrams:config_class:type: class -
Сгенерировать диаграмму в формате PlantUML:
Окно терминала clang-uml -
Конвертировать
.puml
-файл в изображение:Окно терминала plantuml -tsvg ./config_class.puml