This commit is contained in:
Andrei Astafev 2020-04-14 00:57:48 +03:00
parent c22fcdfdd8
commit c89fed2c07
2 changed files with 136 additions and 55 deletions

View File

@ -428,13 +428,13 @@ add_dependencies(cmlib-example create_auxilary_symlinks)
set(TRGT cmlib-example)
# Список файлов исходных текстов
set(TRGT_sources ${CMAKE_CURRENT_SOURCE_DIR}/init.cpp)
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/init.cpp)
# Список заголовочных файлов (используется для установки)
set(TRGT_headers ${CMAKE_CURRENT_SOURCE_DIR}/init.hpp)
set(TRGT_hpp ${CMAKE_CURRENT_SOURCE_DIR}/init.hpp)
# Функция для создания цели, результатом которой будет сборка библиотеки
add_common_library(TARGET ${TRGT} SOURCES ${TRGT_sources})
add_common_library(${TRGT} SOURCES ${TRGT_cpp})
common_target_properties(${TRGT})
# Добавление к пути поиска заголовочных файлов
@ -454,7 +454,7 @@ if(BUILD_SHARED_LIBS)
endif()
# Установка заголовочных файлов
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT})
install(FILES ${TRGT_hpp} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TRGT})
# Установка файла для pkg-config
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
@ -539,10 +539,10 @@ add_dependencies(cmlib-example create_auxilary_symlinks)
set(TRGT cmlib-example)
# Список файлов исходных текстов
set(TRGT_sources ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
# Функция для создания цели, результатом которой будет сборка приложения
add_executable(${TRGT} ${TRGT_sources})
add_executable(${TRGT} ${TRGT_cpp})
common_target_properties(${TRGT})
# Добавление к пути поиска заголовочных файлов
@ -617,10 +617,6 @@ git submodule add https://git.246060.ru/f1x1t/cmlib-example-library thirdparty/c
git submodule update --init --recursive
----
Вызовы этих функций нужно сделать до функций `add_subdirectories`, чтобы
в подключенных подкаталогах можно было использовать цель `cmext` для
определения зависимостей.
В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, перед функциями
`add_subdirectories` нужно добавить:
@ -689,77 +685,162 @@ int main(int argc, char* argv[])
=== Qt5
==== Консольное приложение и локализация
Пример консольного приложения на Qt5 с поддержкой локализации основан
на проекте <<base-app-project,базового приложения>> и библиотеке
https://git.246060.ru/f1x1t/myxlib[MyXLib].
Исходные тексты содержат комментарии, объясняющие назначение используемых функций.
Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-app-qt5-con[здесь]
или сделать его копию командой:
[source,sh]
----
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-app-qt5-con
----
Для подключения проекта библиотеки https://git.246060.ru/f1x1t/myxlib[MyXLib] нужно выполнить:
[source,sh]
----
git submodule add https://git.246060.ru/f1x1t/myxlib thirdparty/myxlib
git submodule update --init --recursive
----
В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, перед функциями
`add_subdirectories` нужно добавить:
[source,cmake]
----
# Подключение внешних проектов
include(ExternalProject)
ExternalProject_Add(
myxlib
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/myxlib
INSTALL_DIR ${CMAKE_BINARY_DIR}
DOWNLOAD_COMMAND ""
CONFIGURE_COMMAND
${CMAKE_COMMAND} -"G${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Debug
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} <SOURCE_DIR>
BUILD_COMMAND true)
----
В результате будет создана цель `myxlib`, являющаяся результатом сборки
подключённой библиотеки. Все функции `ExternalProject_Add` необходимо
располагать перед функциям `add_subdirectories`, чтобы в указанных подкаталогах
можно было использовать добавленные цели для определения зависимостей.
В файле `src/cmlib-example/CMakeLists.txt` после создания цели `${TRGT}` нужно
подключить внешний проект `myxlib`:
[source,cmake]
----
# Зависимость от библиотеки из внешнего проекта проекта
add_dependencies(${TRGT} myxlib)
# Добавление каталога, в который устанавливаются заголовочные файлы
# от внешнего проекта, к списку путей для поиска
target_include_directories(${TRGT} PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>)
# Компоновка с библиотеками из внешнего проекта
target_link_libraries(${TRGT} myx-qt myx-filesystem myx-base)
----
Для поиска необходимых компонентов Qt5 нужно в файле `CMakeLists.txt`,
находящемся в корневом каталоге проект, перед вызовом функции
находящемся в корневом каталоге проекта, перед вызовом функции
`cmlib_config_hpp_generate()` добавить строку:
[source,cmake]
----
find_package(Qt5 COMPONENTS Core Network Gui Widgets Concurrent Sql REQUIRED)
# Используемые компоненты Qt5
find_package(Qt5 COMPONENTS Core REQUIRED)
----
Библиотека CMLib автоматически подключает вызов препроцессора `moc` и
компилятора ресурсов `rcc`, если цель использует модуль `Core`, и
вызывает компилятор файлов описания интерфейса, если цель использует
модуль `Widgets`.
== Консольное приложение
В файл `cmex/src/cmex/CMakeLists.txt` добавить строки:
В файл `src/cmlib-example/CMakeLists.txt` перед вызовом функции
`add_executable` добавить строки:
[source,cmake]
----
# Qt5
qt_translation(TARGET ${TRGT} TS_DIR ${CMAKE_SOURCE_DIR}/l10n LANGUAGES ru_RU)
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
target_compile_options(${TRGT} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
# Правила для создания файла ресурсов с вложенными файлами переводов
qt5_translation(
TRGT_qrc
OUTPUT_DIR ${CMAKE_SOURCE_DIR}/l10n BASE_NAME ${TRGT}
SOURCES ${TRGT_cpp} LANGUAGES ru_RU)
target_link_libraries(${TRGT} Qt5::Core)
# Путь поиска библиотек созданных при компиляции проекта,
# включая библиотеки из подключённых внешних проектов, например MyXLib
# Функция link_directories обязательно должна находиться перед
# функцией add_executable, иначе компоновка не может быть выполнена
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
----
В вызове `add_executable` подключить использование файла ресурсов
с переводами:
[source,cmake]
----
add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc})
----
После чего добавить подключение Qt5 и MyXLib:
[source,cmake]
----
# Qt5: подключение заголовочных файлов
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
# Qt5: подключение библиотек
target_link_libraries(${TRGT} Qt5::Core)
# Добавление к пути поиска заголовочных файлов
target_include_directories(${TRGT} SYSTEM PUBLIC ${Boost_INCLUDE_DIRS})
# Зависимость от библиотеки из внешнего проекта проекта
add_dependencies(${TRGT} myxlib)
# Добавление каталога, в который устанавливаются заголовочные файлы
# от внешнего проекта, к списку путей для поиска
target_include_directories(${TRGT} PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>)
# Компоновка с библиотеками из внешнего проекта
target_link_libraries(${TRGT} myx-qt myx-filesystem myx-base)
----
Для проверки работоспособности подключения Qt5 файл
`cmex/src/cmex/main.cpp` нужно заменить на:
`src/cmlib-example/main.cpp` нужно заменить на:
[source,cpp]
----
#include "compiler_features.hpp"
#include "cmlib_config.hpp"
#include "cmlib_private_config.hpp"
#include <QtCore>
#include <iostream>
#include <cmext/cmext.hpp>
#include <myx/qt/translators.hpp>
#include "cmex.hpp"
#include <QCoreApplication>
#include <QDebug>
QTextStream& qStdOut()
namespace MQ = myx::qt;
int main( int argc, char** argv )
{
static QTextStream ts(stdout);
return ts;
}
QCoreApplication app( argc, argv );
MQ::QTranslatorsList tl;
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
QTranslator translator;
qDebug() << QObject::tr( "No" );
MQ::append_translators( tl, QStringLiteral( CMLIB_PROJECT_NAME ) );
qDebug() << QObject::tr( "Yes" );
if (translator.load(QLocale(), "cmex_app", QLatin1String("_"), QLatin1String(":/qm")))
{
app.installTranslator(&translator);
}
// Значение из 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;
return( 0 );
}
----
После сборки проекта в каталоге `cmex/l10n` появится файл
`cmex_app_ru_RU.ts`, в котором нужно отредактировать переводы с помощью
программы `linguist`. После сохранения переводов проект нужно