Compare commits

..

No commits in common. "51adf6eb5acb0144041929b2c1603add1843b4e0" and "3355f9185e981f402be0b8895faca6184f557f5b" have entirely different histories.

2 changed files with 88 additions and 200 deletions

View File

@ -7,14 +7,15 @@
== Полезные ссылки == Полезные ссылки
* https://github.com/onqtam/awesome-cmake[Каталог ссылок] * https://github.com/onqtam/awesome-cmake[Каталог ссылок]
* https://cgold.readthedocs.io/en/latest/index.html[CGold: The Hitchhikers Guide to the CMake] * https://cgold.readthedocs.io/en/latest/index.html[CGold: The
Hitchhikers Guide to the CMake]
== Структура каталогов проекта == Структура каталогов проекта
Файлы проекта и результаты компиляции размещаются в каталогах: Файлы проекта и результаты компиляции размещаются в каталогах:
.... ....
└── project └── cmex
├── _build ├── _build
│ ├── debug │ ├── debug
│ │ ├── bin │ │ ├── bin
@ -51,43 +52,43 @@
Назначение каталогов приведено в таблице. Назначение каталогов приведено в таблице.
[cols="2,4",options="header",] .Назначение каталогов
[cols="2m,4",options="header",]
|=== |===
|Каталог | Назначение |Каталог |Назначение
|`_build` | Результаты компиляции |`cmex/_build` |Результаты компиляции
|`_build/debug` | Результаты компиляции в режиме отладки |`cmex/_build/debug` |Результаты компиляции в режиме отладки
|`_build/debug/bin` | Исполняемые файлы |`cmex/_build/debug/bin` | Исполняемые файлы
|`_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc` |`cmex/_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc`
|`_build/debug/files/data` | Символическая ссылка на каталог `cmex/files/data` |`cmex/_build/debug/files/data` | Символическая ссылка на каталог `cmex/files/data`
|`_build/debug/files/lib` | Символическая ссылка на каталог `cmex/files/lib` |`cmex/_build/debug/files/lib` | Символическая ссылка на каталог `cmex/files/lib`
|`_build/debug/files/log` | Символическая ссылка на каталог `cmex/files/log` |`cmex/_build/debug/files/log` | Символическая ссылка на каталог `cmex/files/log`
|`_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки |`cmex/_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки
|`_build/debug/lib` | Статические и динамические библиотеки |`cmex/_build/debug/lib` | Статические и динамические библиотеки
|`_build/release` | Результаты компиляции в режиме выпуска (иерархия аналогична `debug`) |`cmex/_build/release` |Результаты компиляции в режиме выпуска
|`.git` | Системные файлы репозитория git |`cmex/.git` |Репозиторий git
|`.gitlab.ci` | Шаблон правил для автоматической сборки на сервере Gitlab |`cmex/cmake` |Файлы с дополнительными функциями для CMake
|`cmake` | Файлы с дополнительными функциями для CMake |`cmex/cmake/cmlib` |Библиотека функций для CMake
|`cmake/cmlib` | Библиотека функций для CMake |`cmex/cmake/doc` |Правила для автоматической генерации документации
|`cmake/doc` | Правила для автоматической генерации документации |`cmex/cmake/etc` |Файлы настроек, используемые в CMake
|`cmake/etc` | Файлы настроек, используемые в CMake |`cmex/cmake/etc/uncrustify` |Файл настройки для программы автоматического форматирования исходных текстов
|`cmake/etc/uncrustify` | Файл настройки для программы автоматического форматирования исходных текстов |`cmex/cmake/find` |Модули CMake для поиска внешних программ и библиотек
|`cmake/find` | Модули CMake для поиска внешних программ и библиотек |`cmex/cmake/generators` |Генераторы проектов
|`cmake/generators` | Генераторы проектов |`cmex/doc` |Документация для проекта
|`doc` | Документация для проекта |`cmake/files` |Каталог для дополнительных файлов
|`files` | Каталог для дополнительных файлов |`cmake/files/etc` |Каталог для файлов настроек проекта
|`files/etc` | Каталог для файлов настроек проекта |`cmake/files/data` |Каталог для неизменяемых файлов
|`files/data` | Каталог для неизменяемых файлов |`cmake/files/lib` |Каталог для изменяемых файлов
|`files/lib` | Каталог для изменяемых файлов |`cmake/files/log` |Каталог для журналов
|`files/log` | Каталог для журналов |`cmex/l10n` |Файлы переводов
|`l10n` | Файлы переводов |`cmex/src` |Исходные тексты
|`src` | Исходные тексты |`cmex/src/app` |Исходные тексты программ
|`src/app` | Исходные тексты программы |`cmex/src/lib` |Исходные тексты библиотек
|`src/lib` | Исходные тексты библиотеки |`cmex/thirdparty` |Исходные тексты сторонних проектов
|`thirdparty` | Исходные тексты дополнительных и сторонних проектов |`cmex/tools` |Дополнительные утилиты
|`tools` | Дополнительные утилиты
|=== |===
Каталог `_build` создаётся, чтобы избежать попадания создаваемых во время Каталог `_build` создаётся, чтобы избежать попадания получаемых во время
сборки файлов в иерархию основного проекта. Запись результатов сборки сборки файлов в иерархию основного проекта. Запись результатов сборки
проекта внутрь иерархии каталогов с исходными текстами приводит к проекта внутрь иерархии каталогов с исходными текстами приводит к
засорению формируемыми на этапе сборки файлами, которые затрудняют засорению формируемыми на этапе сборки файлами, которые затрудняют
@ -98,118 +99,42 @@
== Начало проекта == Начало проекта
Проект, в котором выполнены приведённые в данном разделе действия, Проект, в котором выполнены приведённые ниже действия, можно посмотреть
можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-base[здесь] https://git.246060.ru/f1x1t/cmex[здесь] или сделать его копию командой:
или сделать его копию командой:
[source,sh] [source,sh]
---- ----
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-base git clone --recursive https://git.246060.ru/f1x1t/cmex
---- ----
=== Инициализация подмодулей В каталоге `cmex` нужно создать файл `CMakeLists.txt`:
Для начала нужно создать каталог для проекта, перейти в него и
инициализировать репозиторий git:
[source,sh]
----
mkdir cmlib-example-base
cd cmlib-example-base
git init
----
Для подключения основных подмодулей, содержащих дополнительные функции
для работы с проектом, и фиксации произведённого изменения нужно выполнить:
[source,sh]
----
git submodule add git@git.246060.ru:f1x1t/cmlib.git cmake/cmlib
git submodule add git@git.246060.ru:f1x1t/cmake-find.git cmake/find
git submodule add git@git.246060.ru:f1x1t/cmake-generators.git cmake/generators
git submodule add git@git.246060.ru:f1x1t/cmake-doc.git cmake/doc
git submodule add git@git.246060.ru:f1x1t/uncrustify-config.git cmake/etc/uncrustify
git commit -a -m "Начало проекта"
----
Отправить изменения в проекте на сервер и сделать ветку `master` основной:
[source,sh]
----
git remote add origin АДРЕС_РЕПОЗИТОРИЯ_НА_СЕРВЕРЕ
git push -u origin master
----
Загрузить шаблоны для автоматической сборки проекта в разных вариантах
программных окружений и зафиксировать изменения:
[source,sh]
----
mkdir .gitlab-ci
wget -O .gitlab-ci/scheduled.yml https://git.246060.ru/f1x1t/gitlab-ci/raw/branch/master/.gitlab-ci/scheduled.yml
wget -O .gitlab-ci.yml https://git.246060.ru/f1x1t/gitlab-ci/raw/branch/master/.gitlab-ci.yml
git add .gitlab-ci.yml .gitlab-ci/scheduled.yml
git commit -m "Настройка автосборки"
----
Загрузить файл настройки для анализатора Clang-Tidy:
[source,sh]
----
wget https://git.246060.ru/f1x1t/clang-tidy-config/raw/branch/master/.clang-tidy
git add .clang-tidy
git commit -m "Настройка Clang-Tidy"
----
Создать стандартные файлы и каталоги:
[source,sh]
----
mkdir -p doc/breathe
touch doc/breathe/index.md.in
mkdir -p files/etc
touch files/etc/.keep-directory
mkdir -p files/data
touch files/data/.keep-directory
mkdir -p files/lib
touch files/lib/.keep-directory
mkdir -p files/log
touch files/log/.keep-directory
git add doc files
git commit -m "Стандартные файлы и каталоги"
----
Создать файл `.gitignore` для исключения каталогов и файлов из-под контроля git:
[source,sh]
----
wget https://git.246060.ru/f1x1t/cmlib-gitignore/raw/branch/master/.gitignore
git add .gitignore
git commit -m "Шаблон для игнорирования каталогов и файлов"
----
=== Базовые инструкции в CMake
В корневом каталоге проекта нужно создать файл `CMakeLists.txt`:
[source,cmake] [source,cmake]
---- ----
# Минимальная версия CMake # Минимальная версия Cmake
cmake_minimum_required(VERSION 3.3) cmake_minimum_required(VERSION 3.3)
# Предпочтительно следовать стандартам принятым в указанном диапазоне версий
cmake_policy(VERSION 3.0.2..3.7) cmake_policy(VERSION 3.0.2..3.7)
# Название и версия проекта и используемые языки программирования # Название и версия проекта и используемые языки программирования
project(cmlib-example-base VERSION 0.2.0 LANGUAGES C CXX) project(cmex VERSION 0.2.0 LANGUAGES C CXX)
---- ----
Значение версии следует формировать согласно правилам Значение версии следует формировать согласно правилам
https://semver.org/lang/ru/[семантического версионирования]. https://semver.org/lang/ru/[семантического версионирования].
Для подключения функций для CMake из библиотеки CMLib, нужно добавить В каталоге `cmex` нужно инициализировать репозиторий и установить
в файл `CMakeLists.txt` строки: подмодули, содержащие функции для CMake:
[source,sh]
----
git init .
git submodule add https://git.246060.ru/f1x1t/cmlib cmake/cmlib
git submodule add https://git.246060.ru/f1x1t/cmake-find cmake/find
git submodule add https://git.246060.ru/f1x1t/cmake-generators cmake/generators
git submodule update --remote --init
----
и подключить в файле `CMakeLists.txt`:
[source,cmake] [source,cmake]
---- ----
@ -224,61 +149,36 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find)
include(CMLibCommon) include(CMLibCommon)
---- ----
В каталоге `cmake/etc` требуется создать файл `Variables.cmake`, В файле `cmake/etc/organization.txt` записать название организации,
в котором требуется определить значения переменных, используемых которой принадлежит проект:
библиотекой CMLib для автоматического создания пакетов, генерации
документации:
[source,cmake] ....
---- ORG, Inc.
set(ORGANIZATION_NAME "org") ....
set(AUTHOR_NAME "John Doe")
set(DOXYGEN_PROJECT_TITLE "Пример проекта (начало)") В файле `cmake/etc/cpack_ignore.txt` перечислить шаблоны для исключения
set(DOXYGEN_GENERATE_LATEX YES) из архива, создаваемого целью `dist`. Например:
set(DOXYGEN_GENERATE_HTML YES)
set(CPACK_GENERATOR "TXZ;DEB") ....
set(CPACK_PACKAGE_CONTACT "John Doe <box@mail.domain>") cmake/lib/.git$
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake project example") .git$
set(CPACK_DEBIAN_PACKAGE_SECTION "misc") files/var
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") CMakeLists.txt.user
set(CPACK_SOURCE_IGNORE_FILES ~$
.git/ \\\\..*\\\\.bak$
obj.*/ \\\\..*\\\\.tmp$
_build \\\\..*\\\\.swp$
_output ....
files/lib
files/log
debian/tmp/
debian/files
debian/.*\\\\.log$
debian/.*.substvars
debian/stamp.*
CMakeLists.txt.user.*
cmake/lib/.git$
~$
\\\\..*\\\\.swp$)
----
Произведённые изменения можно зафиксировать: Чтобы проверить корректность файла `CMakeLists.txt`, нужно создать
каталог `_build` в каталоге `cmex`, перейти в него и выполнить команды:
[source,sh] [source,sh]
---- ----
git add cmake/etc/Variables.cmake CMakeLists.txt cmake ..
git commit -m "Подключение библиотеки CMLib" make
---- ----
Чтобы проверить корректность подключения CMLib, можно выполнить команду:
[source,sh]
----
(mkdir -p _build && cd _build && cmake .. && make && echo OK)
----
Если последней строкой вывода будет `OK`, то настройка завершена верно.
== Поиск системных библиотек == Поиск системных библиотек
Системные библиотеки можно искать с помощью программы `pkgconfig`, Системные библиотеки можно искать с помощью программы `pkgconfig`,

View File

@ -13,14 +13,14 @@
[source,sh] [source,sh]
---- ----
sudo apt-get install clang-tidy-10 sudo apt-get install clang-tidy-6.0
---- ----
Использование: Использование:
[source,sh] [source,sh]
---- ----
cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-10" path/to/source cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source
---- ----
В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со
@ -30,25 +30,12 @@ cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-10" path/to/source
---- ----
--- ---
Checks: '-*, Checks: '-*,
bugprone-*, clang-diagnostic-*,
clang-analyzer-*, readability-*,
cppcoreguidelines-*, modernize-*,
google-*, cppcoreguidelines-*,
llvm-*, google-*,
misc-*, bugprone-*'
modernize-*,
readability-*,
performance-*,
portability-*,
-cppcoreguidelines-owning-memory,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
-readability-magic-numbers,
-readability-else-after-return,
-modernize-use-trailing-return-type,
-modernize-avoid-c-arrays,
-performance-no-automatic-move,
'
CheckOptions: CheckOptions:
- key: readability-identifier-naming.ClassCase - key: readability-identifier-naming.ClassCase
value: CamelCase value: CamelCase
@ -137,7 +124,7 @@ cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE ..
[source,sh] [source,sh]
---- ----
sudo apt-get install clazy clang-9 sudo apt-get install clazy clang-6.0
---- ----
Использование: Использование:
@ -145,6 +132,7 @@ sudo apt-get install clazy clang-9
[source,sh] [source,sh]
---- ----
CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy .. CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy ..
CLANGXX=clang++-9 make CLANGXX=clang++-6.0 make
---- ----
=== PVS-Studio