diff --git a/wiki/Prog/Development/CMake управление проектом.adoc b/wiki/Prog/Development/CMake управление проектом.adoc index 90d817c..cc697dc 100644 --- a/wiki/Prog/Development/CMake управление проектом.adoc +++ b/wiki/Prog/Development/CMake управление проектом.adoc @@ -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 с поддержкой локализации основан +на проекте <> и библиотеке +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} + 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 $) + +# Компоновка с библиотеками из внешнего проекта +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 $) + +# Компоновка с библиотеками из внешнего проекта +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 -#include -#include +#include -#include "cmex.hpp" +#include +#include -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`. После сохранения переводов проект нужно diff --git a/wiki/Prog/Development/Программные проект и иерархия каталогов.adoc b/wiki/Prog/Development/Программный проект и иерархия каталогов.adoc similarity index 100% rename from wiki/Prog/Development/Программные проект и иерархия каталогов.adoc rename to wiki/Prog/Development/Программный проект и иерархия каталогов.adoc