Обновление

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} |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

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