This commit is contained in:
Andrei Astafev 2020-04-11 14:57:13 +03:00
parent c41683d9e2
commit d931b5aaea
2 changed files with 103 additions and 105 deletions

@ -1 +1 @@
Subproject commit c651ba0ef064734b6457684c780f8c863f0956bf Subproject commit ce6b18660a933855dbe996fc5b5d3d0ac1c25223

View File

@ -248,21 +248,22 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CMake project example")
set(CPACK_DEBIAN_PACKAGE_SECTION "misc") set(CPACK_DEBIAN_PACKAGE_SECTION "misc")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_SOURCE_IGNORE_FILES set(CPACK_SOURCE_IGNORE_FILES
${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}"
.git/ "/\\\\.git/"
.git$ "/\\\\.gitlab-ci/"
.gitlab-ci/ "^${CMAKE_SOURCE_DIR}/.?build.?/"
_output/ "^${CMAKE_SOURCE_DIR}/.?output.?/"
files/lib "^${CMAKE_SOURCE_DIR}/files/lib"
files/log "^${CMAKE_SOURCE_DIR}/files/log"
.clang-tidy "\\\\.clang-tidy$"
.cmake-format "\\\\.cmake-format$"
.gitignore "\\\\.gitignore$"
.gitmodules "\\\\.gitattributes$"
.gitlab-ci.yml "\\\\.gitmodules$"
CMakeLists.txt.user.* "\\\\.gitlab-ci.yml"
~$ "CMakeLists.txt.user.*"
\\\\..*\\\\.swp$) "~$"
"\\\\.swp$")
---- ----
Произведённые изменения можно зафиксировать: Произведённые изменения можно зафиксировать:
@ -354,23 +355,28 @@ make uninstall
---- ----
== Архивирование проекта == Архивирование проекта и создание пакетов
Стандартный модуль `CPack` предназначен для архивирования исходных Стандартный модуль `CPack` предназначен для архивирования исходных
текстов проекта и создания пакетов для установки в целевую систему. текстов проекта и создания пакетов для установки в целевую систему.
Необходимые переменные устанавливаются в файле `cmake/etc/Variables.cmake` Необходимые переменные устанавливаются в файле `cmake/etc/Variables.cmake`
<<variables-cmake,см. выше>>. <<variables-cmake,см. выше>>.
По умолчанию цель для упаковки исходных текстов называется `package_source`. Устанавливаемые файлы делятся на две группы `MAIN` и `DEV` с помощью
В библиотеке CMLib определены значения основных параметров, параметра `COMPONENT` функции `install`. В группу `MAIN` необходимо
а также дополнительная цель `dist`. помещать файлы для установки на целевую систему (исполняемые файлы,
файлы настроек, файлы данных, разделяемые библиотеки), а в группу `DEV` ---
для установки на систему для разработки (заголовочные файлы, статические
библиотеки).
Для создания бинарных пакетов нужно выполнить в каталоге сборки команду `cpack`. По умолчанию цель для упаковки исходных текстов называется `package_source`.
Бинарные пакеты создаются программой `cpack`. Пример:
[source,sh] [source,sh]
---- ----
cd _build/debug cd _build/debug
make dist make
make package_source
cpack cpack
---- ----
@ -422,12 +428,10 @@ add_dependencies(cmlib-example create_auxilary_symlinks)
set(TRGT cmlib-example) set(TRGT cmlib-example)
# Список файлов исходных текстов # Список файлов исходных текстов
set(TRGT_sources set(TRGT_sources ${CMAKE_CURRENT_SOURCE_DIR}/init.cpp)
${CMAKE_CURRENT_SOURCE_DIR}/init.cpp)
# Список заголовочных файлов (используется для установки) # Список заголовочных файлов (используется для установки)
set(TRGT_headers set(TRGT_headers ${CMAKE_CURRENT_SOURCE_DIR}/init.hpp)
${CMAKE_CURRENT_SOURCE_DIR}/init.hpp)
# Функция для создания цели, результатом которой будет сборка библиотеки # Функция для создания цели, результатом которой будет сборка библиотеки
add_common_library(TARGET ${TRGT} SOURCES ${TRGT_sources}) add_common_library(TARGET ${TRGT} SOURCES ${TRGT_sources})
@ -438,30 +442,22 @@ target_include_directories(${TRGT} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})
# Цель, используемая только для установки # Цель, используемая только для установки
# заголовочных файлов без компиляции проекта # заголовочных файлов без компиляции проекта
add_custom_target( add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
${TRGT}-install-headers
COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=headers -P
"${CMAKE_BINARY_DIR}/cmake_install.cmake") "${CMAKE_BINARY_DIR}/cmake_install.cmake")
# Установка статической библиотеки # Установка статической библиотеки
install(TARGETS ${TRGT}_static install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
# Установка динамической библиотеки # Установка динамической библиотеки
if(BUILD_SHARED_LIBS) if(BUILD_SHARED_LIBS)
install(TARGETS ${TRGT}_shared install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif() endif()
# Установка заголовочных файлов # Установка заголовочных файлов
install( install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT})
FILES ${TRGT}_headers
COMPONENT headers
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT})
# Установка файла для pkg-config # Установка файла для pkg-config
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
---- ----
@ -498,105 +494,107 @@ int32_t cmlib_example_init(int32_t i = 0)
} }
---- ----
ПИШУ ЗДЕСЬ!!!
=== Базовое приложение === Базовое приложение
Проект с базовым приложением реализован на основе <<base-project,базового проекта>>. Проект с базовым приложением реализован на основе <<base-project,базового проекта>>.
Исходные тексты содержат комментарии, объясняющие назначение используемых функций. Исходные тексты содержат комментарии, объясняющие назначение используемых функций.
Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-application[здесь] Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-app[здесь]
или сделать его копию командой: или сделать его копию командой:
[source,sh] [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`, находящийся в корневом каталоге проекта, нужно добавить: В файл `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)
----
В подкаталоге `src/cmlib-example` нужно создать файл `CMakeLists.txt`:
В файле `cmex/CMakeLists.txt` должна быть строка, включающая поиск файла
`CMakeLists.txt` в подкаталоге `src/cmex`:
[source,cmake] [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] [source,cpp]
---- ----
#include "compiler_features.hpp" #include "compiler_features.hpp"
#include "cmlib_config.hpp" #include "cmlib_private_config.hpp"
#include <iostream> #include <iostream>
#include <boost/range/counting_range.hpp>
#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) { 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 // Значение из compiler_features.hpp
std::cout << CMEX_VERSION_STR << std::endl; // Значение из cmlib_config.hpp std::cout << CMLIB_EXAMPLE_APP_COMPILER_VERSION_MAJOR << std::endl;
std::cout << cmex_init(4) << std::endl; // Функция из внутренней библиотеки // Значение из cmlib_private_config.hpp
return 0; 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
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/src/libcmex>)
# Имя выходного файла для цели (параметр 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})
----
ПИШУ ЗДЕСЬ!!!
== Подключение внешнего проекта == Подключение внешнего проекта