diff --git a/wiki/Prog/Development/CMake управление проектом.adoc b/wiki/Prog/Development/CMake управление проектом.adoc index 6c294b9..7f55e85 100644 --- a/wiki/Prog/Development/CMake управление проектом.adoc +++ b/wiki/Prog/Development/CMake управление проектом.adoc @@ -21,15 +21,13 @@ include::{l10ndir}/{lang}.adoc[] │ ├── debug │ │ ├── bin │ │ ├── etc - │ │ ├── files - │ │ │ ├── data - │ │ │ ├── lib - │ │ │ └── log │ │ ├── include - │ │ └── lib + │ │ ├── lib + │ │ ├── log + │ │ ├── share + │ │ └── var │ └── release ├── .git - ├── .gitlab-ci ├── cmake │ ├── cmlib │ ├── doc @@ -39,10 +37,10 @@ include::{l10ndir}/{lang}.adoc[] │ └── generators ├── doc ├── files - │ ├── data │ ├── etc - │ ├── lib - │ └── log + │ ├── log + │ ├── share + │ └── var ├── l10n ├── src │ ├── app @@ -61,14 +59,13 @@ include::{l10ndir}/{lang}.adoc[] |`_build/debug` | Результаты компиляции в режиме отладки |`_build/debug/bin` | Исполняемые файлы |`_build/debug/etc` | Символическая ссылка на каталог `cmex/files/etc` -|`_build/debug/files/data` | Символическая ссылка на каталог `cmex/files/data` -|`_build/debug/files/lib` | Символическая ссылка на каталог `cmex/files/lib` -|`_build/debug/files/log` | Символическая ссылка на каталог `cmex/files/log` |`_build/debug/include` | Заголовочные файлы копируемые и генерируемые во время сборки |`_build/debug/lib` | Статические и динамические библиотеки +|`_build/debug/log` | Символическая ссылка на каталог `cmex/files/log` +|`_build/debug/share` | Символическая ссылка на каталог `cmex/files/share` +|`_build/debug/var` | Символическая ссылка на каталог `cmex/files/var` |`_build/release` | Результаты компиляции в режиме выпуска (иерархия аналогична `debug`) -|`.git` | Системные файлы репозитория git -|`.gitlab.ci` | Шаблон правил для автоматической сборки на сервере Gitlab +|`.git` | Системные файлы репозитория Git |`cmake` | Файлы с дополнительными функциями для CMake |`cmake/cmlib` | Библиотека функций для CMake |`cmake/doc` | Правила для автоматической генерации документации @@ -79,9 +76,9 @@ include::{l10ndir}/{lang}.adoc[] |`doc` | Документация для проекта |`files` | Каталог для дополнительных файлов |`files/etc` | Каталог для файлов настроек проекта -|`files/data` | Каталог для неизменяемых файлов -|`files/lib` | Каталог для изменяемых файлов |`files/log` | Каталог для журналов +|`files/share` | Каталог для неизменяемых файлов +|`files/var` | Каталог для изменяемых файлов |`l10n` | Файлы переводов |`src` | Исходные тексты |`src/app` | Исходные тексты программы @@ -115,7 +112,7 @@ git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-base === Инициализация подмодулей Для начала нужно создать каталог для проекта, перейти в него и -инициализировать репозиторий git: +инициализировать репозиторий: [source,sh] ---- @@ -133,7 +130,6 @@ git submodule add https://git.246060.ru/f1x1t/cmlib.git cmake/cmlib git submodule add https://git.246060.ru/f1x1t/cmake-find.git cmake/find git submodule add https://git.246060.ru/f1x1t/cmake-generators.git cmake/generators git submodule add https://git.246060.ru/f1x1t/cmake-doc.git cmake/doc -git submodule add https://git.246060.ru/f1x1t/uncrustify-config.git cmake/etc/uncrustify git commit -a -m "Начало проекта" ---- @@ -146,13 +142,60 @@ git remote add origin АДРЕС_РЕПОЗИТОРИЯ_НА_СЕРВЕРЕ git push -u origin master ---- +После отправки файлов на сервер отредактировать файл `.gitmodules`, +так чтобы он содержал только относительные пути к подмодулям, чтобы +система автоматической сборки проекта могла их загружать без дополнительной +авторизации. Например, заменить: + +[source,ini] +---- +[submodule "cmake/cmlib"] + path = cmake/cmlib + url = git@git.246060.ru:f1x1t/cmlib.git +[submodule "cmake/find"] + path = cmake/find + url = git@git.246060.ru:f1x1t/cmake-find.git +[submodule "cmake/generators"] + path = cmake/generators + url = git@git.246060.ru:f1x1t/cmake-generators.git +[submodule "cmake/doc"] + path = cmake/doc + url = git@git.246060.ru:f1x1t/cmake-doc.git +---- + +на + +[source,ini] +---- +[submodule "cmake/cmlib"] + path = cmake/cmlib + url = ../../f1x1t/cmlib.git +[submodule "cmake/find"] + path = cmake/find + url = ../../f1x1t/cmake-find.git +[submodule "cmake/generators"] + path = cmake/generators + url = ../../f1x1t/cmake-generators.git +[submodule "cmake/doc"] + path = cmake/doc + url = ../../f1x1t/cmake-doc.git +---- + +Обновить пути и сохранить изменения: + +[source,sh] +---- +git submodule sync --recursive +git add .gitmodules +git commit -m "Настройка путей к подмодулям" +---- + Загрузить шаблоны для автоматической сборки проекта в разных вариантах программных окружений и зафиксировать изменения: [source,sh] ---- -mkdir .gitlab-ci -wget -O .gitlab-ci.yml https://git.246060.ru/f1x1t/gitlab-ci/raw/branch/master/.gitlab-ci.yml +wget https://git.246060.ru/f1x1t/gitlab-ci/raw/branch/master/.gitlab-ci.yml git add .gitlab-ci.yml git commit -m "Настройка автосборки" ---- @@ -166,30 +209,35 @@ git add .clang-tidy git commit -m "Настройка Clang-Tidy" ---- +Загрузить файл настройки для программы https://github.com/cheshirekow/cmake_format/[cmake-format], +используемой для форматирования файлов CMake: + +[source,sh] +---- +wget https://git.246060.ru/f1x1t/cmake-format/raw/branch/master/.cmake-format.py +git add .cmake-format.py +git commit -m "Настройка cmake-format" +---- + + Создать стандартные файлы и каталоги: [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 +mkdir -p files/{etc,log,share,var} +touch files/{etc,log,share,var}/.gitkeep git add doc files git commit -m "Стандартные файлы и каталоги" ---- -IMPORTANT: Файлы `.keep-directory` позволяют защитить каталоги от удаления +IMPORTANT: Файлы `.gitkeep` позволяют защитить каталоги от удаления (будет выводиться дополнительное предупреждение, что каталог не пуст) и -обеспечивают возможность помещения каталогов с систему контроля версий git, +обеспечивают возможность помещения каталогов с систему контроля версий Git, в которой пустые каталоги недопустимы (это правильно!). -Создать файл `.gitignore` для исключения каталогов и файлов из-под контроля git: +Создать файл `.gitignore` для исключения каталогов и файлов из-под контроля Git: [source,sh] ---- @@ -215,7 +263,7 @@ cmake_policy(VERSION 3.0.2..3.7) project(cmlib-example-base VERSION 0.2.0 LANGUAGES C CXX) ---- -Значение версии следует формировать согласно правилам +Значение версии проекта следует формировать согласно правилам https://semver.org/lang/ru/[семантического версионирования]. Для подключения функций для CMake из библиотеки CMLib, нужно добавить @@ -223,6 +271,21 @@ https://semver.org/lang/ru/[семантического версиониров [source,cmake] ---- +### +# Обязательные переменные для CMLib +### +# Название организации +set(CMLIB_ORGANIZATION_NAME "Org." CACHE STRING "") + +# Имя автора +set(CMLIB_AUTHOR_NAME "John Doe" CACHE STRING "") + +# Почта автора +set(CMLIB_AUTHOR_EMAIL "mail@johndoe.com" CACHE STRING "") + +# Краткое описание проекта +set(CMLIB_DESCRIPTION "Пример проекта: начало" CACHE STRING "") + # В каталоге cmake/cmlib находятся файлы с библиотечными функциями if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/cmlib) list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/cmlib) @@ -234,31 +297,14 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find) include(CMLibCommon) ---- -[[variables-cmake]] -В каталоге `cmake/etc` требуется создать файл `Variables.cmake`, -в котором должны быть определены переменные, используемые -библиотекой CMLib для архивирования исходных текстов, автоматического -создания пакетов, генерации документации: - -[source,cmake] ----- -set(ORGANIZATION_NAME "org") -set(AUTHOR_NAME "John Doe") - -set(DOXYGEN_PROJECT_TITLE "Пример проекта (начало)") -set(DOXYGEN_GENERATE_LATEX YES) -set(DOXYGEN_GENERATE_HTML YES) - -set(CPACK_PACKAGE_CONTACT "John Doe ") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake project example") ----- - -Произведённые изменения можно зафиксировать: +Значения обязательных переменных, используемых библиотекой CMLib +для архивирования исходных текстов, автоматического создания пакетов, +генерации документации, следует отредактировать, после чего +произведённые изменения можно зафиксировать: [source,sh] ---- -git add cmake/etc/Variables.cmake CMakeLists.txt -git commit -m "Подключение библиотеки CMLib" +git commit -m "Подключение библиотеки CMLib" CMakeLists.txt ---- Чтобы проверить корректность подключения CMLib, можно выполнить команду: @@ -337,14 +383,14 @@ sudo apt-get install curl libcurl-dev libboost-all-dev На этапе конфигурирования проекта можно сгенерировать файл, в который будут записаны собранные значения параметров. В библиотеке CMLib -присутствует функция `cmlib_config_hpp_generate()`, создающая файл +присутствует функция `cmlib_generate_private_config_hpp()`, создающая файл `${CMAKE_BINARY_DIR}/include/cmlib_private_config.hpp`, в который записывается информация о имени и версии проекта, дате и типе сборки. [source,cmake] ---- # Автоматически генерируемый заголовочный файл -cmlib_config_hpp_generate() +cmlib_generate_private_config_hpp() ---- @@ -452,7 +498,7 @@ set(Boost_USE_STATIC_RUNTIME ON) find_package(Boost 1.55.0 REQUIRED) # Автоматически генерируемый заголовочный файл -cmlib_config_hpp_generate() +cmlib_generate_private_config_hpp() # Каталог с исходными текстами библиотеки add_subdirectory(src/cmlib-example) @@ -568,7 +614,7 @@ set(Boost_USE_STATIC_RUNTIME ON) find_package(Boost 1.55.0 REQUIRED) # Автоматически генерируемый заголовочный файл -cmlib_config_hpp_generate() +cmlib_generate_private_config_hpp() # Приложение add_subdirectory(src/cmlib-example) @@ -800,7 +846,7 @@ target_include_directories(${TRGT} PUBLIC $