Обновление

This commit is contained in:
Andrei Astafev 2021-12-24 16:02:12 +03:00
parent a2cca2dd8c
commit 8c3a99eff9
11 changed files with 268 additions and 208 deletions

View File

@ -22,20 +22,25 @@ include::{l10ndir}/{lang}.adoc[]
|GCC | Компилятор C/C{plus}{plus}
|LLVM | Компилятор C/C{plus}{plus} и средства статического анализа
|GDB | Отладчик
|gcov | Анализатор покрытия кода
|lcov | Генератор отчётов для gcov
|Qt Creator | Среда разработки
|uncrustify | Форматирование исходных текстов на языке C/C{plus}{plus}
|git | Система контроля версий
|pre-commit | Управление хуками git
|CMake | Система управления проектом
|cmake-format | Форматирование исходных текстов для CMake
|Doxygen | Автоматическая генерация документации
|===
Установка:
При работе в совместимой с Debian операционной системе (Ubuntu, Astra Linux)
требуемые программы можно установить командами:
[source,sh]
----
sudo apt-get install build-essential clang clang-tidy gdb qtcreator qt5-default
sudo apt-get install cmake cmake-format doxygen git uncrustify
sudo apt-get install build-essential gdb clang clang-tidy clang-tools clazy qtcreator
sudo apt-get install qt5-default qttools5-dev qtbase5-private-dev qttools5-dev-tools
sudo apt-get install cmake cmake-format doxygen lcov git uncrustify
----
Для дальней работы потребуется установка пакетов `myx-dev`, в котором
@ -58,6 +63,11 @@ sudo dpkg -i myx-cmake*deb myx-dev*deb
sudo apt-get -f install
----
Действия, приведённые в данном руководстве, необходимо выполнять
в собственном репозитории. Для каждого раздела из этого документа созданы
https://git.246060.ru/f1x1t?sort=oldest&q=myx-cmake[эталонные репозитории],
с которыми можно сравнивать свой проект.
== Структура каталогов проекта
@ -100,12 +110,12 @@ sudo apt-get -f install
|`_build` | Результаты компиляции
|`_build/debug` | Результаты компиляции в режиме отладки
|`_build/debug/bin` | Исполняемые файлы
|`_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc`
|`_build/debug/etc` | Символическая ссылка на каталог `files/etc`
|`_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки
|`_build/debug/lib` | Статические и динамические библиотеки
|`_build/debug/log` | Символическая ссылка на каталог `cmex/files/log`
|`_build/debug/share` | Символическая ссылка на каталог `cmex/files/share`
|`_build/debug/var` | Символическая ссылка на каталог `cmex/files/var`
|`_build/debug/log` | Символическая ссылка на каталог `files/log`
|`_build/debug/share` | Символическая ссылка на каталог `files/share`
|`_build/debug/var` | Символическая ссылка на каталог `files/var`
|`_build/release` | Результаты компиляции в режиме выпуска (иерархия аналогична `debug`)
|`.git` | Системные файлы репозитория Git
|`cmake` | Файлы с дополнительными функциями для CMake
@ -128,32 +138,50 @@ sudo apt-get -f install
проекта внутрь иерархии каталогов с исходными текстами приводит к
засорению формируемыми на этапе сборки файлами, которые затрудняют
разработку, поиск в оригинальных файлах и мешают ориентироваться в
проекте. При работе с несколькими типами сборки, например, отладка и
выпуск, появляется необходимость корректного полного удаления
результатов предыдущего тип сборки.
проекте. Компиляция проекта в отдельном каталоге обеспечивает возможность
одновременной работы с несколькими типами сборки, например, отладка и выпуск.
[[qtcreator]]
== Qt Creator
Настройка программы Qt Creator для работы с описываемыми проектами
приведена link:nastroika-qt-creator.html[здесь].
Некоторые описываемые ниже проекты требуют указания ключей для CMake.
Это можно сделать в командной строке, добавив к ключу флаг `-D`.
Например, чтобы активировать ключ `MYX_CMAKE_CODE_COVERAGE`, нужно к
списку параметров командной строки добавить `-DMYX_CMAKE_CODE_COVERAGE=ON`.
Также его можно включить в Qt Creator в режиме *Проекты*.
[.text-center]
.Активация ключа `MYX_CMAKE_CODE_COVERAGE` в Qt Creator
image::cmake-project/qtcreator-cmake-option.png[qtcmoption,pdfwidth=90%,scaledwidth=90%,align="center"]
{empty} +
[[base-project]]
== Базовый проект
Проект, в котором выполнены приведённые в данном разделе действия,
можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-base[здесь]
можно посмотреть https://git.246060.ru/f1x1t/myx-cmake-example-base[здесь]
или сделать его копию командой:
[source,sh]
----
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-base
git clone --recursive https://git.246060.ru/f1x1t/myx-cmake-example-base
----
=== Инициализация проекта
Проект создаётся командой `myx-dev-git-init`. В качестве параметра можно
указать git-сервер, на котором планируется сохранять проект, и имя каталога
для проекта. Например:
Проект создаётся командой `myx-dev-project`. Обязательно должен быть указан
параметр `-i` для инициализации проекта, также можно указать git-сервер,
с которого будут загружены типовые файлы, и имя каталога для проекта.
Например:
[source,sh]
----
myx-dev-git-init -s git.246060.ru myx-cmake-example-base
myx-dev-project -i -s git.246060.ru myx-cmake-example-base
----
Во время инициализации проекта создаются некоторые типовые каталоги:
@ -170,27 +198,18 @@ mkdir -p files/{etc,log,share,var}
touch files/{etc,log,share,var}/.gitkeep
----
а также автоматически создаётся типовой минимальный файл `CMakeLists.txt`,
загружаются файл для форматирования исходных текстов
на языке C++ `.uncrustify.cfg`, форматирования файлов CMake `.cmake-format.py`,
типовой файл исключений для Git `.gitignore`, файл `.gitlab-ci.yml` для правил
автоматической сборки проекта на сервере GitLab, файл `.clang-tidy` с правилами
для анализатора исходных текстов `.clang-tidy` и файлы сценариев для выполнения
автоматических действий в репозитории, которые устанавливаются в каталог `.git/hooks`.
Автоматически создаётся типовой минимальный файл `CMakeLists.txt`,
загружаются файл для форматирования исходных текстов автоматической
сборки проекта на сервере GitLab, файл `.clang-tidy` с правилами
для анализатора исходных текстов `.clang-tidy` и файлы сценариев
для выполнения автоматических действий в репозитории, которые
устанавливаются в каталог `.git/hooks`.
Отправить изменения в проекте на сервер и сделать ветку `master` основной
(можно пропустить):
[source,sh]
----
cd myx-cmake-example-base
git remote add origin АДРЕС_РЕПОЗИТОРИЯ_НА_СЕРВЕРЕ
git push -u origin master
----
=== Базовые инструкции в CMake
В корневом каталоге проекта нужно создать файл `CMakeLists.txt`:
В корневом каталоге проекта после выполнения команды `myx-dev-project`
будет создан файл `CMakeLists.txt`:
[source,cmake]
----
@ -208,8 +227,8 @@ project(myx-cmake-example-base VERSION 0.2.0 LANGUAGES C CXX)
https://semver.org/lang/ru/[семантического версионирования].
[[project-required-variables]]
Для подключения функций для CMake из библиотеки MyxCMake, нужно добавить
в файл `CMakeLists.txt` строки, содержащие обязательные переменные:
Для подключения функций для CMake из библиотеки MyxCMake, нужно отредактировать
в файле `CMakeLists.txt` строки, содержащие обязательные переменные:
[source,cmake]
----
@ -228,7 +247,7 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
# Краткое описание проекта
set(MYX_CMAKE_DESCRIPTION "Пример проекта: начало" CACHE STRING "")
find_package(MyxCMake 0.1.8 REQUIRED)
find_package(MyxCMake 0.4.1 REQUIRED)
----
Значения обязательных переменных, используемых библиотекой MyxCMake
@ -241,14 +260,24 @@ find_package(MyxCMake 0.1.8 REQUIRED)
git commit -m "Подключение библиотеки MyxCMake" CMakeLists.txt
----
Чтобы проверить корректность подключения MyxCMake, можно выполнить команду:
Чтобы проверить корректность подключения MyxCMake, можно выполнить команду
(пути обязательно без пробелов!):
[source,sh]
----
(mkdir -p _build && cd _build && cmake .. && make && echo OK)
(cmake -B_build -H. && cmake --build _build && echo OK)
----
Если последней строкой вывода будет `OK`, то настройка завершена верно.
Если используется версия CMake новее `3.15`, можно использовать официально
задокументированный набор аргументов для каталогов сборки и корня проекта:
[source,sh]
----
(cmake -B _build -S . && cmake --build _build && echo OK)
----
Если последней строкой вывода будет `OK`, то CMake успешно проверил
окружение для сборки
== Проверка программного окружения
@ -277,8 +306,8 @@ git commit -m "Подключение библиотеки MyxCMake" CMakeLists.
----
# Поиск библиотек с помощью pkgconfig
find_package(PkgConfig REQUIRED)
pkg_check_modules(GSL REQUIRED gsl)
pkg_check_modules(FFTW3 REQUIRED fftw3 >= 3.3.2)
pkg_check_modules(GSL gsl REQUIRED)
pkg_check_modules(FFTW3 fftw3>=3.3.2 REQUIRED)
pkg_check_modules(UDEV udev)
----
@ -294,7 +323,7 @@ sudo apt-get install pkg-config libgsl-dev libfftw3-dev
Если системная библиотека поставляется без файла описания для `pkg-config`
или необходимо произвести более сложный поиск, например, включающий поиск
исполняемого файла, то может быть написан специальный модуль для `CMake`,
исполняемого файла, то может быть написан специальный модуль для CMake,
который вызывается функцией `find_package`. Примеры вызова функции:
[source,cmake]
@ -317,7 +346,7 @@ sudo apt-get install libxml2-dev curl libcurl-dev libboost-all-dev
На этапе конфигурирования проекта можно генерировать файлы, в которые будут записаны
собранные значения параметров. Функция `myx_cmake_generate_private_config_header()`,
из библиотеки MyxCMake создаёт файл `${CMAKE_BINARY_DIR}/include/myx_cmake_private_config.hpp`,
из библиотеки MyxCMake создаёт файл `${CMAKE_BINARY_DIR}/include/myx_cmake_private_config_p.hpp`,
в который записывается информация о имени и версии проекта, дате и типе сборки.
[source,cmake]
@ -328,9 +357,9 @@ myx_cmake_generate_private_config_header()
== Автоматически генерируемый файл о состоянии проекта
Функция `myx_cmake_generate_git_info_header` библиотеки MyxCMake
Функция `myx_cmake_generate_git_info_header()` библиотеки MyxCMake
предоставляет возможность генерировать при каждой сборке проекта
файл `${CMAKE_BINARY_DIR}/include/myx_cmake_git_info.hpp`,
файл `${CMAKE_BINARY_DIR}/include/myx_cmake_git_info_p.hpp`,
в который записывается информация о теге, текущей ветки и последнем
коммите в ней.
@ -384,7 +413,7 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
# Краткое описание проекта
set(MYX_CMAKE_DESCRIPTION "Пример проекта: библиотека" CACHE STRING "")
find_package(MyxCMake REQUIRED)
find_package(MyxCMake 0.4.1 REQUIRED)
# Автоматически генерируемый заголовочный файл
myx_cmake_generate_private_config_header()
@ -512,7 +541,7 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
# Краткое описание проекта
set(MYX_CMAKE_DESCRIPTION "Пример проекта: программа" CACHE STRING "")
find_package(MyxCMake REQUIRED)
find_package(MyxCMake 0.4.1 REQUIRED)
# Boost
set(Boost_USE_STATIC_LIBS ON)
@ -557,8 +586,8 @@ install(TARGETS ${TRGT} COMPONENT main RUNTIME DESTINATION ${CMAKE_INSTALL_BINDI
[source,cpp]
----
#include <myx_cmake_git_info.hpp>
#include <myx_cmake_private_config.hpp>
#include <myx_cmake_git_info_p.hpp>
#include <myx_cmake_private_config_p.hpp>
#include <iostream>
#include <boost/range/counting_range.hpp>
@ -589,6 +618,7 @@ int main( int argc, char* argv[] )
----
[[base-app-ext-project]]
=== Подключение внешнего проекта
Проект, использующий для сборки внешний проект, реализован на основе проектов
@ -638,18 +668,18 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
# Краткое описание проекта
set(MYX_CMAKE_DESCRIPTION "Пример проекта: программа с поключенной библиотекой" CACHE STRING "")
find_package(MyxCMake REQUIRED)
find_package(MyxCMake 0.4.1 REQUIRED)
# Подключение внешних проектов
include(ExternalProject)
ExternalProject_Add(extlib <1>
ExternalProject_Add(extlib # <1>
EXCLUDE_FROM_ALL TRUE
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/myx-cmake-example-library <2>
INSTALL_DIR ${CMAKE_BINARY_DIR} <3>
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/myx-cmake-example-library # <2>
INSTALL_DIR ${CMAKE_BINARY_DIR} # <3>
DOWNLOAD_COMMAND ""
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libmyx-cmake-example-library.a
CMAKE_ARGS ${MYX_CMAKE_EXTERNAL_PROJECT_ARGS} -DBUILD_MYX_CMAKE_EXAMPLE_LIBRARY_SHARED=OFF <4>
CMAKE_ARGS ${MYX_CMAKE_EXTERNAL_PROJECT_ARGS} -DBUILD_MYX_CMAKE_EXAMPLE_LIBRARY_SHARED=OFF # <4>
)
# Исходные тексты программы
@ -720,12 +750,12 @@ int main( int argc, char* argv[] )
Пример консольного приложения на Qt5 с поддержкой локализации основан
на проекте <<base-app-project,базового приложения>>.
Исходные тексты содержат комментарии, объясняющие назначение используемых функций.
Проект можно посмотреть https://git.246060.ru/f1x1t/myx-cmake-example-app-qt5-con[здесь]
Проект можно посмотреть https://git.246060.ru/f1x1t/myx-cmake-example-qt5-console[здесь]
или сделать его копию командой:
[source,sh]
----
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-app-qt5-con
git clone --recursive https://git.246060.ru/f1x1t/myx-cmake-example-qt5-console
----
<<<
@ -758,11 +788,11 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
# Краткое описание проекта
set(MYX_CMAKE_DESCRIPTION "Пример проекта: консольная программа Qt5" CACHE STRING "")
find_package(MyxCMake REQUIRED)
find_package(MyxCMake 0.4.1 REQUIRED)
# Qt5
find_package(Qt5 COMPONENTS Core REQUIRED) <1>
find_package(Qt5Core COMPONENTS Private REQUIRED) <2>
find_package(Qt5 COMPONENTS Core REQUIRED) # <1>
find_package(Qt5Core COMPONENTS Private REQUIRED) # <2>
# Исходные тексты программы
add_subdirectory(src/myx-cmake-example-qt5-console)
@ -857,12 +887,15 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
# Краткое описание проекта
set(MYX_CMAKE_DESCRIPTION "Пример проекта: графическая программа Qt5" CACHE STRING "")
find_package(MyxCMake REQUIRED)
find_package(MyxCMake 0.4.1 REQUIRED)
# Qt5
find_package(Qt5Core COMPONENTS Private REQUIRED)
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
# Автоматически генерируемый заголовочный файл
myx_cmake_generate_private_config_header()
# Исходные тексты программы
add_subdirectory(src/myx-cmake-example-qt5-gui)
----
@ -911,9 +944,16 @@ qt5_wrap_ui(TRGT_ui_h ${TRGT_ui})
# Правило для автоматической генерации препроцессором moc
qt5_wrap_cpp(TRGT_moc_cpp ${TRGT_moc_hpp})
# Поиск строк для локализации в файлах, перечисленных в ${TRGT_cpp} ${TRGT_ui}
# Создание и обновление файлов переводов в каталоге ${CMAKE_SOURCE_DIR}/l10n
# Интеграция переводов в исполняемый файл для подключения классом QTranslator
myx_cmake_qt5_translation(TRGT_qrc_cpp
OUTPUT_DIR ${CMAKE_SOURCE_DIR}/l10n
BASE_NAME ${TRGT}
SOURCES ${TRGT_cpp} ${TRGT_ui}
LANGUAGES ru_RU)
# Правило для автоматической генерации препроцессором qrc
# (обязательно после вызова функции qt5_translation, если она есть,
# так как она добавляет свои файлы к списку ресурсов)
qt5_add_resources(TRTG_qrc_cpp ${TRGT_qrc})
# Функция для создания цели, результатом которой будет сборка приложения
@ -1028,15 +1068,24 @@ TestWindow::~TestWindow() = default;
[source,cpp]
----
#include "myx_cmake_private_config_p.hpp"
#include "test_window.hpp"
#include <QApplication>
#include <QIcon>
#include <QTranslator>
int main( int argc, char** argv )
{
QApplication app( argc, argv );
// Подключение переводов в зависимости от текущей локали
auto* translator = new QTranslator( QApplication::instance() );
if ( translator->load( QLocale(), MYX_CMAKE_PROJECT_NAME, QStringLiteral( "_" ), QStringLiteral( ":/qm" ) ) )
{
QApplication::installTranslator( translator );
}
// Установка иконки для программы
QApplication::setWindowIcon( QIcon( ":/icon/icon.png" ) );
@ -1047,24 +1096,47 @@ int main( int argc, char** argv )
}
----
Для работы с файлами переводов создаётся цель `l10n`, которую нужно вызывать
при появлении новых строк. После первого выполнения команды `make l10n` в корневом
каталоге проекта будет создан подкаталог `l10n`, в котором появится файл
с расширением `.ts`. Его можно открыть и отредактировать программой `linguist`,
входящей в состав пакета `qttools5-dev-tools`. При следующей сборке программы
переводы будут интегрированы в исполняемый файл. В примере показано, как экземпляр
класса `QTranslator` загружает файл переводов и подключает его для отображения
строк в программе.
== Дополнительные возможности
Библиотека MyxCMake содержит шаблонные функции для использования
в программных проектах. Цели для автоматического форматирования и статического
анализа исходных текстов создаются автоматически при вызове функции
`myx_cmake_common_target_properties` из библиотеки MyxCMake.
`myx_cmake_common_target_properties()` из библиотеки MyxCMake.
Такие функции как анализ покрытия, динамический анализ, сборка из
единого компилируемого файла можно подключить только после перечисления
подключаемых библиотек. Для решения этой задачи используется функция
`myx_cmake_common_target_properties_post_link()`, которую необходимо вызывать
после всех вызовов функции `target_link_libraries()`.
Пример проекта, демонстрирующего перечисленные ниже возможности можно посмотреть
https://git.246060.ru/f1x1t/myx-cmake-example-features[здесь]
или сделать его копию командой:
[source,sh]
----
git clone --recursive https://git.246060.ru/f1x1t/myx-cmake-example-features
----
=== Форматирование исходных текстов
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных текстов,
формирующих цель, дополнительные цели `${target}-format-sources-uncrustify`
для форматирования исходных текстов на языке C{plus}{plus} в соответствии с правилами,
перечисленными в файле `.uncrustify.cfg`, находящимся в корне проекта, а также
`${target}-format-sources-dos2unix` для преобразования переводов строк в
файлах к стандарту, принятому в Unix. Для проекта создаётся цель `myx-cmake-format-sources`,
которая объединяет все цели, выполняющие форматирование исходных текстов.
Функция `myx_cmake_common_target_properties()` создаёт для файлов, формирующих цель,
дополнительные цели `${target}-format-sources-uncrustify` для форматирования
исходных текстов на языке C{plus}{plus} в соответствии с правилами,
перечисленными в файле `.uncrustify.cfg`, находящимся в корне проекта,
а также `${target}-format-sources-dos2unix` для преобразования переводов
строк в файлах к стандарту, принятому в Unix. Для проекта создаётся цель
`myx-cmake-format-sources`, которая объединяет все цели, выполняющие
форматирование исходных текстов.
IMPORTANT: Настройка правил форматирования помогает другим разработчикам
придерживаться вашего стиля программирования и отправлять изменения в ваш
@ -1102,7 +1174,7 @@ https://www.viva64.com/ru/pvs-studio[PVS-Studio].
[[analyze-clazy]]
==== clazy
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных
Функция `myx_cmake_common_target_properties()` создаёт для файлов исходных
текстов, формирующих цель, дополнительную цель `${target}-analyze-clazy`
для проверки исходных текстов анализатором `clang`.
Для всего проекта создаётся цель `myx-cmake-analyze-clazy`, которая
@ -1119,7 +1191,7 @@ make myx-cmake-analyze-clazy
[[analyze-clang-check]]
==== Clang Static Analyzer
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных
Функция `myx_cmake_common_target_properties()` создаёт для файлов исходных
текстов, формирующих цель, дополнительную цель `${target}-analyze-clang-check`
для проверки исходных текстов анализатором `clang-check`.
Для всего проекта создаётся цель `myx-cmake-analyze-clang-check`, которая
@ -1137,7 +1209,7 @@ make myx-cmake-analyze-clang-check
[[analyze-clang-tidy]]
==== Clang Tidy
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных
Функция `myx_cmake_common_target_properties()` создаёт для файлов исходных
текстов, формирующих цель, дополнительную цель `${target}-analyze-clang-tidy`
для проверки исходных текстов анализатором `clang-tidy`.
Для всего проекта создаётся цель `myx-cmake-analyze-clang-tidy`, которая
@ -1155,7 +1227,7 @@ make myx-cmake-analyze-clang-tidy
[[analyze-pvs-studio]]
==== PVS-Studio
Функция `myx_cmake_common_target_properties` создаёт для всего проекта
Функция `myx_cmake_common_target_properties()` создаёт для всего проекта
цель `myx-cmake-analyze-clang-tidy` для проверки исходных текстов
анализатором `pvs-studio-analyzer`.
@ -1179,16 +1251,17 @@ IMPORTANT: Редактирование кода в автоматическом
==== clazy
Программа clazy может преобразовывать в программах, использующих Qt,
подключения сигналов и слотов старого типа, производить замену старых ключевых
слов, подставлять оптимизированные способы для инициализации строк,
исправлять циклы и передачу аргументов в функции для избежания лишних копирований.
подключения сигналов и слотов старого типа, производить замену старых
ключевых слов, подставлять оптимизированные способы для инициализации
строк, исправлять циклы и передачу аргументов в функции для избежания
лишних копирований.
Для включения автоматического исправления нужно в настройках сборки проекта
menu:Проекты[Настройки сборки] выбрать цель `myx-cmake-analyze-clazy`:
[.text-center]
.Выбор цели
image::cmake-fixes/clazy1.png[clazyfix1,pdfwidth=90%,scaledwidth=90%,align="center"]
image::cmake-project/clazy1.png[clazyfix1,pdfwidth=90%,scaledwidth=90%,align="center"]
{empty} +
@ -1197,22 +1270,12 @@ btn:[Применить изменения], а затем скомпилиро
[.text-center]
.Разрешение автозамены
image::cmake-fixes/clazy2.png[clazyfix2,pdfwidth=90%,scaledwidth=90%,align="center"]
image::cmake-project/clazy2.png[clazyfix2,pdfwidth=90%,scaledwidth=90%,align="center"]
{empty} +
Пример проекта, в котором показаны возможности `clazy`, можно посмотреть
https://git.246060.ru/f1x1t/cmlib-example-clazy-fix[здесь]. Содержание
изменений, произведённых автоматически, можно увидеть
https://git.246060.ru/f1x1t/cmlib-example-clazy-fix/commit/81ed1e72b14f17bac0a39ab41bc3ba0ba2bdcb8e?style=split[здесь].
Результат автоматической правки исходных текстов можно посмотреть с помощью git (`git diff`).
Можно сделать копию репозитория и выполнить правки в автоматическом режиме
самостоятельно:
[source,sh]
----
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-clazy-fix
----
==== Clang-Tidy
@ -1221,11 +1284,11 @@ git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-clazy-fix
использовать Clang-Tidy после clazy.
Для включения автоматического исправления нужно в настройках сборки проекта
menu:Проекты[Настройки сборки] выбрать цель `clang-tidy-check`:
menu:Проекты[Настройки сборки] выбрать цель `myx-cmake-analyze-clang-tidy`:
[.text-center]
.Выбор цели
image::cmake-fixes/clang-tidy1.png[clangtidyfix1,pdfwidth=90%,scaledwidth=90%,align="center"]
image::cmake-project/clang-tidy1.png[clangtidyfix1,pdfwidth=90%,scaledwidth=90%,align="center"]
{empty} +
@ -1234,10 +1297,11 @@ btn:[Применить изменения], а затем скомпилиро
[.text-center]
.Разрешение автозамены
image::cmake-fixes/clang-tidy2.png[clangtidyfix2,pdfwidth=90%,scaledwidth=90%,align="center"]
image::cmake-project/clang-tidy2.png[clangtidyfix2,pdfwidth=90%,scaledwidth=90%,align="center"]
{empty} +
Результат автоматической правки исходных текстов можно посмотреть с помощью git (`git diff`).
=== Динамический анализ программы
@ -1249,12 +1313,14 @@ image::cmake-fixes/clang-tidy2.png[clangtidyfix2,pdfwidth=90%,scaledwidth=90%,al
таких анализаторов находится https://github.com/google/sanitizers/wiki[здесь].
Для обеспечения возможности подключения динамического анализа к проекту
нужно выполнить функцию (обязательно после подключения всех библиотек):
нужно выполнить функцию `myx_cmake_common_target_properties_post_link()`
(обязательно после подключения всех библиотек):
[source,cmake]
----
# Подключение настроек для динамического анализа программы
add_sanitizers(${TRGT})
# Дополнительные функции для цели ${TRGT}.
# Вызов обязательно после всех функций target_link_libraries
myx_cmake_common_target_properties_post_link(${TRGT})
----
Подключение анализатора осуществляется включением опций при запуске
@ -1279,6 +1345,28 @@ CMake для генерации сборочных файлов. Некотор
преобразования типов с плавающей точкой, ведущих к переполнению результирующей переменной
|===
Для проверки возможности динамической отладки можно в перечне опций включить `SANITIZE_ADDRESS`,
нажать кнопку btn:[Применить изменения], а затем скомпилировать проект kbd:[Ctrl+B].
После запуска программы `myx-cmake-example-features` будет выведено сообщение об утечке памяти,
показывающее, что объект типа `QFile` не был удалён.
[source,text]
----
==322360==ERROR: LeakSanitizer: detected memory leaks
Indirect leak of 256 byte(s) in 1 object(s) allocated from:
#0 0x7fbe8558c947 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10f947)
#1 0x7fbe850efeb4 in QFile::QFile() (/usr/lib/x86_64-linux-gnu/libQt5Core.so.5+0x1bbeb4)
#2 0x7fbe84a1d0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Indirect leak of 16 byte(s) in 1 object(s) allocated from:
#0 0x7fbe8558c947 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10f947)
#1 0x56089352a542 in main ../../src/myx-cmake-example-features/main.cpp:41
#2 0x7fbe84a1d0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
SUMMARY: AddressSanitizer: 272 byte(s) leaked in 2 allocation(s).
----
=== Анализ покрытия кода
@ -1286,51 +1374,59 @@ CMake для генерации сборочных файлов. Некотор
для каждого оператора в программе используется программа
https://gcc.gnu.org/onlinedocs/gcc/Gcov.html[Gcov],
входящая в состав компилятора https://gcc.gnu.org[GCC].
Для генерирования отчётов в виде HTML-страниц используется
программа `lcov`.
Для обеспечения возможности подключения анализа покрытия кода к проекту
нужно выполнить функцию (обязательно после подключения всех библиотек):
нужно выполнить функцию `myx_cmake_common_target_properties_post_link()`
(обязательно после подключения всех библиотек):
[source,cmake]
----
# Подключение возможности использования утилиты Gcov
# для исследования покрытия кода
add_code_coverage(${TRGT})
# Дополнительные функции для цели ${TRGT}.
# Вызов обязательно после всех функций target_link_libraries
myx_cmake_common_target_properties_post_link(${TRGT})
----
Подключение осуществляется включением опции `ENABLE_CODE_COVERAGE`
Анализ покрытия кода работает только для файлов, скомпилированных GCC.
Во избежание ошибок его можно явно включить, используя при вызове CMake
флаги `-DCMAKE_C_COMPILER=gcc` и `-DCMAKE_CXX_COMPILER=g++`.
Подключение осуществляется включением опции `MYX_CMAKE_CODE_COVERAGE`
при запуске CMake для генерации сборочных файлов. В результате будут
созданы две дополнительные цели `coverage-${TRGT}` для сбора статистики
после работы программы и `coverage-report-${TRGT}` для её вывода
созданы две дополнительные цели `${TRGT}-coverage` для сбора статистики
после работы программы и `${TRGT}-coverage-report` для её вывода
в виде HTML-страниц.
Пример анализа покрытия кода на примере проекта `cmlib-example-app-features`:
Пример анализа покрытия кода для проекта `myx-cmake-example-features`:
[source,sh]
----
mkdir -p _build/debug
cd _build/debug
cmake ../.. -DENABLE_CODE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug
cmake -B_build/cov -H. -DMYX_CMAKE_CODE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug
cd _build/cov
make
bin/cmlib-example-app-features
make coverage-cmlib-example-app-features
make coverage-report-cmlib-example-app-features
bin/myx-cmake-example-features
make myx-cmake-example-features-coverage
make myx-cmake-example-features-coverage-report
----
После выполнения этих команд в каталоге `report-cmlib-example-app-features`
будет сформирован отчёт в виде HTML-страниц.
После выполнения этих команд в каталоге `myx-cmake-example-features-coverage-html`
будет сформирован отчёт в виде HTML-страниц, в котором будет показано,
что функция `int unused(int)` не вызывалась.
=== Профилирование кода
Библиотека CMLib предоставляет вариант сборки для профилирования кода,
Библиотека MyxCMake предоставляет вариант сборки для профилирования кода,
для которого можно сгенерировать сборочные файлы, присвоив переменной
`CMAKE_BUILD_TYPE` значение `Profile`:
[source,sh]
----
mkdir -p _build/profile
cmake -B_build/profile -H. -DCMAKE_BUILD_TYPE=Profile
cd _build/profile
cmake ../.. -DCMAKE_BUILD_TYPE=Profile
make
bin/myx-cmake-example-features
----
По окончании работы исполняемого файла будет сгенерирован файл
@ -1339,43 +1435,37 @@ cmake ../.. -DCMAKE_BUILD_TYPE=Profile
[source,sh]
----
./cmlib-example-app-features
gprof -b cmlib-example-app-features gmon.out > analysis-tree.txt
gprof -b -p cmlib-example-app-features gmon.out > analysis-flat.txt
gprof -b bin/myx-cmake-example-features gmon.out > profiling-tree.txt
gprof -b -p bin/myx-cmake-example-features gmon.out > profiling-flat.txt
----
Результаты профилирования будут записаны в файлы `profiling-tree.txt`
и `profiling-flat.txt`.
=== Ускорение компиляции
Для ускорения компиляции используется сторонний модуль
https://github.com/sakra/cotire[cotire], который автоматизирует
использование предварительно откомпилированных заголовков и
организует пакетный режим обработки исходных файлов в генератора.
использование предварительно откомпилированных заголовочных файлов и
организует пакетный режим обработки исходных файлов.
Аналогичные функции встроены в CMake, начиная с версии 3.16.
Для обеспечения возможностей, предоставляемых модулем cotire,
нужно выполнить функцию (обязательно после подключения всех библиотек):
нужно выполнить функцию `myx_cmake_common_target_properties_post_link()`
(обязательно после подключения всех библиотек):
[source,cmake]
----
# Подключение возможности включения пакетного режима обработки
# исходных файлов в генераторах для ускорения сборки
cotire(${TRGT})
# Дополнительные функции для цели ${TRGT}.
# Вызов обязательно после всех функций target_link_libraries
myx_cmake_common_target_properties_post_link(${TRGT})
----
В результате будут созданы цели с суффиксом `_unity`, при сборки
которых будут применяться приведённые выше методы ускорения.
Пример использования cotire для ускорения сборки
на примере проекта `cmlib-example-app-features`:
[source,sh]
----
mkdir -p _build/debug
cd _build/debug
cmake ../..
make all_unity
----
FIXME
=== Документирование кода
@ -1388,61 +1478,33 @@ make all_unity
sudo apt-get install doxygen
----
Пример комментария:
[source,c++]
----
/**
* @brief Базовый класс
*/
class Base {
public:
/**
* @brief Конструктор
*/
Base();
/**
* @brief Деструктор
*/
~Base();
/**
* @brief Вычисление квадратного корня
* @param value Входное значение
* @return Квадратный корень от value
*/
double sqrt(double value);
};
----
Поддержка автоматической генерации документации реализована
в функциях библиотеки CMLib `add_doxygen_target` и
`add_breathe_target`, которые необходимо вызвать в основном
файле `CMakeLists.txt` проекта.
Пример комментариев для исходных текстов можно посмотреть в проекте
`myx-cmake-example-features`. Поддержка автоматической генерации
документации реализована в функции библиотеки MyxCMake `myx_cmake_doc_doxygen()`,
которую необходимо вызвать в основном файле `CMakeLists.txt` проекта.
[source,cmake]
----
# Документация
add_doxygen_target(doc-doxygen LATEX YES HTML YES)
add_breathe_target(doc-breathe)
myx_cmake_doc_doxygen(LATEX YES HTML YES)
----
В результате будут добавлены цели `doc-doxygen` и `doc-breathe`,
которые можно использовать после конфигурирования проекта:
В результате будет добавлена цель `myx-cmake-doc-doxygen`,
которую можно использовать после конфигурирования проекта:
[source,cmake]
----
make doc-doxygen
make doc-breathe
make myx-cmake-doc-doxygen
----
Шаблоны для комментирования файлов, классов и функций
можно автоматически расставить в файлах исходных кодов
исполнением цели `doc-add-comments` при наличии установленной
программы `uncrustify`:
Шаблоны для комментирования файлов, классов и функций можно
автоматически расставить в файлах исходных кодов с помощью цели
`myx-cmake-doc-doxygen-append-comments`, которая доступна
при наличии установленной программы `uncrustify`:
[source,cmake]
----
make doc-add-comments
make myx-cmake-doc-doxygen-append-comments
----
== Удаление установленных файлов
@ -1452,18 +1514,21 @@ make doc-add-comments
[source,sh]
----
cd _build
make install
make uninstall
cmake -B_build -H. -DCMAKE_INSTALL_PREFIX=_output # <1>
cmake --build _build -t install # <2>
cmake --build _build -t uninstall # <3>
----
<1> Конфигурирование проекта (каталог сборки `_build`, каталог для установки `_output`)
<2> Компиляция проекта и установка в каталог `_output`
<3> Удаление файлов, установленных в каталог `_output`, а также пустых каталогов
== Архивирование проекта и создание пакетов
Стандартный модуль `CPack` предназначен для архивирования исходных
текстов проекта и создания пакетов для установки в целевую систему.
Необходимые переменные устанавливаются в начале файла `CMakeLists.txt`
<<project-required-variables,см. выше>>.
Переменные, необходимые для создания пакетов и архивов, устанавливаются
в начале файла `CMakeLists.txt` <<project-required-variables,см. выше>>.
Библиотека MyxCMake предоставляет возможность стандартного разбиения
на пакеты в соответствии с критериями, приведёнными в таблице.
@ -1479,46 +1544,41 @@ make uninstall
|===
Принадлежность устанавливаемого файла к компоненту определяется с помощью
параметра `COMPONENT` функции `install`. В компонент `main` необходимо
помещать файлы для установки на целевую систему (исполняемые файлы,
файлы настроек, файлы данных, разделяемые библиотеки), в компоненты `dev`
и `static` --- для установки на систему для разработки (заголовочные
параметра `COMPONENT` функции `install()`. В компоненте `main` необходимо
перечислить файлы для установки на целевую систему (исполняемые файлы,
файлы настроек, файлы данных, разделяемые библиотеки), в компонентах
`dev` и `static` --- для установки на систему для разработки (заголовочные
файлы, статические библиотеки). Пример включения устанавливаемых файлов
в компоненты можно посмотреть
https://git.246060.ru/f1x1t/myxlib/src/branch/master/src/myx/base/CMakeLists.txt#L46-L54[здесь].
https://git.246060.ru/f1x1t/myxlib/src/branch/v2/src/myx/core/CMakeLists.txt#L24-L26[здесь].
Имена компонентов обязательно должны быть в нижнем регистре.
По умолчанию цель для упаковки исходных текстов называется `package_source`,
цель для создания общего архива скомпилированного проекта --- `package`,
цель для создания пакетов в формате Debian --- `deb`.
Примера работы с архивированием можно сделать копию репозитория
библиотеки https://git.246060.ru/f1x1t/myxlib[MyXLib]:
Пример работы с архивированием на основе репозитория библиотеки
https://git.246060.ru/f1x1t/myxlib[MyXLib]:
[source,sh]
----
git clone --recursive https://git.246060.ru/f1x1t/myxlib
git clone --recursive https://git.246060.ru/f1x1t/myxlib -b v2
----
Дальнейшие шаги:
В корневом каталоге проекта нужно выполнить команды:
[source,shell]
----
cd myxlib # <1>
mkdir -p _build/debug # <2>
cd _build/debug # <3>
cmake ../.. -DMYXLIB_BUILD_LIBRARIES=ON -DMYXLIB_BUILD_EXAMPLES=ON # <4>
make -j4 # <5>
make doc-doxygen # <6>
make package # <7>
make package_source # <8>
make deb # <9>
cmake -В_build/release -H. -DMYXLIB_BUILD_LIBRARIES=ON -DMYXLIB_BUILD_EXAMPLES=ON -DCMAKE_INSTALL_PREFIX=_output # <1>
cmake --build _build/release -t install -- -j4 # <2>
cmake --build _build/release -t doc-doxygen # <3>
cmake --build _build/release -t package # <4>
cmake --build _build/release -t package_source # <5>
cmake --build _build/release -t deb # <6>
----
<1> Перейти в каталог проекта
<2> Создать каталог для сборки проекта
<3> Перейти в каталог для сборки проекта
<4> Создать конфигурацию для сборки проекта
<5> Скомпилировать проект
<6> Сгенерировать документацию
<7> Создать архив с результатами компиляции `myx_amd64_0.4.0.tar.xz`
<8> Создать архив с исходными текстами `myx-0.4.0.tar.xz`
<9> Создать пакеты в формате Debian
<1> Создание конфигурации для сборки проекта
<2> Компиляция проекта
<3> Генерирование документации
<4> Создание архива с результатами компиляции `myx_amd64_0.4.1.tar.xz`
<5> Создание архива с исходными текстами `myx-0.4.1.tar.xz`
<6> Создание пакетов в формате Debian

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB