This commit is contained in:
Andrei Astafev 2020-04-11 16:19:35 +03:00
parent fff4e996d2
commit 5bf5a20624

View File

@ -383,7 +383,7 @@ cpack
== Примеры библиотек и приложений == Примеры библиотек и приложений
[[base-lib-project]]
=== Базовая библиотека === Базовая библиотека
Проект с базовой библиотекой реализован на основе <<base-project,базового проекта>>. Проект с базовой библиотекой реализован на основе <<base-project,базового проекта>>.
@ -494,6 +494,8 @@ int32_t cmlib_example_init(int32_t i = 0)
} }
---- ----
[[base-app-project]]
=== Базовое приложение === Базовое приложение
Проект с базовым приложением реализован на основе <<base-project,базового проекта>>. Проект с базовым приложением реализован на основе <<base-project,базового проекта>>.
@ -594,132 +596,93 @@ int main(int argc, char* argv[])
---- ----
ПИШУ ЗДЕСЬ!!! === Подключение внешнего проекта
Проект, использующий для сборки внешний проект, реализован на основе проектов
<<base-lib-project,базовой библиотеки>> и <<base-app-project,базового приложения>>.
Исходные тексты содержат комментарии, объясняющие назначение используемых функций.
Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-app-ext[здесь]
или сделать его копию командой:
== Подключение внешнего проекта [source,sh]
В каталоге `cmex/thirdparty` нужно создать каталог `cmext` с проектом,
состоящим из файла `cmext.hpp`:
[source,c]
---- ----
#ifndef CMEXT_CMEXT_HPP_ git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-app-ext
#define CMEXT_CMEXT_HPP_
#include <stdint.h>
int32_t cmext_init(int32_t i);
#endif
---- ----
файла `cmext.cpp`: Для подключения проекта базовой библиотеки нужно выполнить:
[source,c] [source,sh]
---- ----
#include "cmext.hpp" git submodule add https://git.246060.ru/f1x1t/cmlib-example-library thirdparty/cmlib-example-library
git submodule update --init --recursive
int32_t cmext_init(int32_t i = 0) {
return i;
}
----
и файла `CMakeLists.txt`:
[source,cmake]
----
cmake_minimum_required(VERSION 3.3)
project(cmext)
include(GNUInstallDirs)
add_library(cmext cmext.cpp)
install(TARGETS cmext ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES cmext.hpp COMPONENT headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME})
----
В файле `cmex/CMakeLists.txt` нужно подключить стандартный модуль
`ExternalProject` и описать правила для его загрузки, настройки,
компиляции и установки для сопряжения с текущим проектом:
[source,cmake]
----
# Подключение внешних проектов
include(ExternalProject)
ExternalProject_Add(cmext
EXCLUDE_FROM_ALL TRUE
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/cmext
INSTALL_DIR ${CMAKE_BINARY_DIR}
DOWNLOAD_COMMAND ""
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libcmext.a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=Release
)
---- ----
Вызовы этих функций нужно сделать до функций `add_subdirectories`, чтобы Вызовы этих функций нужно сделать до функций `add_subdirectories`, чтобы
в подключенных подкаталогах можно было использовать цель `cmext` для в подключенных подкаталогах можно было использовать цель `cmext` для
определения зависимостей. определения зависимостей.
В файле `cmex/src/cmex/CMakeLists.txt` нужно подключить внешний проект В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, перед функциями
`cmext`: `add_subdirectories` нужно добавить:
[source,cmake]
----
# Подключение внешних проектов
include(ExternalProject)
ExternalProject_Add(ext-lib
EXCLUDE_FROM_ALL TRUE
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/cmlib-example-library
INSTALL_DIR ${CMAKE_BINARY_DIR}
DOWNLOAD_COMMAND ""
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libcmlib-example.a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=Release
)
----
В результате будет создана цель `ext-lib`, являющаяся результатом сборки
подключённой библиотеки. Все функции `ExternalProject_Add` необходимо располагать
перед функциям `add_subdirectories`, чтобы в указанных подкаталогах можно было
использовать добавленные цели для определения зависимостей.
В файле `src/cmlib-example/CMakeLists.txt` нужно подключить внешний проект `ext-lib`:
[source,cmake] [source,cmake]
---- ----
# Зависимость от библиотеки из внешнего проекта проекта # Зависимость от библиотеки из внешнего проекта проекта
add_dependencies(${current_target} cmext) add_dependencies(${TRGT} ext-lib)
# Добавление каталога, в который устанавливаются заголовочные файлы
# от внешнего проекта, к списку путей для поиска
target_include_directories(${TRGT} PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>)
# Компоновка с библиотекой из внешнего проекта
target_link_libraries(${TRGT} ${CMAKE_BINARY_DIR}/lib/libcmlib-example.a)
---- ----
[source,cmake]
----
# Добавление каталога, в который устанавливаются заголовочные файлы от внешнего
# проекта cmext, к списку путей для поиска заголовочных файлов
target_include_directories(${current_target} PUBLIC
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include/cmext>)
----
[source,cmake] Для проверки работоспособности в файле `src/cmlib-example/main.cpp` нужно
---- вызвать функцию `cmlib_example_init` из библиотеки, предоставляемой внешним
# Библиотека из внешнего проекта cmext
target_link_libraries(${current_target} ${CMAKE_BINARY_DIR}/lib/libcmext.a)
----
Для проверки работоспособности в файле `cmex/src/cmex/main.cpp` нужно
вызвать функцию `cmext_init` из библиотеки, предоставляемой внешним
проектом. Например, можно заменить его содержимое на: проектом. Например, можно заменить его содержимое на:
[source,cpp] [source,cpp]
---- ----
#include "compiler_features.hpp" #include <cmlib-example/init.hpp>
#include "cmlib_config.hpp"
#include <iostream> #include <iostream>
#include <cmext/cmext.hpp>
#include "cmex.hpp" int main(int argc, char* argv[])
QTextStream& qStdOut()
{ {
static QTextStream ts(stdout); auto s = cmlib_example_init( argc );
return ts; std::cout << s << std::endl;
}
int main(int argc, char **argv) { return ( s );
// Значение из compiler_features.hpp
qStdOut() << QObject::tr("Compiler version: ") << CMEX_COMPILER_VERSION_MAJOR << endl;
// Значение из cmlib_config.hpp
qStdOut() << QObject::tr("Project version: ") << CMEX_VERSION_STR << endl;
// Значение из cmlib_config.hpp
qStdOut() << QObject::tr("Build type: ") << BUILD_TYPE << endl;
// Функция из внутренней библиотеки
qStdOut() << QObject::tr("libcmex function call: ") << cmex_init(4) << endl;
// Функция из внешней библиотеки
qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl;
return 0;
} }
---- ----
ПИШУ ЗДЕСЬ!!!
== Qt5 == Qt5
Для поиска необходимых компонентов Qt5 нужно в файл `cmex/CMakeLists.txt` Для поиска необходимых компонентов Qt5 нужно в файл `cmex/CMakeLists.txt`
@ -742,11 +705,11 @@ find_package(Qt5 COMPONENTS Core Network Gui Widgets DBus Concurrent Sql REQUIRE
[source,cmake] [source,cmake]
---- ----
# Qt5 # Qt5
qt_translation(TARGET ${current_target} TS_DIR ${CMAKE_SOURCE_DIR}/l10n LANGUAGES ru_RU) qt_translation(TARGET ${TRGT} TS_DIR ${CMAKE_SOURCE_DIR}/l10n LANGUAGES ru_RU)
target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
target_compile_options(${current_target} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}") target_compile_options(${TRGT} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
target_link_libraries(${current_target} Qt5::Core) target_link_libraries(${TRGT} Qt5::Core)
---- ----
Для проверки работоспособности подключения Qt5 файл Для проверки работоспособности подключения Qt5 файл
@ -925,12 +888,12 @@ int main(int argc, char **argv) {
[source,cmake] [source,cmake]
---- ----
set(current_target_sources set(TRGT_sources
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/my_main_window.cpp ${CMAKE_CURRENT_SOURCE_DIR}/my_main_window.cpp
) )
set(current_target_uis set(TRGT_uis
${CMAKE_CURRENT_SOURCE_DIR}/my_main_window.ui ${CMAKE_CURRENT_SOURCE_DIR}/my_main_window.ui
) )
---- ----
@ -938,7 +901,7 @@ set(current_target_uis
[source,cmake] [source,cmake]
---- ----
# Цель для создания исполняемого файла # Цель для создания исполняемого файла
add_executable(${current_target} ${current_target_sources} ${current_target_uis}) add_executable(${TRGT} ${TRGT_sources} ${TRGT_uis})
---- ----
и добавить строки для подключения графических библиотек Qt5 и и добавить строки для подключения графических библиотек Qt5 и
@ -946,10 +909,10 @@ add_executable(${current_target} ${current_target_sources} ${current_target_uis}
[source,cmake] [source,cmake]
---- ----
target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Gui_INCLUDE_DIRS}) target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Gui_INCLUDE_DIRS})
target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Widgets_INCLUDE_DIRS}) target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Widgets_INCLUDE_DIRS})
target_link_libraries(${current_target} Qt5::Gui) target_link_libraries(${TRGT} Qt5::Gui)
target_link_libraries(${current_target} Qt5::Widgets) target_link_libraries(${TRGT} Qt5::Widgets)
---- ----
Во время сборки проекта в файл переводов `cmex/l10n/cmex_app_ru_RU.ts` Во время сборки проекта в файл переводов `cmex/l10n/cmex_app_ru_RU.ts`