Все проекты находятся здесь
https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial1. Создаем (если их еще нет) репозитории модулей
Это те компоненты, которые будут везде использоваться. Содержат исходные коды, тесты, примеры и т.д. Имеют зависимости между собой.
Как правило, модули не собираются сами по себе. Сборка и разработка модулей происходит в рамках комплекса.
Я создал module-1 и module-2.
https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/module-1https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/module-22. Создаем комплекс
Это окружение, в котором осуществлюяется сборка и разработка модулей. Таких окружений (комплексов) может быть много - для сборки тестов, для сборки одного приложения, для сборки нескольких других и т.п., с разными особенностями сборки, CI и др.
Я создал complex-1 и complex-2.
https://gitlab.com/ssoft-sandbox/prog.org.ru/qmake-tutorial/complex-1https://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