Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Автоматическая сборка зависимостей

Автор: QCasper 6.12.2009, 18:01

Есть один проект - статическая библиотека. Есть второй проект - исполняемый модуль. Модуль линкуется с библиотекой. Нужно, чтобы при запуске сборки модуля автоматически выполнялась сборка всех библиотек, от которых он зависит. На уровне файлов проекта естественно. То есть без всяких левых скриптов (это читай вручную опять же).

Автор: Litkevich Yuriy 6.12.2009, 18:23

Смотри QMAKE_EXTRA_TARGETS http://www.doc.crossplatform.ru/qt/4.4.3/qmake-environment-reference.html

Автор: QCasper 6.12.2009, 18:38

Цитата(Litkevich Yuriy @ 6.12.2009, 18:23) *
Смотри QMAKE_EXTRA_TARGETS http://www.doc.crossplatform.ru/qt/4.4.3/qmake-environment-reference.html


Там я смотрел, но у меня ничего не вышло. Буду очень принзнателен за готовый рабочий пример.

Автор: Litkevich Yuriy 6.12.2009, 18:46

Цитата(QCasper @ 6.12.2009, 21:38) *
Буду очень принзнателен за готовый рабочий пример.
Ну на пустом месте больше чем в асистенте я вряд ли напишу, приведи пример, своих зависимостей.

Автор: QCasper 6.12.2009, 20:46

Цитата(Litkevich Yuriy @ 6.12.2009, 18:46) *
Ну на пустом месте больше чем в асистенте я вряд ли напишу, приведи пример, своих зависимостей.


Вот файл проекта приложения. Статическая библиотека - rsync.

!include( ../../../config.pri ) {
    error(Run configure before building)
}

TEMPLATE = app
TARGET = rsynctester
DESTDIR = $$BINDIR/tests/$$TARGET
OBJECTS_DIR = $$TMPDIR/tests/$$TARGET
MOC_DIR = $$TMPDIR/tests/$$TARGET
RCC_DIR = $$TMPDIR/tests/$$TARGET
LIBS += -L"$$LIBDIR" -lrsync
INCLUDEPATH += $$INCLUDEDIR
CONFIG += $$BUILD_CONFIGURATION
depends = rsync

QMAKE_EXTRA_TARGETS += rsync

exists(stable.h) {
    CONFIG += precompile_header
    PRECOMPILED_HEADER = stable.h
}

# Input
HEADERS += widget.h
SOURCES += main.cpp widget.cpp


Автор: QCasper 7.12.2009, 14:09

Неужели никто не сталкивался? Или все пересобирают, зависимое от статкилибы приложение, вручную при каждом изменении этой либы? Скиньте, пожайлуста, свой файл проекта, кому удалось таки автоматизировать.

Автор: frg10 7.12.2009, 14:39

Я для gcc под Linux делал так:

unix:MYLIBSDIR = ../../lib/unix-x86

LIBS  += -L$$MYLIBSDIR

unix {
    PRE_TARGETDEPS += $$MYLIBSDIR/libVisualization.a \
                      $$MYLIBSDIR/libTransforms.a
}


Плохо, конечно, что все либы приходится руками прописывать, но зато работает :)

Автор: Kagami 7.12.2009, 14:50

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

Автор: QCasper 7.12.2009, 14:57

Это, как я понял, работает следующим образом. Если изменился сам файл либы (не исходники) до при команде make для приложения, последнее будет пересобрано. Это решает половину задачи. Вторая половина подразумевает, что команда make для приложения инициирует также и сборку всех либ, от которых оно зависит.

Но, в любом случае, за это тоже спасибо :)

Цитата(Kagami @ 7.12.2009, 14:50) *
Я в Qt Creator работаю. Он позволяет галочками отметить проекты, от которых зависит текущий. Они в свою очередь могут зависеть от других проектов и т.д.


Попробуйте следующее. Измените статиклибу, от которой зависит приложение и нажмите кнопку запуска. В результате у Вас либа пересоберётся, а приложение нет. В итоге изменений в запущенном приложении Вы не увидите. По крайней мере у меня не получилось. Галочку поставил. Qt Creator 1.3.0.

Впрочем, вкупе с вариантом, предложенным frg10, работать должно. Что само по себе уже неплохо.
Теперь бы вариант, работающий без Qt Creator, было бы совсем здорово :)

Автор: Kagami 7.12.2009, 15:06

Цитата(QCasper @ 7.12.2009, 14:57) *
Попробуйте следующее. Измените статиклибу, от которой зависит приложение и нажмите кнопку запуска. В результате у Вас либа пересоберётся, а приложение нет. В итоге изменений в запущенном приложении Вы не увидите. По крайней мере у меня не получилось. Галочку поставил. Qt Creator 1.3.0.

Для этого можно воспользоваться пунктом меню "Пересобрать все" :)

Автор: QCasper 7.12.2009, 15:09

Цитата(Kagami @ 7.12.2009, 15:06) *
Для этого можно воспользоваться пунктом меню "Пересобрать все" :)


Ну это конечно вариант, когда "всё" пересобирается за пару секунд. Но вот по 10 минут после каждого изменения ждать мне почему-то не хочется :)

Автор: frg10 7.12.2009, 15:38

Цитата(QCasper @ 7.12.2009, 14:57) *
Это, как я понял, работает следующим образом. Если изменился сам файл либы (не исходники) до при команде make для приложения, последнее будет пересобрано. Это решает половину задачи. Вторая половина подразумевает, что команда make для приложения инициирует также и сборку всех либ, от которых оно зависит.


У меня проект тоже состоит из нескольких либ и приложения. И собирается ровно так, как хочется: собираются сначала все либы, потом приложение. Если только одна либа изменилась, то пересобирается только она и приложение.
Структура проекта такая (названия подпроектов изменены):
source
    \lib1
    \lib2
    \mainapp


В каталоге source лежит главный проектный файл source.pro. Содержимое примерно такое:
TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS = lib1 \
    lib2 \
    mainapp_bin

mainapp_bin.subdir = mainapp
mainapp_bin.depends = lib1 lib2


ordered говорит qmake-у чтобы проекты собирались именно в таком порядке.
mainapp_bin.depends = lib1 lib2 - говорит что главное приложение зависит от либ

Проекты либ не очень интересны, поэтому их не привожу.
А проект главного приложения вот такой (несущественные части пропущены):
TARGET = mainapp
TEMPLATE = app
...
SOURCES += main.cpp
...
unix:MYLIBSDIR = ../../lib/unix-x86

LIBS  += -L$$MYLIBSDIR

unix {
    PRE_TARGETDEPS += $$MYLIBSDIR/libVisualization.a \
                      $$MYLIBSDIR/libTransforms.a
}
....
LIBS += -lVisualization \
        -lTransforms
....


Если открыть проект в QtCreator, то откроются все подпроекты. Ну и из консоли все нормально собирается.

Автор: QCasper 7.12.2009, 15:41

А, ну так вся фишка в "главном проектном файле". А если обойтись только проектом приложения и только проектом либ?

Автор: frg10 7.12.2009, 16:08

Цитата(QCasper @ 7.12.2009, 15:41) *
А, ну так вся фишка в "главном проектном файле". А если обойтись только проектом приложения и только проектом либ?

ИМХО, никак не обойтись: как make должен узнать, что ваши либы и приложение вообще как-то связаны? Если несколько проектов связаны, то их нужно объединять. Это sln файлы в VisualStudio и subdirs проекты в Qt.

Автор: QCasper 7.12.2009, 16:26

Цитата(frg10 @ 7.12.2009, 16:08) *
ИМХО, никак не обойтись: как make должен узнать, что ваши либы и приложение вообще как-то связаны? Если несколько проектов связаны, то их нужно объединять. Это sln файлы в VisualStudio и subdirs проекты в Qt.


Ну почему нет. Ведь может же в файле проекта (.pro) приложения быть инструкция, которая, в свою очередь, запишет инструкцию в Makefile о том, что нужно пойти туда-то и там собрать.
Вообще говоря, до последнего момента я думал, что механизм, описанный http://doc.trolltech.com/4.6/qmake-environment-reference.html#library-dependencies, это и реализует. Но, как выяснилось - нет. А что он реализует, я так и не понял. И, кстати, тоже хотел об этом спросить сведующих людей.

Автор: frg10 7.12.2009, 16:39

Цитата(QCasper @ 7.12.2009, 16:26) *
Ну почему нет. Ведь может же в файле проекта (.pro) приложения быть инструкция, которая, в свою очередь, запишет инструкцию в Makefile о том, что нужно пойти туда-то и там собрать.

Вообще, subdirs проект это и делает. А по поводу "запишет инструкцию в Makefile" есть абзац о том, как добавлять в мэйкфайл свои таржеты: http://doc.trolltech.com/4.6/qmake-environment-reference.html#customizing-makefile-output. Но только там все руками делать надо, а в случае subdirs qmake сам все сделает.

Автор: QCasper 7.12.2009, 16:48

Цитата(frg10 @ 7.12.2009, 16:39) *
А по поводу "запишет инструкцию в Makefile" есть абзац о том, как добавлять в мэйкфайл свои таржеты: http://doc.trolltech.com/4.6/qmake-environment-reference.html#customizing-makefile-output.


Вот, Вы уже третий, кто меня туда посылает :) Но у меня никак не получается, на основе лежащей там информации, решить эту задачу. Поэтому я и стал просить готовые файлы проектов.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)