Как предотвратить создание дополнительной папкой "moc" в qmake в этом сценарии сборки "вне источника"?
(Извинения, я не могу придумать лучшего способа объяснения, кроме как путем включения следующих деталей)
Предварительно построить структуру:
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"*.
Вопросы
- Какая (комбинация) инструкций в файлах.pro генерирует папки "WTF"?
- Для чего будет использоваться папка "WTF"? (учитывая, что области Debug и Release указывают свои собственные moc)
- Есть ли способ предотвратить создание папок "WTF"?
У меня нет никаких исходных файлов, которые заставили бы MOC выводить файлы moc, поэтому все папки moc на данный момент пусты.
* "WTF" = "Что за папка"
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
Не совсем уверен, почему это работает, но, похоже, решить проблему.