Генерация 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-umlAUR:
paru -S clang-umlyay -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