Russian Qt Forum
Ноябрь 22, 2024, 11:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qmake сборка с подпроектами  (Прочитано 10133 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Октябрь 29, 2019, 10:48 »

Здравствуйте. Пытаюсь разобраться как правильно собирать проект состоящий из подпроектов с помощью qmake (другие системы сборки пока не интересуют). Песочница: https://github.com/kambala-decapitator/qt-test-subprojects

Тестовый пример состоит из следующих частей:
  • (внешняя) header-only библиотека без поставляемого .pro файла
  • (внутренняя) core библиотека (пока статическая): зависит от header-only
  • два приложения app1 и app2 (для примера сделал консольное и Qt GUI): зависят от header-only и core
  • в дальнейшем еще хочу сделать, чтобы app2 и app3 (тесты для core) динамически линковались с core, а app1 оставить со статической линковкой

Кое-как удалось всё это реализовать, успешно работает на macOS и Windows msvc+mingw. Но не уверен, что всё сделано по-хорошему Улыбающийся Воспользовался подходом из https://www.toptal.com/qt/vital-guide-qmake, но там по-моему упущены какие-то детали реализации, потому что копипастой не завелось.

В app1.pro я оставил то, что мне сгенерировал Креатор при добавлении core как зависимости и переписанное в читабельном варианте (там еще старое название — lib вместо core). В итоге я это так и перенес в core.pri: как выяснилось, PRE_TARGETDEPS надо, чтобы изменения в core заставляли пересобирать приложения.

Еще остались вопросы:
  • как правильно заставить header-only отображаться в дереве проекта? Сейчас сделано через хак, но его небольшой минус — генерируется makefile. Еще нашел вариант добавить в OTHER_FILES, но тогда смотрится не очень Улыбающийся
  • хочу, чтобы app1 и app2 были независимыми проектами, т.е. чтоб не надо было открывать test-subprojects.pro и собирать оба проекта, когда интересует только один. Для этого надо добавить отдельные .pro тоже с TEMPLATE = subdirs?

Ну и в общем покритикуйте, расскажите/покажите на примерах как лучше (можно ссылками). Все, что я находил в виде статей, описывало только простейшие случаи. Смотрел в исходники Креатора — там слишком много посторонних деталей, да и все библиотеки динамически линкуются.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Октябрь 29, 2019, 15:46 »

Могу предложить собственный способ организации проектов
https://gitlab.com/ssoft-tool/qmake-features
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Октябрь 30, 2019, 10:49 »

спасибо. если честно, выглядит громоздко Улыбающийся но для больших систем наверняка удобно.

а есть готовые примеры использования?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Октябрь 30, 2019, 12:48 »

Сейчас сделаю небольшой туториал.
Если принцип понять - проект моментально формируется.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Октябрь 30, 2019, 15:51 »

Все проекты находятся здесь
https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial

1. Создаем (если их еще нет) репозитории модулей
Это те компоненты, которые будут везде использоваться. Содержат исходные коды, тесты, примеры и т.д. Имеют зависимости между собой.
Как правило, модули не собираются сами по себе. Сборка и разработка модулей происходит в рамках комплекса.

Я создал module-1 и module-2.

https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/module-1
https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/module-2

2. Создаем комплекс
Это окружение, в котором осуществлюяется сборка и разработка модулей. Таких окружений (комплексов) может быть много - для сборки тестов, для сборки одного приложения, для сборки нескольких других и т.п., с разными особенностями сборки, CI и др.

Я создал complex-1 и complex-2.

https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/complex-1
https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/complex-2

Склонировал на ПК

Код:
git clone git@gitlab.com:ssoft-sandbox/prog.org.ru/qmake-tutorial/complex-1.git

3. Добавляем qmake-features в комплекс

Код:
git submodule add --name qmake-features git@gitlab.com:ssoft-tool/qmake-features.git project/qmake/features

4. Добавляем модули в комплекс

Если модули уже существуют, то следующие действия по добавлению Readme.md выполнять не нужно.

Заходим в каждый из модулей и добавляем Readme.md

Код:
cd my_modules/module-1
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

cd my_modules/module-2
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

Иначе git будет ругаться, потому что модули пустые, без веток и т.п., и подмодули корректно не добавятся).
Затем в директории комплекса добавляем подмодули

Код:
git submodule add --name module-1 git@gitlab.com:ssoft-sandbox/prog.org.ru/qmake-tutorial/module-1.git my_modules/module-1
git submodule add --name module-2 git@gitlab.com:ssoft-sandbox/prog.org.ru/qmake-tutorial/module-2.git my_modules/module-2

5. Проектные файлы модулей

5.1. Файлы библиотеки с сорцами

Файл проекта библиотеки с сорцами module-1-lib-1.pro

Код:
TEMPLATE = lib
HEADERS *= $${PWD}/../../src/lib-1/first_lib.h
SOURCES *= $${PWD}/../../src/lib-1/first_lib.cpp
OTHER_FILES *= $${PWD}/module-1-lib-1.prf

Файл зависимости module-1-lib-1.prf

Код:
LIBS *= -lmodule-1-lib-1

INCLUDEPATH *= \
    $${PWD}/../../include \

DEPENDPATH *= \
    $${PWD}/../../include \

QT *= core

DEPENDS *= \
    module-1-lib-2 \

Здесь указаны зависимости от QT и других модулей DEPENDS, а также, где находятся INCLUDEPATH этого модуля module-1-lib-1

5.2. Файлы библиотеки хидер онли

Файл проекта библиотеки module-1-lib-2.pro

Код:
TEMPLATE = subdirs
HEADERS *= $${PWD}/../../src/lib-2/second_lib.h
OTHER_FILES *= $${PWD}/module-1-lib-2.prf

Файл зависимости module-1-lib-1.prf

Код:
INCLUDEPATH *= \
    $${PWD}/../../include \

DEPENDPATH *= \
    $${PWD}/../../include \

QT *= core gui

DEPENDS *=

5.3 Файлы приложения

Проектный файл my_app.pro

Код:
TEMPLATE = app
SOURCES *= $${PWD}/../../src/my_app/main.cpp
DEPENDS *= module-1-lib-1

Указана прямая зависимость module-1-lib-1, которая автоматически устанавливает и косвенную зависимость от module-1-lib-2.

6. Формируем проектные файлы комплекса

Файл проекта my_complex.pro

Код:
TEMPLATE = subdirs
CONFIG *= ordered

isEqual( QT_MAJOR_VERSION, 4 ) : \
    SUBDIRS *= \
        $${PWD}/project/qmake/features/pro/.qmake.qt4.pro \

SUBDIRS *= \
    $${PWD}/project/qmake/features/pro/.depends.cache.pro \
    $${PWD}/project/qmake/features/pro/features.pro \

SUBDIRS *= \
    $${PWD}/project/qmake/my_modules.pro \

OTHER_FILES *= \
    $${PWD}/.qmake.conf \
    $$files( $${PWD}/project/qmake/features/*.prf ) \

Файл конфигурации .qmake.conf

Код:
# Общая конфигурация комплекса
################################################################################
CONFIG *= \
    embed_manifest_exe \
    exceptions \
    largefile \
    precompile_header \
    rtti \
    silent \
    stl \
    thread \
    warn_on \

!win32-msvc* {
    CONFIG -= \
        debug_and_release \
        debug_and_release_target \
}

# Особенности (features) сборки компонентов комплекса
QMAKEFEATURES = $${PWD}/project/qmake/features

CONFIG *= \
    complex_paths \     # единое место сборки всех модулей
    module_depends \    # автоматическое разрешение зависимостей между компонентами

Мне удобнее в дереве иметь группировку модулей, поэтому, как правило, использую промежуточный файл типа
$${PWD}/project/qmake/my_modules.pro

Содержимое my_modules.pro

Код:
TEMPLATE = subdirs
CONFIG *= ordered

SUBDIRS *= \
    $${PWD}/../../my_modules/module-1/project/qmake/module-1-lib-1.pro \
    $${PWD}/../../my_modules/module-1/project/qmake/module-1-lib-2.pro \
    $${PWD}/../../my_modules/module-2/project/qmake/my_app.pro \


Всё Подмигивающий

Собираем проект complex-1.


В дальнейшем проект можно выгрузить, либо сразу с подмодулями

Код:
git clone git@gitlab.com:ssoft-sandbox/prog.org.ru/qmake-tutorial/complex-1.git --recurse-submodules

либо сначала склонировать, а затем инициализировать и обновить подмодули.

Код:
git clone git@gitlab.com:ssoft-sandbox/prog.org.ru/qmake-tutorial/complex-1.git
cd complex-1
git submodule init
git submodule update
« Последнее редактирование: Октябрь 31, 2019, 09:51 от ssoft » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Ноябрь 04, 2019, 23:01 »

большое спасибо! не сразу, но понял структуру модулей и комплексов Улыбающийся

разрезать на полноценные гит подмодули пока не собираюсь (небольшой проект), это можно и на уровне папок организовать. а в целом где-то примерно так же и буду делать, только наверное с некоторыми упрощениями.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #6 : Январь 14, 2020, 17:20 »

Qt уже официально даже приватные свои классы переводит на cmake. Так что выбор qmake для меня как то очень странное решение.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Январь 14, 2020, 17:33 »

это был не выбор, а больше для того, чтобы разобраться с такими базовыми вещами. Основными системами сборки буду использовать qbs и cmake, посмотрю какая из них получится проще/понятнее.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #8 : Январь 15, 2020, 12:41 »

это был не выбор, а больше для того, чтобы разобраться с такими базовыми вещами. Основными системами сборки буду использовать qbs и cmake, посмотрю какая из них получится проще/понятнее.

Мое предположение что проще наверное будет qbs но вот то что он опять же как и qmake будет заточен больше на Qt проекты сильно усложняет его использование в других IDE и вообще использование.
Я вот уже давно во всех как личных проектах так и рабочих использую cmake. И главное что могу не использовать это ... Qt Creator. Да и по фичам все таки он далеко впереди. Хоть и сложнее чем qmake.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Январь 15, 2020, 15:36 »

ну, с qbs из командной строки несложно работать. плюс он, как и cmake, может генерировать проекты для других систем сборки/IDE.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.