Немного о последовательности сборки

Переменные настройки среды , начинающиеся на QT_ или QMAKE_ (к примеру QT_BUILD_TREE, QMAKE_LIBDIR_QT и т.д. ) на первый взляд спрятаны где-то далеко.

Установка переменных сборки

На самом деле самые первые переменные сборки  буквально зашиты прямо внутри  бинарного файла qmake.exe

Это очень своеобразный подход , но наверное у разработчиков Qt были на это причины... Будем называть их переменные 0 уровня. 

Далее как продолжается установка переменных . Когда в Qt Creator открывается проект, то Qt Creator уже получает переменные 1 уровня (это мы так будем называть) из файла .qmake.cash , который может лежать на более высоких чем сам проект каталогах файловой системы.

qmake.cash генерируется утилитой config.exe, которая сама входит в состав исходников QtSources в ветке tools, то есть ее код можно смотреть и ее можно пересобрать заново. Но не об этом речь.

Некоторая часть переменных импортируется из spec файлов , например win32-msvc2010 или win32-g  , которые лежат в каталоге mkspecs

Вот очень простое содержание .qmake.cash :

QMAKE_QT_VERSION_OVERRIDE = 4
OBJECTS_DIR     = tmp/obj/release_shared
MOC_DIR         = tmp/moc/release_shared
RCC_DIR         = tmp/rcc/release_shared
sql-plugins     = sqlite
styles          = windows plastique cleanlooks windowsxp windowsvista motif cde
TMPPATH            = $$quote($$(INCLUDE))
QMAKE_INCDIR_POST  = $$split(TMPPATH,";")
TMPPATH            = $$quote($$(LIB))
QMAKE_LIBDIR_POST  = $$split(TMPPATH,";")
CONFIG          = minimal-config small-config medium-config large-config full-config release incremental msvc_mp create_prl link_prl depend_includepath QTDIR_build
QT_BUILD_PARTS  = libs tools examples demos docs translations
QMAKESPEC       = C:/QtSDK1.2.1/QtSources/4.8.1/mkspecs/win32-g  
ARCH            = windows
QT_BUILD_TREE   = C:/QtSDK1.2.1/QtSources/4.8.1
QT_SOURCE_TREE  = C:/QtSDK1.2.1/QtSources/4.8.1
QMAKE_MOC       = $$QT_BUILD_TREE/bin/moc.exe
QMAKE_UIC       = $$QT_BUILD_TREE/bin/uic.exe
QMAKE_UIC3      = $$QT_BUILD_TREE/bin/uic3.exe
QMAKE_RCC       = $$QT_BUILD_TREE/bin/rcc.exe
QMAKE_DUMPCPP   = $$QT_BUILD_TREE/bin/dumpcpp.exe
QMAKE_INCDIR_QT = $$QT_BUILD_TREE/include
QMAKE_LIBDIR_QT = $$QT_BUILD_TREE/lib

Как видно QT_BUILD_TREE это есть каталог куда будут собираться проект(ы),  QT_SOURCE_TREE это где лежат исходники проектов.

Далее все ниже стоящие дополнительные настройки делаются непосредственно в файлах .pro и .pri ваших проектов и их подпроектов. 

Вот тут как раз трудно разобраться , но мы попробуем... 

Как всегда все начинается сначала... То есть если мы открываем файл проекта всех исходников src.pro , то и читаем (сверху вниз) все инструкции файла src.pro

При сборке есть закономерности: например зависимость прокетов реализована специальным образом так, что первым будет собираться bootstrap (начальная загрузка), потом moc.pro , rcc.pro , uic.pro , corelib ,.. 

Как это так получается? src.pro реализует на самом деле набор проектов раскиданных по каталогам , src.pro имеет тип subdirs , то есть : TEMPLATE = subdirs ОК , но еще в начале src.pro мы видим конструкцию :

 !wince*:!symbian-abld:!symbian-sbsv2:include(tools/tools.pro) 

А это значит , что на самом деле сначала будет выполняться сборка проекта tools/tools.pro в буквальном смысле. То есть смотрим сначала проект tools/tools.pro и видим, что он тоже в свою очередь имеет тип subdirs

И его последовательность сборки задается в переменной TOOLS_SUBDIRS: TOOLS_SUBDIRS = src_tools_bootstrap src_tools_moc src_tools_rcc бла бла бла и в конце SUBDIRS = $$TOOLS_SUBDIRS $$SUBDIRS то есть TOOLS_SUBDIRS будет собираться ранее SUBDIRS! 

И тут есть важный для понимания момент есть переменные TOOLS_SUBDIRS и SRC_SUBDIRS , а есть непосредственно директива SUBDIRS, которую в результате мы и должны сформировать. 

Так вот получился SUBDIRS = src_tools_bootstrap src_tools_moc src_tools_rcc src_tools_uic src_corelib . 

Вот и все , на самом деле все становится очевидным.... Именно поэтому мы имеем такую последовательность сборки проектов :

Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/tools/bootstrap/bootstrap.pro
Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/tools/moc/moc.pro
Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/tools/rcc/rcc.pro
Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/tools/uic/uic.pro
Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/corelib/corelib.pro

если мы подключим network к сборке , то увидим ниже (именно в этом месте)
Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/network/network.pro

если мы подключим gui к сборке , то увидим ниже (именно в этом месте)
Reading C:/QtSDK1.2.1/QtSources/4.8.1/src/gui/gui.pro

src.pro
   /tools/tools.pro
      /bootstrap/bootstrap.pro // начальный зарузчик, инициализация SRAM и т.д.
      /moc/moc.pro
      /rcc/rcc.pro
      /uic/uic.pro
   /corelib/corelib.pro
      include(../qbase.pri) - это важные по-сути глобальные переменные для ниже стоящих проектов
      include(arch/arch.pri) - зависимости от архитектуры процессоров
      include(concurrent/concurrent.pri)
      include(global/global.pri)
      include(thread/thread.pri)
      include(tools/tools.pri)
      include(io/io.pri)
      include(plugin/plugin.pri)
      include(kernel/kernel.pri) // QObject
      include(codecs/codecs.pri)
      include(statemachine/statemachine.pri)
      include(xml/xml.pri)

Это основа, начало для понимания всего последующего происходящего. 

Кстати как изменить каталог сборки для Qt  библиотек? В .qmake.cash изменить QMAKE_LIBDIR_QT ? 

Это полезно для чистоты эксперимента , когда собираем библиотеки из исходников , начинаем по минимуму с QtCore и т.д.

Замечания:

Если делать только  Build Project , то проект не будеи  пересобираться полностью как в случае Rebuild Project. 

 Примечание: QT_BUILD_TREE и QT_SOURCE_TREE используются только при сборке из исходников. В обычных проектах по логике вы не должны их увидеть.