Compare commits
2 Commits
3355f9185e
...
51adf6eb5a
Author | SHA1 | Date | |
---|---|---|---|
51adf6eb5a | |||
007afda3d1 |
@ -7,15 +7,14 @@
|
|||||||
== Полезные ссылки
|
== Полезные ссылки
|
||||||
|
|
||||||
* https://github.com/onqtam/awesome-cmake[Каталог ссылок]
|
* https://github.com/onqtam/awesome-cmake[Каталог ссылок]
|
||||||
* https://cgold.readthedocs.io/en/latest/index.html[CGold: The
|
* https://cgold.readthedocs.io/en/latest/index.html[CGold: The Hitchhiker’s Guide to the CMake]
|
||||||
Hitchhiker’s Guide to the CMake]
|
|
||||||
|
|
||||||
== Структура каталогов проекта
|
== Структура каталогов проекта
|
||||||
|
|
||||||
Файлы проекта и результаты компиляции размещаются в каталогах:
|
Файлы проекта и результаты компиляции размещаются в каталогах:
|
||||||
|
|
||||||
....
|
....
|
||||||
└── cmex
|
└── project
|
||||||
├── _build
|
├── _build
|
||||||
│ ├── debug
|
│ ├── debug
|
||||||
│ │ ├── bin
|
│ │ ├── bin
|
||||||
@ -52,43 +51,43 @@ Hitchhiker’s Guide to the CMake]
|
|||||||
|
|
||||||
Назначение каталогов приведено в таблице.
|
Назначение каталогов приведено в таблице.
|
||||||
|
|
||||||
.Назначение каталогов
|
[cols="2,4",options="header",]
|
||||||
[cols="2m,4",options="header",]
|
|
||||||
|===
|
|===
|
||||||
|Каталог |Назначение
|
|Каталог | Назначение
|
||||||
|`cmex/_build` |Результаты компиляции
|
|`_build` | Результаты компиляции
|
||||||
|`cmex/_build/debug` |Результаты компиляции в режиме отладки
|
|`_build/debug` | Результаты компиляции в режиме отладки
|
||||||
|`cmex/_build/debug/bin` | Исполняемые файлы
|
|`_build/debug/bin` | Исполняемые файлы
|
||||||
|`cmex/_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc`
|
|`_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc`
|
||||||
|`cmex/_build/debug/files/data` | Символическая ссылка на каталог `cmex/files/data`
|
|`_build/debug/files/data` | Символическая ссылка на каталог `cmex/files/data`
|
||||||
|`cmex/_build/debug/files/lib` | Символическая ссылка на каталог `cmex/files/lib`
|
|`_build/debug/files/lib` | Символическая ссылка на каталог `cmex/files/lib`
|
||||||
|`cmex/_build/debug/files/log` | Символическая ссылка на каталог `cmex/files/log`
|
|`_build/debug/files/log` | Символическая ссылка на каталог `cmex/files/log`
|
||||||
|`cmex/_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки
|
|`_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки
|
||||||
|`cmex/_build/debug/lib` | Статические и динамические библиотеки
|
|`_build/debug/lib` | Статические и динамические библиотеки
|
||||||
|`cmex/_build/release` |Результаты компиляции в режиме выпуска
|
|`_build/release` | Результаты компиляции в режиме выпуска (иерархия аналогична `debug`)
|
||||||
|`cmex/.git` |Репозиторий git
|
|`.git` | Системные файлы репозитория git
|
||||||
|`cmex/cmake` |Файлы с дополнительными функциями для CMake
|
|`.gitlab.ci` | Шаблон правил для автоматической сборки на сервере Gitlab
|
||||||
|`cmex/cmake/cmlib` |Библиотека функций для CMake
|
|`cmake` | Файлы с дополнительными функциями для CMake
|
||||||
|`cmex/cmake/doc` |Правила для автоматической генерации документации
|
|`cmake/cmlib` | Библиотека функций для CMake
|
||||||
|`cmex/cmake/etc` |Файлы настроек, используемые в CMake
|
|`cmake/doc` | Правила для автоматической генерации документации
|
||||||
|`cmex/cmake/etc/uncrustify` |Файл настройки для программы автоматического форматирования исходных текстов
|
|`cmake/etc` | Файлы настроек, используемые в CMake
|
||||||
|`cmex/cmake/find` |Модули CMake для поиска внешних программ и библиотек
|
|`cmake/etc/uncrustify` | Файл настройки для программы автоматического форматирования исходных текстов
|
||||||
|`cmex/cmake/generators` |Генераторы проектов
|
|`cmake/find` | Модули CMake для поиска внешних программ и библиотек
|
||||||
|`cmex/doc` |Документация для проекта
|
|`cmake/generators` | Генераторы проектов
|
||||||
|`cmake/files` |Каталог для дополнительных файлов
|
|`doc` | Документация для проекта
|
||||||
|`cmake/files/etc` |Каталог для файлов настроек проекта
|
|`files` | Каталог для дополнительных файлов
|
||||||
|`cmake/files/data` |Каталог для неизменяемых файлов
|
|`files/etc` | Каталог для файлов настроек проекта
|
||||||
|`cmake/files/lib` |Каталог для изменяемых файлов
|
|`files/data` | Каталог для неизменяемых файлов
|
||||||
|`cmake/files/log` |Каталог для журналов
|
|`files/lib` | Каталог для изменяемых файлов
|
||||||
|`cmex/l10n` |Файлы переводов
|
|`files/log` | Каталог для журналов
|
||||||
|`cmex/src` |Исходные тексты
|
|`l10n` | Файлы переводов
|
||||||
|`cmex/src/app` |Исходные тексты программ
|
|`src` | Исходные тексты
|
||||||
|`cmex/src/lib` |Исходные тексты библиотек
|
|`src/app` | Исходные тексты программы
|
||||||
|`cmex/thirdparty` |Исходные тексты сторонних проектов
|
|`src/lib` | Исходные тексты библиотеки
|
||||||
|`cmex/tools` |Дополнительные утилиты
|
|`thirdparty` | Исходные тексты дополнительных и сторонних проектов
|
||||||
|
|`tools` | Дополнительные утилиты
|
||||||
|===
|
|===
|
||||||
|
|
||||||
Каталог `_build` создаётся, чтобы избежать попадания получаемых во время
|
Каталог `_build` создаётся, чтобы избежать попадания создаваемых во время
|
||||||
сборки файлов в иерархию основного проекта. Запись результатов сборки
|
сборки файлов в иерархию основного проекта. Запись результатов сборки
|
||||||
проекта внутрь иерархии каталогов с исходными текстами приводит к
|
проекта внутрь иерархии каталогов с исходными текстами приводит к
|
||||||
засорению формируемыми на этапе сборки файлами, которые затрудняют
|
засорению формируемыми на этапе сборки файлами, которые затрудняют
|
||||||
@ -99,42 +98,118 @@ Hitchhiker’s Guide to the CMake]
|
|||||||
|
|
||||||
== Начало проекта
|
== Начало проекта
|
||||||
|
|
||||||
Проект, в котором выполнены приведённые ниже действия, можно посмотреть
|
Проект, в котором выполнены приведённые в данном разделе действия,
|
||||||
https://git.246060.ru/f1x1t/cmex[здесь] или сделать его копию командой:
|
можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-base[здесь]
|
||||||
|
или сделать его копию командой:
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
git clone --recursive https://git.246060.ru/f1x1t/cmex
|
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-base
|
||||||
----
|
----
|
||||||
|
|
||||||
В каталоге `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(cmex VERSION 0.2.0 LANGUAGES C CXX)
|
project(cmlib-example-base VERSION 0.2.0 LANGUAGES C CXX)
|
||||||
----
|
----
|
||||||
|
|
||||||
Значение версии следует формировать согласно правилам
|
Значение версии следует формировать согласно правилам
|
||||||
https://semver.org/lang/ru/[семантического версионирования].
|
https://semver.org/lang/ru/[семантического версионирования].
|
||||||
|
|
||||||
В каталоге `cmex` нужно инициализировать репозиторий и установить
|
Для подключения функций для CMake из библиотеки CMLib, нужно добавить
|
||||||
подмодули, содержащие функции для CMake:
|
в файл `CMakeLists.txt` строки:
|
||||||
|
|
||||||
[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]
|
||||||
----
|
----
|
||||||
@ -149,36 +224,61 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find)
|
|||||||
include(CMLibCommon)
|
include(CMLibCommon)
|
||||||
----
|
----
|
||||||
|
|
||||||
В файле `cmake/etc/organization.txt` записать название организации,
|
В каталоге `cmake/etc` требуется создать файл `Variables.cmake`,
|
||||||
которой принадлежит проект:
|
в котором требуется определить значения переменных, используемых
|
||||||
|
библиотекой CMLib для автоматического создания пакетов, генерации
|
||||||
|
документации:
|
||||||
|
|
||||||
....
|
[source,cmake]
|
||||||
ORG, Inc.
|
----
|
||||||
....
|
set(ORGANIZATION_NAME "org")
|
||||||
|
set(AUTHOR_NAME "John Doe")
|
||||||
|
|
||||||
В файле `cmake/etc/cpack_ignore.txt` перечислить шаблоны для исключения
|
set(DOXYGEN_PROJECT_TITLE "Пример проекта (начало)")
|
||||||
из архива, создаваемого целью `dist`. Например:
|
set(DOXYGEN_GENERATE_LATEX YES)
|
||||||
|
set(DOXYGEN_GENERATE_HTML YES)
|
||||||
|
|
||||||
....
|
set(CPACK_GENERATOR "TXZ;DEB")
|
||||||
cmake/lib/.git$
|
set(CPACK_PACKAGE_CONTACT "John Doe <box@mail.domain>")
|
||||||
.git$
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake project example")
|
||||||
files/var
|
set(CPACK_DEBIAN_PACKAGE_SECTION "misc")
|
||||||
CMakeLists.txt.user
|
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
|
||||||
~$
|
set(CPACK_SOURCE_IGNORE_FILES
|
||||||
\\\\..*\\\\.bak$
|
.git/
|
||||||
\\\\..*\\\\.tmp$
|
obj.*/
|
||||||
\\\\..*\\\\.swp$
|
_build
|
||||||
....
|
_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]
|
||||||
----
|
----
|
||||||
cmake ..
|
git add cmake/etc/Variables.cmake CMakeLists.txt
|
||||||
make
|
git commit -m "Подключение библиотеки CMLib"
|
||||||
----
|
----
|
||||||
|
|
||||||
|
Чтобы проверить корректность подключения CMLib, можно выполнить команду:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
----
|
||||||
|
(mkdir -p _build && cd _build && cmake .. && make && echo OK)
|
||||||
|
----
|
||||||
|
|
||||||
|
Если последней строкой вывода будет `OK`, то настройка завершена верно.
|
||||||
|
|
||||||
|
|
||||||
== Поиск системных библиотек
|
== Поиск системных библиотек
|
||||||
|
|
||||||
Системные библиотеки можно искать с помощью программы `pkgconfig`,
|
Системные библиотеки можно искать с помощью программы `pkgconfig`,
|
||||||
|
@ -13,14 +13,14 @@
|
|||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
sudo apt-get install clang-tidy-6.0
|
sudo apt-get install clang-tidy-10
|
||||||
----
|
----
|
||||||
|
|
||||||
Использование:
|
Использование:
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source
|
cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-10" path/to/source
|
||||||
----
|
----
|
||||||
|
|
||||||
В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со
|
В каталоге проекта нужно создать файл `.clang-tidy` в формате YAML со
|
||||||
@ -30,12 +30,25 @@ cmake "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-6.0" path/to/source
|
|||||||
----
|
----
|
||||||
---
|
---
|
||||||
Checks: '-*,
|
Checks: '-*,
|
||||||
clang-diagnostic-*,
|
bugprone-*,
|
||||||
readability-*,
|
clang-analyzer-*,
|
||||||
modernize-*,
|
cppcoreguidelines-*,
|
||||||
cppcoreguidelines-*,
|
google-*,
|
||||||
google-*,
|
llvm-*,
|
||||||
bugprone-*'
|
misc-*,
|
||||||
|
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
|
||||||
@ -124,7 +137,7 @@ cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE ..
|
|||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
sudo apt-get install clazy clang-6.0
|
sudo apt-get install clazy clang-9
|
||||||
----
|
----
|
||||||
|
|
||||||
Использование:
|
Использование:
|
||||||
@ -132,7 +145,6 @@ sudo apt-get install clazy clang-6.0
|
|||||||
[source,sh]
|
[source,sh]
|
||||||
----
|
----
|
||||||
CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy ..
|
CLAZY_CHECKS=level2 cmake -DCMAKE_CXX_COMPILER=clazy ..
|
||||||
CLANGXX=clang++-6.0 make
|
CLANGXX=clang++-9 make
|
||||||
----
|
----
|
||||||
|
|
||||||
=== PVS-Studio
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user