From c41683d9e2228b0a4217615f50b13d42201b5c54 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Fri, 10 Apr 2020 18:10:40 +0300 Subject: [PATCH 1/2] update --- themes/bootstrap4 | 2 +- .../CMake управление проектом.adoc | 194 ++++++++++++------ 2 files changed, 137 insertions(+), 59 deletions(-) diff --git a/themes/bootstrap4 b/themes/bootstrap4 index ce6b186..c651ba0 160000 --- a/themes/bootstrap4 +++ b/themes/bootstrap4 @@ -1 +1 @@ -Subproject commit ce6b18660a933855dbe996fc5b5d3d0ac1c25223 +Subproject commit c651ba0ef064734b6457684c780f8c863f0956bf diff --git a/wiki/Prog/Development/CMake управление проектом.adoc b/wiki/Prog/Development/CMake управление проектом.adoc index 4b3ba3d..e727170 100644 --- a/wiki/Prog/Development/CMake управление проектом.adoc +++ b/wiki/Prog/Development/CMake управление проектом.adoc @@ -96,7 +96,9 @@ выпуск, появляется необходимость корректного полного удаления результатов предыдущего тип сборки. -== Начало проекта + +[[base-project]] +== Базовый проект Проект, в котором выполнены приведённые в данном разделе действия, можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-base[здесь] @@ -124,11 +126,11 @@ git init [source,sh] ---- -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 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 "Начало проекта" ---- @@ -375,83 +377,157 @@ cpack == Примеры библиотек и приложений -Напишу позже. +=== Базовая библиотека +Проект с базовой библиотекой реализован на основе <>. +Исходные тексты содержат комментарии, объясняющие назначение используемых функций. +Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-library[здесь] +или сделать его копию командой: +[source,sh] +---- +git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-library +---- - -== Базовая библиотека - -В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла -`CMakeLists.txt` в подкаталоге `src/lib`: +В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, нужно добавить: [source,cmake] ---- -add_subdirectory(src/libcmex) +# Поиск библиотеки Boost +set(Boost_USE_STATIC_LIBS ON) +set(Boost_USE_MULTITHREADED OFF) +set(Boost_USE_STATIC_RUNTIME ON) +find_package(Boost 1.55.0 REQUIRED COMPONENTS headers) + +# Автоматически генерируемый заголовочный файл +cmlib_config_hpp_generate() + +# Каталог с исходными текстами библиотеки +add_subdirectory(src/cmlib-example) + +# Документация +add_subdirectory(cmake/doc) + +# Создание вспомогательных символических ссылок +add_dependencies(cmlib-example create_auxilary_symlinks) ---- -В каталоге `cmex/src/libcmex` нужно создать файл `cmex.hpp`: -[source,cpp] ----- -#ifndef LIBCMEX_CMEX_HPP_ -#define LIBCMEX_CMEX_HPP_ - -#include - -int32_t cmex_init(int32_t i); - -#endif // LIBCMEX_CMEX_HPP_ ----- - -файл `cmex.cpp`: - -[source,cpp] ----- -#include "cmex.hpp" - -int32_t cmex_init(int32_t i = 0) { - return i; -} ----- - -и файл `CMakeLists.txt`: +В подкаталоге `src/cmlib-example` нужно создать файл `CMakeLists.txt`: [source,cmake] ---- # Название основной цели и имя библиотеки в текущем каталоге -set(current_target cmex) +set(TRGT cmlib-example) # Список файлов исходных текстов -set(current_target_sources - ${CMAKE_CURRENT_SOURCE_DIR}/cmex.cpp -) +set(TRGT_sources + ${CMAKE_CURRENT_SOURCE_DIR}/init.cpp) # Список заголовочных файлов (используется для установки) -set(current_target_headers - ${CMAKE_CURRENT_SOURCE_DIR}/cmex.hpp -) +set(TRGT_headers + ${CMAKE_CURRENT_SOURCE_DIR}/init.hpp) -add_common_library(TARGET ${current_target} SOURCES ${current_target_sources}) -common_target_properties(${current_target}) +# Функция для создания цели, результатом которой будет сборка библиотеки +add_common_library(TARGET ${TRGT} SOURCES ${TRGT_sources}) +common_target_properties(${TRGT}) -# Цель, используемая только для установки заголовочных файлов, без компиляции проекта -add_custom_target(${current_target}-install-headers - COMMAND "${CMAKE_COMMAND}" - -DCMAKE_INSTALL_COMPONENT=headers -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" - ) +# Добавление к пути поиска заголовочных файлов +target_include_directories(${TRGT} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS}) -# Правила для установки -install(TARGETS ${current_target}_static ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +# Цель, используемая только для установки +# заголовочных файлов без компиляции проекта +add_custom_target( + ${TRGT}-install-headers + COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=headers -P + "${CMAKE_BINARY_DIR}/cmake_install.cmake") + +# Установка статической библиотеки +install(TARGETS ${TRGT}_static + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +# Установка динамической библиотеки if(BUILD_SHARED_LIBS) - install(TARGETS ${current_target}_shared LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${TRGT}_shared + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() -install(FILES ${CMAKE_BINARY_DIR}/include/cmlib_config.hpp ${current_target_headers} - COMPONENT headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${current_target}) + +# Установка заголовочных файлов +install( + FILES ${TRGT}_headers + COMPONENT headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT}) + +# Установка файла для pkg-config +install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) ---- -== Базовое приложение + +файл `init.hpp`: + +[source,cpp] +---- +#ifndef CMLIB_EXAMPLE_HPP_ +#define CMLIB_EXAMPLE_HPP_ + +#include + +int32_t cmlib_example_init(int32_t i); + +#endif // CMLIB_EXAMPLE_HPP_ +---- + +и файл `init.cpp`: + +[source,cpp] +---- +#include "init.hpp" + +#include + +int32_t cmlib_example_init(int32_t i = 0) +{ + int32_t s = 0; + for ( auto r : boost::counting_range( 1, i ) ) + { + s += r; + } + return s; +} +---- + + + +ПИШУ ЗДЕСЬ!!! + + + +=== Базовое приложение + +Проект с базовым приложением реализован на основе <>. +Исходные тексты содержат комментарии, объясняющие назначение используемых функций. +Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-application[здесь] +или сделать его копию командой: + +[source,sh] +---- +git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-application +---- + +В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, нужно добавить: + + + + + + + + + + + В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла `CMakeLists.txt` в подкаталоге `src/cmex`: @@ -521,6 +597,8 @@ target_link_libraries(${current_target} cmex_static) install(TARGETS ${current_target} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) ---- + + == Подключение внешнего проекта В каталоге `cmex/thirdparty` нужно создать каталог `cmext` с проектом, From d931b5aaea79f5c55e1705e557a6592760507a25 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sat, 11 Apr 2020 14:57:13 +0300 Subject: [PATCH 2/2] update --- themes/bootstrap4 | 2 +- .../CMake управление проектом.adoc | 206 +++++++++--------- 2 files changed, 103 insertions(+), 105 deletions(-) diff --git a/themes/bootstrap4 b/themes/bootstrap4 index c651ba0..ce6b186 160000 --- a/themes/bootstrap4 +++ b/themes/bootstrap4 @@ -1 +1 @@ -Subproject commit c651ba0ef064734b6457684c780f8c863f0956bf +Subproject commit ce6b18660a933855dbe996fc5b5d3d0ac1c25223 diff --git a/wiki/Prog/Development/CMake управление проектом.adoc b/wiki/Prog/Development/CMake управление проектом.adoc index e727170..4bc4152 100644 --- a/wiki/Prog/Development/CMake управление проектом.adoc +++ b/wiki/Prog/Development/CMake управление проектом.adoc @@ -248,21 +248,22 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake project example") set(CPACK_DEBIAN_PACKAGE_SECTION "misc") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_SOURCE_IGNORE_FILES - ${CMAKE_BINARY_DIR} - .git/ - .git$ - .gitlab-ci/ - _output/ - files/lib - files/log - .clang-tidy - .cmake-format - .gitignore - .gitmodules - .gitlab-ci.yml - CMakeLists.txt.user.* - ~$ - \\\\..*\\\\.swp$) + "${CMAKE_BINARY_DIR}" + "/\\\\.git/" + "/\\\\.gitlab-ci/" + "^${CMAKE_SOURCE_DIR}/.?build.?/" + "^${CMAKE_SOURCE_DIR}/.?output.?/" + "^${CMAKE_SOURCE_DIR}/files/lib" + "^${CMAKE_SOURCE_DIR}/files/log" + "\\\\.clang-tidy$" + "\\\\.cmake-format$" + "\\\\.gitignore$" + "\\\\.gitattributes$" + "\\\\.gitmodules$" + "\\\\.gitlab-ci.yml" + "CMakeLists.txt.user.*" + "~$" + "\\\\.swp$") ---- Произведённые изменения можно зафиксировать: @@ -354,23 +355,28 @@ make uninstall ---- -== Архивирование проекта +== Архивирование проекта и создание пакетов Стандартный модуль `CPack` предназначен для архивирования исходных текстов проекта и создания пакетов для установки в целевую систему. Необходимые переменные устанавливаются в файле `cmake/etc/Variables.cmake` <>. -По умолчанию цель для упаковки исходных текстов называется `package_source`. -В библиотеке CMLib определены значения основных параметров, -а также дополнительная цель `dist`. +Устанавливаемые файлы делятся на две группы `MAIN` и `DEV` с помощью +параметра `COMPONENT` функции `install`. В группу `MAIN` необходимо +помещать файлы для установки на целевую систему (исполняемые файлы, +файлы настроек, файлы данных, разделяемые библиотеки), а в группу `DEV` --- +для установки на систему для разработки (заголовочные файлы, статические +библиотеки). -Для создания бинарных пакетов нужно выполнить в каталоге сборки команду `cpack`. +По умолчанию цель для упаковки исходных текстов называется `package_source`. +Бинарные пакеты создаются программой `cpack`. Пример: [source,sh] ---- cd _build/debug -make dist +make +make package_source cpack ---- @@ -422,12 +428,10 @@ add_dependencies(cmlib-example create_auxilary_symlinks) set(TRGT cmlib-example) # Список файлов исходных текстов -set(TRGT_sources - ${CMAKE_CURRENT_SOURCE_DIR}/init.cpp) +set(TRGT_sources ${CMAKE_CURRENT_SOURCE_DIR}/init.cpp) # Список заголовочных файлов (используется для установки) -set(TRGT_headers - ${CMAKE_CURRENT_SOURCE_DIR}/init.hpp) +set(TRGT_headers ${CMAKE_CURRENT_SOURCE_DIR}/init.hpp) # Функция для создания цели, результатом которой будет сборка библиотеки add_common_library(TARGET ${TRGT} SOURCES ${TRGT_sources}) @@ -438,30 +442,22 @@ target_include_directories(${TRGT} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS}) # Цель, используемая только для установки # заголовочных файлов без компиляции проекта -add_custom_target( - ${TRGT}-install-headers - COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=headers -P - "${CMAKE_BINARY_DIR}/cmake_install.cmake") +add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P + "${CMAKE_BINARY_DIR}/cmake_install.cmake") # Установка статической библиотеки -install(TARGETS ${TRGT}_static - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) # Установка динамической библиотеки if(BUILD_SHARED_LIBS) - install(TARGETS ${TRGT}_shared - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() # Установка заголовочных файлов -install( - FILES ${TRGT}_headers - COMPONENT headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT}) +install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT}) # Установка файла для pkg-config -install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) ---- @@ -498,105 +494,107 @@ int32_t cmlib_example_init(int32_t i = 0) } ---- - - -ПИШУ ЗДЕСЬ!!! - - - === Базовое приложение Проект с базовым приложением реализован на основе <>. Исходные тексты содержат комментарии, объясняющие назначение используемых функций. -Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-application[здесь] +Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-app[здесь] или сделать его копию командой: [source,sh] ---- -git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-application +git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-app ---- В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, нужно добавить: +[source,cmake] +---- +# Boost +set(Boost_USE_STATIC_LIBS ON) +set(Boost_USE_MULTITHREADED OFF) +set(Boost_USE_STATIC_RUNTIME ON) +find_package(Boost 1.55.0 REQUIRED COMPONENTS headers) +# Автоматически генерируемый заголовочный файл +cmlib_config_hpp_generate() +# Приложение +add_subdirectory(src/cmlib-example) +# Документация +add_subdirectory(cmake/doc) +# Создание вспомогательных символических ссылок +add_dependencies(cmlib-example create_auxilary_symlinks) +---- - - - - - - -В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла -`CMakeLists.txt` в подкаталоге `src/cmex`: +В подкаталоге `src/cmlib-example` нужно создать файл `CMakeLists.txt`: [source,cmake] ---- -add_subdirectory(src/cmex) +# Название основной цели и имя библиотеки в текущем каталоге +set(TRGT cmlib-example) + +# Список файлов исходных текстов +set(TRGT_sources ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) + +# Функция для создания цели, результатом которой будет сборка приложения +add_executable(${TRGT} ${TRGT_sources}) +common_target_properties(${TRGT}) + +# Добавление к пути поиска заголовочных файлов +target_include_directories(${TRGT} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS}) + +# Имя целевого каталога и выходного файла для цели +set_target_properties(${TRGT} + PROPERTIES + OUTPUT_NAME ${TRGT} + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR} + ) + +# Правила для установки +install(TARGETS ${TRGT} COMPONENT MAIN RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) ---- -В каталоге `cmex/src/cmex` нужно создать файл `main.cpp`: +и файл `main.cpp`: [source,cpp] ---- #include "compiler_features.hpp" -#include "cmlib_config.hpp" +#include "cmlib_private_config.hpp" #include +#include -#include "cmex.hpp" +int32_t nsum(int32_t i = 0) +{ + int32_t s = 0; + for ( auto r : boost::counting_range( 1, i ) ) + { + s += r; + } + return s; +} -int main(int argc, char **argv) { - std::cout << CMEX_COMPILER_VERSION_MAJOR << std::endl; // Значение из compiler_features.hpp - std::cout << BUILD_TYPE << std::endl; // Значение из cmlib_config.hpp - std::cout << CMEX_VERSION_STR << std::endl; // Значение из cmlib_config.hpp - std::cout << cmex_init(4) << std::endl; // Функция из внутренней библиотеки - return 0; +int main(int argc, char* argv[]) +{ + // Значение из compiler_features.hpp + std::cout << CMLIB_EXAMPLE_APP_COMPILER_VERSION_MAJOR << std::endl; + // Значение из cmlib_private_config.hpp + std::cout << CMLIB_BUILD_TYPE << std::endl; + // Значение из cmlib_private_config.hpp + std::cout << CMLIB_BUILD_DATE << std::endl; + + auto s = nsum( argc ); + std::cout << s << std::endl; + + return ( s ); } ---- -и файл `CMakeLists.txt`: - -[source,cmake] ----- -# Название основной цели в текущем каталоге -set(current_target cmex_app) - -# Список файлов исходных текстов -set(current_target_sources - ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp - ) - -# Цель для создания исполняемого файла -add_executable(${current_target} ${current_target_sources}) -common_target_properties(${current_target}) - -# Зависимость от библиотеки из текущего проекта -add_dependencies(${current_target} cmex) - -# Добавление внутреннего каталога src/libcmex к списку путей для поиска заголовочных файлов -target_include_directories(${current_target} PUBLIC - $) - -# Имя выходного файла для цели (параметр OUTPUT_NAME) -set_target_properties(${current_target} - PROPERTIES - OUTPUT_NAME cmex - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR} - ) - -# Путь поиска библиотек внутри проекта -link_directories(${CMAKE_INSTALL_LIBDIR}) - -# Сначала внутренние статические библиотеки -target_link_libraries(${current_target} cmex_static) - -# Правила для установки -install(TARGETS ${current_target} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) ----- +ПИШУ ЗДЕСЬ!!! == Подключение внешнего проекта