Как предотвратить создание qmake дополнительной папки moc в этом сценарии сборки «вне исходного кода»?

(Извините, я не могу придумать лучшего способа объяснить, кроме как включить следующую деталь)

Предварительно построенная структура:

F:\
└ Project\
  └ Project.pro
  └ ProjectSettings.pri
  └ Source\
    └ Source.pro
    └ My_Library\
      └ My_Library.pro
      └ library.cpp
      └ ...

Содержание «Project.pro»:

TEMPLATE = subdirs
SUBDIRS = Source

Содержание «Source.pro»:

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS +=  My_Library

Содержание "My_Library.pro":

include(../../ProjectSettings.pri)

TEMPLATE = lib
SOURCES += library.cpp

Содержание "ProjectSettings.pri"

TARGET = $$basename(_PRO_FILE_PWD_)

Debug:buildDir = "Debug"
Release:buildDir = "Release"

DESTDIR =     $$PWD/$$buildDir/bin
OBJECTS_DIR = $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/obj
MOC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/moc
RCC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/rcc
UI_DIR =      $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/gui

Структура после сборки:

F:\
└ Project\
  └ Project.pro
  └ ProjectSettings.pri
  └ Source\
    └ Source.pro
    └ My_Library\
      └ My_Library.pro
      └ library.cpp
  └ Debug\
    └ bin\
      └ libMy_Library.a
    └ My_Library\
      └ moc\
      └ obj\
        └ library.o
  └ My_Library\   <------ WTF
    └ moc\
  └ Release\
    └ bin\
      └ libMy_Library.a
    └ My_Library\
      └ moc\
      └ obj\
        └ library.o

Проблема

Идея

  • запустить qmake -recursive в папке Project
  • который строит все указанные подпроекты
  • выдает кучу хорошо организованных промежуточных файлов
  • и помещает все двоичные файлы для подпроектов в одну папку
  • все они разделены в зависимости от области отладки или выпуска.

Кажется, это работает блестяще, за исключением дополнительной папки для каждого «подпроекта» в папке Project, каждая из которых содержит папку moc, которую я выделил «WTF» * выше.

Вопросы

  1. Какая (комбинация) инструкций в файлах .pro создает папки "WTF"?
  2. Для чего будет использоваться папка "WTF"? (имея в виду, что области отладки и выпуска указывают собственный moc)
  3. Есть ли способ предотвратить создание папок "WTF"?

У меня пока нет исходных файлов, которые заставили бы MOC выводить файлы moc, поэтому все папки moc на данный момент пусты.

* "WTF" = "Что за папка"


person Samuel Harmer    schedule 06.10.2011    source источник


Ответы (1)


1. Папки создаются до запуска областей отладки и выпуска. qmake создает один основной файл make (Makefile) и, если есть источник для сборки: два дочерних файла make (Makefile.Debug и Makefile.Release). Области заданы для дочерних элементов, но не для родителя, поэтому qmake решает, что он должен создать папки, которых не существует.

2. Насколько я могу судить, он ни для чего не используется.

3. Добавляя определение buildDir, которое уже существует (в данном случае Source), qmake не заботится о создании дополнительных промежуточных папок. Кроме того, следует изменить тест области (см. здесь и здесь для объяснения причин). Это сводится к следующему ProjectSettings.pri:

PROJECT_NAME = $$basename(PWD)
TARGET = $$basename(_PRO_FILE_PWD_)

buildDir = Source
CONFIG( debug, debug|release ) {
    buildDir = "Debug"
} else {
    buildDir = "Release"
}

DESTDIR =     $$PWD/$$buildDir/bin
OBJECTS_DIR = $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/obj
MOC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/moc
RCC_DIR =     $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/rcc
UI_DIR =      $$PWD/$$buildDir/$$basename(_PRO_FILE_PWD_)/gui

Не совсем уверен, почему это работает, но, похоже, это решает проблему.

person Samuel Harmer    schedule 07.10.2011