Обновление
@ -22,20 +22,25 @@ include::{l10ndir}/{lang}.adoc[]
|
|||||||
|GCC | Компилятор C/C{plus}{plus}
|
|GCC | Компилятор C/C{plus}{plus}
|
||||||
|LLVM | Компилятор C/C{plus}{plus} и средства статического анализа
|
|LLVM | Компилятор C/C{plus}{plus} и средства статического анализа
|
||||||
|GDB | Отладчик
|
|GDB | Отладчик
|
||||||
|
|gcov | Анализатор покрытия кода
|
||||||
|
|lcov | Генератор отчётов для gcov
|
||||||
|Qt Creator | Среда разработки
|
|Qt Creator | Среда разработки
|
||||||
|uncrustify | Форматирование исходных текстов на языке C/C{plus}{plus}
|
|uncrustify | Форматирование исходных текстов на языке C/C{plus}{plus}
|
||||||
|git | Система контроля версий
|
|git | Система контроля версий
|
||||||
|
|pre-commit | Управление хуками git
|
||||||
|CMake | Система управления проектом
|
|CMake | Система управления проектом
|
||||||
|cmake-format | Форматирование исходных текстов для CMake
|
|cmake-format | Форматирование исходных текстов для CMake
|
||||||
|Doxygen | Автоматическая генерация документации
|
|Doxygen | Автоматическая генерация документации
|
||||||
|===
|
|===
|
||||||
|
|
||||||
Установка:
|
При работе в совместимой с Debian операционной системе (Ubuntu, Astra Linux)
|
||||||
|
требуемые программы можно установить командами:
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
sudo apt-get install build-essential clang clang-tidy gdb qtcreator qt5-default
|
sudo apt-get install build-essential gdb clang clang-tidy clang-tools clazy qtcreator
|
||||||
sudo apt-get install cmake cmake-format doxygen git uncrustify
|
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`, в котором
|
Для дальней работы потребуется установка пакетов `myx-dev`, в котором
|
||||||
@ -58,6 +63,11 @@ sudo dpkg -i myx-cmake*deb myx-dev*deb
|
|||||||
sudo apt-get -f install
|
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` | Результаты компиляции
|
||||||
|`_build/debug` | Результаты компиляции в режиме отладки
|
|`_build/debug` | Результаты компиляции в режиме отладки
|
||||||
|`_build/debug/bin` | Исполняемые файлы
|
|`_build/debug/bin` | Исполняемые файлы
|
||||||
|`_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc`
|
|`_build/debug/etc` | Символическая ссылка на каталог `files/etc`
|
||||||
|`_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки
|
|`_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки
|
||||||
|`_build/debug/lib` | Статические и динамические библиотеки
|
|`_build/debug/lib` | Статические и динамические библиотеки
|
||||||
|`_build/debug/log` | Символическая ссылка на каталог `cmex/files/log`
|
|`_build/debug/log` | Символическая ссылка на каталог `files/log`
|
||||||
|`_build/debug/share` | Символическая ссылка на каталог `cmex/files/share`
|
|`_build/debug/share` | Символическая ссылка на каталог `files/share`
|
||||||
|`_build/debug/var` | Символическая ссылка на каталог `cmex/files/var`
|
|`_build/debug/var` | Символическая ссылка на каталог `files/var`
|
||||||
|`_build/release` | Результаты компиляции в режиме выпуска (иерархия аналогична `debug`)
|
|`_build/release` | Результаты компиляции в режиме выпуска (иерархия аналогична `debug`)
|
||||||
|`.git` | Системные файлы репозитория Git
|
|`.git` | Системные файлы репозитория Git
|
||||||
|`cmake` | Файлы с дополнительными функциями для CMake
|
|`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]]
|
[[base-project]]
|
||||||
== Базовый проект
|
== Базовый проект
|
||||||
|
|
||||||
Проект, в котором выполнены приведённые в данном разделе действия,
|
Проект, в котором выполнены приведённые в данном разделе действия,
|
||||||
можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-base[здесь]
|
можно посмотреть https://git.246060.ru/f1x1t/myx-cmake-example-base[здесь]
|
||||||
или сделать его копию командой:
|
или сделать его копию командой:
|
||||||
|
|
||||||
[source,sh]
|
[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`. В качестве параметра можно
|
Проект создаётся командой `myx-dev-project`. Обязательно должен быть указан
|
||||||
указать git-сервер, на котором планируется сохранять проект, и имя каталога
|
параметр `-i` для инициализации проекта, также можно указать git-сервер,
|
||||||
для проекта. Например:
|
с которого будут загружены типовые файлы, и имя каталога для проекта.
|
||||||
|
Например:
|
||||||
|
|
||||||
[source,sh]
|
[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
|
touch files/{etc,log,share,var}/.gitkeep
|
||||||
----
|
----
|
||||||
|
|
||||||
а также автоматически создаётся типовой минимальный файл `CMakeLists.txt`,
|
Автоматически создаётся типовой минимальный файл `CMakeLists.txt`,
|
||||||
загружаются файл для форматирования исходных текстов
|
загружаются файл для форматирования исходных текстов автоматической
|
||||||
на языке C++ `.uncrustify.cfg`, форматирования файлов CMake `.cmake-format.py`,
|
сборки проекта на сервере GitLab, файл `.clang-tidy` с правилами
|
||||||
типовой файл исключений для Git `.gitignore`, файл `.gitlab-ci.yml` для правил
|
для анализатора исходных текстов `.clang-tidy` и файлы сценариев
|
||||||
автоматической сборки проекта на сервере GitLab, файл `.clang-tidy` с правилами
|
для выполнения автоматических действий в репозитории, которые
|
||||||
для анализатора исходных текстов `.clang-tidy` и файлы сценариев для выполнения
|
устанавливаются в каталог `.git/hooks`.
|
||||||
автоматических действий в репозитории, которые устанавливаются в каталог `.git/hooks`.
|
|
||||||
|
|
||||||
Отправить изменения в проекте на сервер и сделать ветку `master` основной
|
|
||||||
(можно пропустить):
|
|
||||||
|
|
||||||
[source,sh]
|
|
||||||
----
|
|
||||||
cd myx-cmake-example-base
|
|
||||||
git remote add origin АДРЕС_РЕПОЗИТОРИЯ_НА_СЕРВЕРЕ
|
|
||||||
git push -u origin master
|
|
||||||
----
|
|
||||||
|
|
||||||
=== Базовые инструкции в CMake
|
=== Базовые инструкции в CMake
|
||||||
|
|
||||||
В корневом каталоге проекта нужно создать файл `CMakeLists.txt`:
|
В корневом каталоге проекта после выполнения команды `myx-dev-project`
|
||||||
|
будет создан файл `CMakeLists.txt`:
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
@ -208,8 +227,8 @@ project(myx-cmake-example-base VERSION 0.2.0 LANGUAGES C CXX)
|
|||||||
https://semver.org/lang/ru/[семантического версионирования].
|
https://semver.org/lang/ru/[семантического версионирования].
|
||||||
|
|
||||||
[[project-required-variables]]
|
[[project-required-variables]]
|
||||||
Для подключения функций для CMake из библиотеки MyxCMake, нужно добавить
|
Для подключения функций для CMake из библиотеки MyxCMake, нужно отредактировать
|
||||||
в файл `CMakeLists.txt` строки, содержащие обязательные переменные:
|
в файле `CMakeLists.txt` строки, содержащие обязательные переменные:
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
@ -228,7 +247,7 @@ set(MYX_CMAKE_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "")
|
|||||||
# Краткое описание проекта
|
# Краткое описание проекта
|
||||||
set(MYX_CMAKE_DESCRIPTION "Пример проекта: начало" CACHE STRING "")
|
set(MYX_CMAKE_DESCRIPTION "Пример проекта: начало" CACHE STRING "")
|
||||||
|
|
||||||
find_package(MyxCMake 0.1.8 REQUIRED)
|
find_package(MyxCMake 0.4.1 REQUIRED)
|
||||||
----
|
----
|
||||||
|
|
||||||
Значения обязательных переменных, используемых библиотекой MyxCMake
|
Значения обязательных переменных, используемых библиотекой MyxCMake
|
||||||
@ -241,14 +260,24 @@ find_package(MyxCMake 0.1.8 REQUIRED)
|
|||||||
git commit -m "Подключение библиотеки MyxCMake" CMakeLists.txt
|
git commit -m "Подключение библиотеки MyxCMake" CMakeLists.txt
|
||||||
----
|
----
|
||||||
|
|
||||||
Чтобы проверить корректность подключения MyxCMake, можно выполнить команду:
|
Чтобы проверить корректность подключения MyxCMake, можно выполнить команду
|
||||||
|
(пути обязательно без пробелов!):
|
||||||
|
|
||||||
[source,sh]
|
[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
|
# Поиск библиотек с помощью pkgconfig
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_check_modules(GSL REQUIRED gsl)
|
pkg_check_modules(GSL gsl REQUIRED)
|
||||||
pkg_check_modules(FFTW3 REQUIRED fftw3 >= 3.3.2)
|
pkg_check_modules(FFTW3 fftw3>=3.3.2 REQUIRED)
|
||||||
pkg_check_modules(UDEV udev)
|
pkg_check_modules(UDEV udev)
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -294,7 +323,7 @@ sudo apt-get install pkg-config libgsl-dev libfftw3-dev
|
|||||||
|
|
||||||
Если системная библиотека поставляется без файла описания для `pkg-config`
|
Если системная библиотека поставляется без файла описания для `pkg-config`
|
||||||
или необходимо произвести более сложный поиск, например, включающий поиск
|
или необходимо произвести более сложный поиск, например, включающий поиск
|
||||||
исполняемого файла, то может быть написан специальный модуль для `CMake`,
|
исполняемого файла, то может быть написан специальный модуль для CMake,
|
||||||
который вызывается функцией `find_package`. Примеры вызова функции:
|
который вызывается функцией `find_package`. Примеры вызова функции:
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
@ -317,7 +346,7 @@ sudo apt-get install libxml2-dev curl libcurl-dev libboost-all-dev
|
|||||||
|
|
||||||
На этапе конфигурирования проекта можно генерировать файлы, в которые будут записаны
|
На этапе конфигурирования проекта можно генерировать файлы, в которые будут записаны
|
||||||
собранные значения параметров. Функция `myx_cmake_generate_private_config_header()`,
|
собранные значения параметров. Функция `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]
|
[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 "")
|
set(MYX_CMAKE_DESCRIPTION "Пример проекта: библиотека" CACHE STRING "")
|
||||||
|
|
||||||
find_package(MyxCMake REQUIRED)
|
find_package(MyxCMake 0.4.1 REQUIRED)
|
||||||
|
|
||||||
# Автоматически генерируемый заголовочный файл
|
# Автоматически генерируемый заголовочный файл
|
||||||
myx_cmake_generate_private_config_header()
|
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 "")
|
set(MYX_CMAKE_DESCRIPTION "Пример проекта: программа" CACHE STRING "")
|
||||||
|
|
||||||
find_package(MyxCMake REQUIRED)
|
find_package(MyxCMake 0.4.1 REQUIRED)
|
||||||
|
|
||||||
# Boost
|
# Boost
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
@ -557,8 +586,8 @@ install(TARGETS ${TRGT} COMPONENT main RUNTIME DESTINATION ${CMAKE_INSTALL_BINDI
|
|||||||
|
|
||||||
[source,cpp]
|
[source,cpp]
|
||||||
----
|
----
|
||||||
#include <myx_cmake_git_info.hpp>
|
#include <myx_cmake_git_info_p.hpp>
|
||||||
#include <myx_cmake_private_config.hpp>
|
#include <myx_cmake_private_config_p.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <boost/range/counting_range.hpp>
|
#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 "")
|
set(MYX_CMAKE_DESCRIPTION "Пример проекта: программа с поключенной библиотекой" CACHE STRING "")
|
||||||
|
|
||||||
find_package(MyxCMake REQUIRED)
|
find_package(MyxCMake 0.4.1 REQUIRED)
|
||||||
|
|
||||||
# Подключение внешних проектов
|
# Подключение внешних проектов
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
|
|
||||||
ExternalProject_Add(extlib <1>
|
ExternalProject_Add(extlib # <1>
|
||||||
EXCLUDE_FROM_ALL TRUE
|
EXCLUDE_FROM_ALL TRUE
|
||||||
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/myx-cmake-example-library <2>
|
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/myx-cmake-example-library # <2>
|
||||||
INSTALL_DIR ${CMAKE_BINARY_DIR} <3>
|
INSTALL_DIR ${CMAKE_BINARY_DIR} # <3>
|
||||||
DOWNLOAD_COMMAND ""
|
DOWNLOAD_COMMAND ""
|
||||||
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libmyx-cmake-example-library.a
|
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 с поддержкой локализации основан
|
Пример консольного приложения на Qt5 с поддержкой локализации основан
|
||||||
на проекте <<base-app-project,базового приложения>>.
|
на проекте <<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]
|
[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 "")
|
set(MYX_CMAKE_DESCRIPTION "Пример проекта: консольная программа Qt5" CACHE STRING "")
|
||||||
|
|
||||||
find_package(MyxCMake REQUIRED)
|
find_package(MyxCMake 0.4.1 REQUIRED)
|
||||||
|
|
||||||
# Qt5
|
# Qt5
|
||||||
find_package(Qt5 COMPONENTS Core REQUIRED) <1>
|
find_package(Qt5 COMPONENTS Core REQUIRED) # <1>
|
||||||
find_package(Qt5Core COMPONENTS Private REQUIRED) <2>
|
find_package(Qt5Core COMPONENTS Private REQUIRED) # <2>
|
||||||
|
|
||||||
# Исходные тексты программы
|
# Исходные тексты программы
|
||||||
add_subdirectory(src/myx-cmake-example-qt5-console)
|
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 "")
|
set(MYX_CMAKE_DESCRIPTION "Пример проекта: графическая программа Qt5" CACHE STRING "")
|
||||||
|
|
||||||
find_package(MyxCMake REQUIRED)
|
find_package(MyxCMake 0.4.1 REQUIRED)
|
||||||
|
|
||||||
# Qt5
|
# Qt5
|
||||||
find_package(Qt5Core COMPONENTS Private REQUIRED)
|
find_package(Qt5Core COMPONENTS Private REQUIRED)
|
||||||
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
|
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||||
|
|
||||||
|
# Автоматически генерируемый заголовочный файл
|
||||||
|
myx_cmake_generate_private_config_header()
|
||||||
|
|
||||||
# Исходные тексты программы
|
# Исходные тексты программы
|
||||||
add_subdirectory(src/myx-cmake-example-qt5-gui)
|
add_subdirectory(src/myx-cmake-example-qt5-gui)
|
||||||
----
|
----
|
||||||
@ -911,9 +944,16 @@ qt5_wrap_ui(TRGT_ui_h ${TRGT_ui})
|
|||||||
# Правило для автоматической генерации препроцессором moc
|
# Правило для автоматической генерации препроцессором moc
|
||||||
qt5_wrap_cpp(TRGT_moc_cpp ${TRGT_moc_hpp})
|
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
|
# Правило для автоматической генерации препроцессором qrc
|
||||||
# (обязательно после вызова функции qt5_translation, если она есть,
|
|
||||||
# так как она добавляет свои файлы к списку ресурсов)
|
|
||||||
qt5_add_resources(TRTG_qrc_cpp ${TRGT_qrc})
|
qt5_add_resources(TRTG_qrc_cpp ${TRGT_qrc})
|
||||||
|
|
||||||
# Функция для создания цели, результатом которой будет сборка приложения
|
# Функция для создания цели, результатом которой будет сборка приложения
|
||||||
@ -1028,15 +1068,24 @@ TestWindow::~TestWindow() = default;
|
|||||||
|
|
||||||
[source,cpp]
|
[source,cpp]
|
||||||
----
|
----
|
||||||
|
#include "myx_cmake_private_config_p.hpp"
|
||||||
#include "test_window.hpp"
|
#include "test_window.hpp"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
|
#include <QTranslator>
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
QApplication app( argc, 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" ) );
|
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 содержит шаблонные функции для использования
|
Библиотека 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` создаёт для файлов исходных текстов,
|
Функция `myx_cmake_common_target_properties()` создаёт для файлов, формирующих цель,
|
||||||
формирующих цель, дополнительные цели `${target}-format-sources-uncrustify`
|
дополнительные цели `${target}-format-sources-uncrustify` для форматирования
|
||||||
для форматирования исходных текстов на языке C{plus}{plus} в соответствии с правилами,
|
исходных текстов на языке C{plus}{plus} в соответствии с правилами,
|
||||||
перечисленными в файле `.uncrustify.cfg`, находящимся в корне проекта, а также
|
перечисленными в файле `.uncrustify.cfg`, находящимся в корне проекта,
|
||||||
`${target}-format-sources-dos2unix` для преобразования переводов строк в
|
а также `${target}-format-sources-dos2unix` для преобразования переводов
|
||||||
файлах к стандарту, принятому в Unix. Для проекта создаётся цель `myx-cmake-format-sources`,
|
строк в файлах к стандарту, принятому в Unix. Для проекта создаётся цель
|
||||||
которая объединяет все цели, выполняющие форматирование исходных текстов.
|
`myx-cmake-format-sources`, которая объединяет все цели, выполняющие
|
||||||
|
форматирование исходных текстов.
|
||||||
|
|
||||||
IMPORTANT: Настройка правил форматирования помогает другим разработчикам
|
IMPORTANT: Настройка правил форматирования помогает другим разработчикам
|
||||||
придерживаться вашего стиля программирования и отправлять изменения в ваш
|
придерживаться вашего стиля программирования и отправлять изменения в ваш
|
||||||
@ -1102,7 +1174,7 @@ https://www.viva64.com/ru/pvs-studio[PVS-Studio].
|
|||||||
[[analyze-clazy]]
|
[[analyze-clazy]]
|
||||||
==== clazy
|
==== clazy
|
||||||
|
|
||||||
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных
|
Функция `myx_cmake_common_target_properties()` создаёт для файлов исходных
|
||||||
текстов, формирующих цель, дополнительную цель `${target}-analyze-clazy`
|
текстов, формирующих цель, дополнительную цель `${target}-analyze-clazy`
|
||||||
для проверки исходных текстов анализатором `clang`.
|
для проверки исходных текстов анализатором `clang`.
|
||||||
Для всего проекта создаётся цель `myx-cmake-analyze-clazy`, которая
|
Для всего проекта создаётся цель `myx-cmake-analyze-clazy`, которая
|
||||||
@ -1119,7 +1191,7 @@ make myx-cmake-analyze-clazy
|
|||||||
[[analyze-clang-check]]
|
[[analyze-clang-check]]
|
||||||
==== Clang Static Analyzer
|
==== Clang Static Analyzer
|
||||||
|
|
||||||
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных
|
Функция `myx_cmake_common_target_properties()` создаёт для файлов исходных
|
||||||
текстов, формирующих цель, дополнительную цель `${target}-analyze-clang-check`
|
текстов, формирующих цель, дополнительную цель `${target}-analyze-clang-check`
|
||||||
для проверки исходных текстов анализатором `clang-check`.
|
для проверки исходных текстов анализатором `clang-check`.
|
||||||
Для всего проекта создаётся цель `myx-cmake-analyze-clang-check`, которая
|
Для всего проекта создаётся цель `myx-cmake-analyze-clang-check`, которая
|
||||||
@ -1137,7 +1209,7 @@ make myx-cmake-analyze-clang-check
|
|||||||
[[analyze-clang-tidy]]
|
[[analyze-clang-tidy]]
|
||||||
==== Clang Tidy
|
==== Clang Tidy
|
||||||
|
|
||||||
Функция `myx_cmake_common_target_properties` создаёт для файлов исходных
|
Функция `myx_cmake_common_target_properties()` создаёт для файлов исходных
|
||||||
текстов, формирующих цель, дополнительную цель `${target}-analyze-clang-tidy`
|
текстов, формирующих цель, дополнительную цель `${target}-analyze-clang-tidy`
|
||||||
для проверки исходных текстов анализатором `clang-tidy`.
|
для проверки исходных текстов анализатором `clang-tidy`.
|
||||||
Для всего проекта создаётся цель `myx-cmake-analyze-clang-tidy`, которая
|
Для всего проекта создаётся цель `myx-cmake-analyze-clang-tidy`, которая
|
||||||
@ -1155,7 +1227,7 @@ make myx-cmake-analyze-clang-tidy
|
|||||||
[[analyze-pvs-studio]]
|
[[analyze-pvs-studio]]
|
||||||
==== PVS-Studio
|
==== PVS-Studio
|
||||||
|
|
||||||
Функция `myx_cmake_common_target_properties` создаёт для всего проекта
|
Функция `myx_cmake_common_target_properties()` создаёт для всего проекта
|
||||||
цель `myx-cmake-analyze-clang-tidy` для проверки исходных текстов
|
цель `myx-cmake-analyze-clang-tidy` для проверки исходных текстов
|
||||||
анализатором `pvs-studio-analyzer`.
|
анализатором `pvs-studio-analyzer`.
|
||||||
|
|
||||||
@ -1179,16 +1251,17 @@ IMPORTANT: Редактирование кода в автоматическом
|
|||||||
==== clazy
|
==== clazy
|
||||||
|
|
||||||
Программа clazy может преобразовывать в программах, использующих Qt,
|
Программа clazy может преобразовывать в программах, использующих Qt,
|
||||||
подключения сигналов и слотов старого типа, производить замену старых ключевых
|
подключения сигналов и слотов старого типа, производить замену старых
|
||||||
слов, подставлять оптимизированные способы для инициализации строк,
|
ключевых слов, подставлять оптимизированные способы для инициализации
|
||||||
исправлять циклы и передачу аргументов в функции для избежания лишних копирований.
|
строк, исправлять циклы и передачу аргументов в функции для избежания
|
||||||
|
лишних копирований.
|
||||||
|
|
||||||
Для включения автоматического исправления нужно в настройках сборки проекта
|
Для включения автоматического исправления нужно в настройках сборки проекта
|
||||||
menu:Проекты[Настройки сборки] выбрать цель `myx-cmake-analyze-clazy`:
|
menu:Проекты[Настройки сборки] выбрать цель `myx-cmake-analyze-clazy`:
|
||||||
|
|
||||||
[.text-center]
|
[.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} +
|
{empty} +
|
||||||
|
|
||||||
@ -1197,22 +1270,12 @@ btn:[Применить изменения], а затем скомпилиро
|
|||||||
|
|
||||||
[.text-center]
|
[.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} +
|
{empty} +
|
||||||
|
|
||||||
Пример проекта, в котором показаны возможности `clazy`, можно посмотреть
|
Результат автоматической правки исходных текстов можно посмотреть с помощью git (`git diff`).
|
||||||
https://git.246060.ru/f1x1t/cmlib-example-clazy-fix[здесь]. Содержание
|
|
||||||
изменений, произведённых автоматически, можно увидеть
|
|
||||||
https://git.246060.ru/f1x1t/cmlib-example-clazy-fix/commit/81ed1e72b14f17bac0a39ab41bc3ba0ba2bdcb8e?style=split[здесь].
|
|
||||||
|
|
||||||
Можно сделать копию репозитория и выполнить правки в автоматическом режиме
|
|
||||||
самостоятельно:
|
|
||||||
|
|
||||||
[source,sh]
|
|
||||||
----
|
|
||||||
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-clazy-fix
|
|
||||||
----
|
|
||||||
|
|
||||||
==== Clang-Tidy
|
==== Clang-Tidy
|
||||||
|
|
||||||
@ -1221,11 +1284,11 @@ git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-clazy-fix
|
|||||||
использовать Clang-Tidy после clazy.
|
использовать Clang-Tidy после clazy.
|
||||||
|
|
||||||
Для включения автоматического исправления нужно в настройках сборки проекта
|
Для включения автоматического исправления нужно в настройках сборки проекта
|
||||||
menu:Проекты[Настройки сборки] выбрать цель `clang-tidy-check`:
|
menu:Проекты[Настройки сборки] выбрать цель `myx-cmake-analyze-clang-tidy`:
|
||||||
|
|
||||||
[.text-center]
|
[.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} +
|
{empty} +
|
||||||
|
|
||||||
@ -1234,10 +1297,11 @@ btn:[Применить изменения], а затем скомпилиро
|
|||||||
|
|
||||||
[.text-center]
|
[.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} +
|
{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[здесь].
|
таких анализаторов находится https://github.com/google/sanitizers/wiki[здесь].
|
||||||
|
|
||||||
Для обеспечения возможности подключения динамического анализа к проекту
|
Для обеспечения возможности подключения динамического анализа к проекту
|
||||||
нужно выполнить функцию (обязательно после подключения всех библиотек):
|
нужно выполнить функцию `myx_cmake_common_target_properties_post_link()`
|
||||||
|
(обязательно после подключения всех библиотек):
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
# Подключение настроек для динамического анализа программы
|
# Дополнительные функции для цели ${TRGT}.
|
||||||
add_sanitizers(${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/onlinedocs/gcc/Gcov.html[Gcov],
|
||||||
входящая в состав компилятора https://gcc.gnu.org[GCC].
|
входящая в состав компилятора https://gcc.gnu.org[GCC].
|
||||||
|
Для генерирования отчётов в виде HTML-страниц используется
|
||||||
|
программа `lcov`.
|
||||||
|
|
||||||
Для обеспечения возможности подключения анализа покрытия кода к проекту
|
Для обеспечения возможности подключения анализа покрытия кода к проекту
|
||||||
нужно выполнить функцию (обязательно после подключения всех библиотек):
|
нужно выполнить функцию `myx_cmake_common_target_properties_post_link()`
|
||||||
|
(обязательно после подключения всех библиотек):
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
# Подключение возможности использования утилиты Gcov
|
# Дополнительные функции для цели ${TRGT}.
|
||||||
# для исследования покрытия кода
|
# Вызов обязательно после всех функций target_link_libraries
|
||||||
add_code_coverage(${TRGT})
|
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 для генерации сборочных файлов. В результате будут
|
при запуске CMake для генерации сборочных файлов. В результате будут
|
||||||
созданы две дополнительные цели `coverage-${TRGT}` для сбора статистики
|
созданы две дополнительные цели `${TRGT}-coverage` для сбора статистики
|
||||||
после работы программы и `coverage-report-${TRGT}` для её вывода
|
после работы программы и `${TRGT}-coverage-report` для её вывода
|
||||||
в виде HTML-страниц.
|
в виде HTML-страниц.
|
||||||
|
|
||||||
Пример анализа покрытия кода на примере проекта `cmlib-example-app-features`:
|
Пример анализа покрытия кода для проекта `myx-cmake-example-features`:
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
mkdir -p _build/debug
|
cmake -B_build/cov -H. -DMYX_CMAKE_CODE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug
|
||||||
cd _build/debug
|
cd _build/cov
|
||||||
cmake ../.. -DENABLE_CODE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug
|
|
||||||
make
|
make
|
||||||
bin/cmlib-example-app-features
|
bin/myx-cmake-example-features
|
||||||
make coverage-cmlib-example-app-features
|
make myx-cmake-example-features-coverage
|
||||||
make coverage-report-cmlib-example-app-features
|
make myx-cmake-example-features-coverage-report
|
||||||
----
|
----
|
||||||
|
|
||||||
После выполнения этих команд в каталоге `report-cmlib-example-app-features`
|
После выполнения этих команд в каталоге `myx-cmake-example-features-coverage-html`
|
||||||
будет сформирован отчёт в виде HTML-страниц.
|
будет сформирован отчёт в виде HTML-страниц, в котором будет показано,
|
||||||
|
что функция `int unused(int)` не вызывалась.
|
||||||
|
|
||||||
|
|
||||||
=== Профилирование кода
|
=== Профилирование кода
|
||||||
|
|
||||||
Библиотека CMLib предоставляет вариант сборки для профилирования кода,
|
Библиотека MyxCMake предоставляет вариант сборки для профилирования кода,
|
||||||
для которого можно сгенерировать сборочные файлы, присвоив переменной
|
для которого можно сгенерировать сборочные файлы, присвоив переменной
|
||||||
`CMAKE_BUILD_TYPE` значение `Profile`:
|
`CMAKE_BUILD_TYPE` значение `Profile`:
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
mkdir -p _build/profile
|
cmake -B_build/profile -H. -DCMAKE_BUILD_TYPE=Profile
|
||||||
cd _build/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]
|
[source,sh]
|
||||||
----
|
----
|
||||||
./cmlib-example-app-features
|
gprof -b bin/myx-cmake-example-features gmon.out > profiling-tree.txt
|
||||||
gprof -b cmlib-example-app-features gmon.out > analysis-tree.txt
|
gprof -b -p bin/myx-cmake-example-features gmon.out > profiling-flat.txt
|
||||||
gprof -b -p cmlib-example-app-features gmon.out > analysis-flat.txt
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
Результаты профилирования будут записаны в файлы `profiling-tree.txt`
|
||||||
|
и `profiling-flat.txt`.
|
||||||
|
|
||||||
|
|
||||||
=== Ускорение компиляции
|
=== Ускорение компиляции
|
||||||
|
|
||||||
Для ускорения компиляции используется сторонний модуль
|
Для ускорения компиляции используется сторонний модуль
|
||||||
https://github.com/sakra/cotire[cotire], который автоматизирует
|
https://github.com/sakra/cotire[cotire], который автоматизирует
|
||||||
использование предварительно откомпилированных заголовков и
|
использование предварительно откомпилированных заголовочных файлов и
|
||||||
организует пакетный режим обработки исходных файлов в генератора.
|
организует пакетный режим обработки исходных файлов.
|
||||||
Аналогичные функции встроены в CMake, начиная с версии 3.16.
|
Аналогичные функции встроены в CMake, начиная с версии 3.16.
|
||||||
|
|
||||||
Для обеспечения возможностей, предоставляемых модулем cotire,
|
Для обеспечения возможностей, предоставляемых модулем cotire,
|
||||||
нужно выполнить функцию (обязательно после подключения всех библиотек):
|
нужно выполнить функцию `myx_cmake_common_target_properties_post_link()`
|
||||||
|
(обязательно после подключения всех библиотек):
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
# Подключение возможности включения пакетного режима обработки
|
# Дополнительные функции для цели ${TRGT}.
|
||||||
# исходных файлов в генераторах для ускорения сборки
|
# Вызов обязательно после всех функций target_link_libraries
|
||||||
cotire(${TRGT})
|
myx_cmake_common_target_properties_post_link(${TRGT})
|
||||||
----
|
----
|
||||||
|
|
||||||
В результате будут созданы цели с суффиксом `_unity`, при сборки
|
|
||||||
которых будут применяться приведённые выше методы ускорения.
|
|
||||||
|
|
||||||
Пример использования cotire для ускорения сборки
|
|
||||||
на примере проекта `cmlib-example-app-features`:
|
|
||||||
|
|
||||||
[source,sh]
|
FIXME
|
||||||
----
|
|
||||||
mkdir -p _build/debug
|
|
||||||
cd _build/debug
|
|
||||||
cmake ../..
|
|
||||||
make all_unity
|
|
||||||
----
|
|
||||||
|
|
||||||
=== Документирование кода
|
=== Документирование кода
|
||||||
|
|
||||||
@ -1388,61 +1478,33 @@ make all_unity
|
|||||||
sudo apt-get install doxygen
|
sudo apt-get install doxygen
|
||||||
----
|
----
|
||||||
|
|
||||||
Пример комментария:
|
Пример комментариев для исходных текстов можно посмотреть в проекте
|
||||||
|
`myx-cmake-example-features`. Поддержка автоматической генерации
|
||||||
[source,c++]
|
документации реализована в функции библиотеки MyxCMake `myx_cmake_doc_doxygen()`,
|
||||||
----
|
которую необходимо вызвать в основном файле `CMakeLists.txt` проекта.
|
||||||
/**
|
|
||||||
* @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` проекта.
|
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
# Документация
|
# Документация
|
||||||
add_doxygen_target(doc-doxygen LATEX YES HTML YES)
|
myx_cmake_doc_doxygen(LATEX YES HTML YES)
|
||||||
add_breathe_target(doc-breathe)
|
|
||||||
----
|
----
|
||||||
|
|
||||||
В результате будут добавлены цели `doc-doxygen` и `doc-breathe`,
|
В результате будет добавлена цель `myx-cmake-doc-doxygen`,
|
||||||
которые можно использовать после конфигурирования проекта:
|
которую можно использовать после конфигурирования проекта:
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
make doc-doxygen
|
make myx-cmake-doc-doxygen
|
||||||
make doc-breathe
|
|
||||||
----
|
----
|
||||||
|
|
||||||
Шаблоны для комментирования файлов, классов и функций
|
Шаблоны для комментирования файлов, классов и функций можно
|
||||||
можно автоматически расставить в файлах исходных кодов
|
автоматически расставить в файлах исходных кодов с помощью цели
|
||||||
исполнением цели `doc-add-comments` при наличии установленной
|
`myx-cmake-doc-doxygen-append-comments`, которая доступна
|
||||||
программы `uncrustify`:
|
при наличии установленной программы `uncrustify`:
|
||||||
|
|
||||||
[source,cmake]
|
[source,cmake]
|
||||||
----
|
----
|
||||||
make doc-add-comments
|
make myx-cmake-doc-doxygen-append-comments
|
||||||
----
|
----
|
||||||
|
|
||||||
== Удаление установленных файлов
|
== Удаление установленных файлов
|
||||||
@ -1452,18 +1514,21 @@ make doc-add-comments
|
|||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
cd _build
|
cmake -B_build -H. -DCMAKE_INSTALL_PREFIX=_output # <1>
|
||||||
make install
|
cmake --build _build -t install # <2>
|
||||||
make uninstall
|
cmake --build _build -t uninstall # <3>
|
||||||
----
|
----
|
||||||
|
<1> Конфигурирование проекта (каталог сборки `_build`, каталог для установки `_output`)
|
||||||
|
<2> Компиляция проекта и установка в каталог `_output`
|
||||||
|
<3> Удаление файлов, установленных в каталог `_output`, а также пустых каталогов
|
||||||
|
|
||||||
|
|
||||||
== Архивирование проекта и создание пакетов
|
== Архивирование проекта и создание пакетов
|
||||||
|
|
||||||
Стандартный модуль `CPack` предназначен для архивирования исходных
|
Стандартный модуль `CPack` предназначен для архивирования исходных
|
||||||
текстов проекта и создания пакетов для установки в целевую систему.
|
текстов проекта и создания пакетов для установки в целевую систему.
|
||||||
Необходимые переменные устанавливаются в начале файла `CMakeLists.txt`
|
Переменные, необходимые для создания пакетов и архивов, устанавливаются
|
||||||
<<project-required-variables,см. выше>>.
|
в начале файла `CMakeLists.txt` <<project-required-variables,см. выше>>.
|
||||||
|
|
||||||
Библиотека MyxCMake предоставляет возможность стандартного разбиения
|
Библиотека MyxCMake предоставляет возможность стандартного разбиения
|
||||||
на пакеты в соответствии с критериями, приведёнными в таблице.
|
на пакеты в соответствии с критериями, приведёнными в таблице.
|
||||||
@ -1479,46 +1544,41 @@ make uninstall
|
|||||||
|===
|
|===
|
||||||
|
|
||||||
Принадлежность устанавливаемого файла к компоненту определяется с помощью
|
Принадлежность устанавливаемого файла к компоненту определяется с помощью
|
||||||
параметра `COMPONENT` функции `install`. В компонент `main` необходимо
|
параметра `COMPONENT` функции `install()`. В компоненте `main` необходимо
|
||||||
помещать файлы для установки на целевую систему (исполняемые файлы,
|
перечислить файлы для установки на целевую систему (исполняемые файлы,
|
||||||
файлы настроек, файлы данных, разделяемые библиотеки), в компоненты `dev`
|
файлы настроек, файлы данных, разделяемые библиотеки), в компонентах
|
||||||
и `static` --- для установки на систему для разработки (заголовочные
|
`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_source`,
|
||||||
цель для создания общего архива скомпилированного проекта --- `package`,
|
цель для создания общего архива скомпилированного проекта --- `package`,
|
||||||
цель для создания пакетов в формате Debian --- `deb`.
|
цель для создания пакетов в формате Debian --- `deb`.
|
||||||
|
|
||||||
Примера работы с архивированием можно сделать копию репозитория
|
Пример работы с архивированием на основе репозитория библиотеки
|
||||||
библиотеки https://git.246060.ru/f1x1t/myxlib[MyXLib]:
|
https://git.246060.ru/f1x1t/myxlib[MyXLib]:
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
git clone --recursive https://git.246060.ru/f1x1t/myxlib
|
git clone --recursive https://git.246060.ru/f1x1t/myxlib -b v2
|
||||||
----
|
----
|
||||||
|
|
||||||
Дальнейшие шаги:
|
В корневом каталоге проекта нужно выполнить команды:
|
||||||
|
|
||||||
[source,shell]
|
[source,shell]
|
||||||
----
|
----
|
||||||
cd myxlib # <1>
|
cmake -В_build/release -H. -DMYXLIB_BUILD_LIBRARIES=ON -DMYXLIB_BUILD_EXAMPLES=ON -DCMAKE_INSTALL_PREFIX=_output # <1>
|
||||||
mkdir -p _build/debug # <2>
|
cmake --build _build/release -t install -- -j4 # <2>
|
||||||
cd _build/debug # <3>
|
cmake --build _build/release -t doc-doxygen # <3>
|
||||||
cmake ../.. -DMYXLIB_BUILD_LIBRARIES=ON -DMYXLIB_BUILD_EXAMPLES=ON # <4>
|
cmake --build _build/release -t package # <4>
|
||||||
make -j4 # <5>
|
cmake --build _build/release -t package_source # <5>
|
||||||
make doc-doxygen # <6>
|
cmake --build _build/release -t deb # <6>
|
||||||
make package # <7>
|
|
||||||
make package_source # <8>
|
|
||||||
make deb # <9>
|
|
||||||
----
|
----
|
||||||
<1> Перейти в каталог проекта
|
<1> Создание конфигурации для сборки проекта
|
||||||
<2> Создать каталог для сборки проекта
|
<2> Компиляция проекта
|
||||||
<3> Перейти в каталог для сборки проекта
|
<3> Генерирование документации
|
||||||
<4> Создать конфигурацию для сборки проекта
|
<4> Создание архива с результатами компиляции `myx_amd64_0.4.1.tar.xz`
|
||||||
<5> Скомпилировать проект
|
<5> Создание архива с исходными текстами `myx-0.4.1.tar.xz`
|
||||||
<6> Сгенерировать документацию
|
<6> Создание пакетов в формате Debian
|
||||||
<7> Создать архив с результатами компиляции `myx_amd64_0.4.0.tar.xz`
|
|
||||||
<8> Создать архив с исходными текстами `myx-0.4.0.tar.xz`
|
|
||||||
<9> Создать пакеты в формате Debian
|
|
||||||
|
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 51 KiB |
BIN
wiki/images/cmake-project/clang-tidy1.png
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
wiki/images/cmake-project/clang-tidy2.png
Normal file
After Width: | Height: | Size: 167 KiB |
BIN
wiki/images/cmake-project/clazy1.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
wiki/images/cmake-project/clazy2.png
Normal file
After Width: | Height: | Size: 166 KiB |
BIN
wiki/images/cmake-project/qtcreator-cmake-option.png
Normal file
After Width: | Height: | Size: 177 KiB |