MyTetra Share
Делитесь знаниями!
Сборка Qt-проекта. В чем отличие qmake переменных PWD и OUT_PWD в *.pro-файлах?
Время создания: 28.11.2024 09:49
Автор: Xintrea
Текстовые метки: qt, qmake, make, Makefile, pro, проект, файл, сборка, теневая, фоновая, shadow, build, PWD, OUT_PWD, директория, настройка, написание, переменная
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Инсталляция Qt и сборка проектов
Запись: xintrea/mytetra_syncro/master/base/1732776584jmj7yyzvuo/text.html на raw.github.com

При написании *.pro файла надо точно понимать, что представляют собой используемые переменные и как идет процесс сборки. Но помимо этого надо знать принцип, по которому работают все известные системы сборки, не только qmake.



Принцип следующий: генерация артефактов сборки и, возможно, конечных файлов, происходит в той директории, в которой запущен бинарник сборочной системы (qmake, cmake). При этом исходники берутся из какой-либо другой директории, например, в случае Qt, из той в которой лежит *.pro файл и ее поддиректориях.


(Следует понимать, что этот принцип используется по-умолчанию, и может быть изменен через дополнительные опции запуска сборки или через системные переменные).



Используя этот принцип, можно адекватно писать файлы проектов в Qt. Обычно, при написании *.pro файлов решается несколько задач:



  1. (Обязательная задача) Компиляция промежуточных объектников и подготовка различных файлов ресурсов;
  2. (Обязательная задача) Компиляция итогового бинарника или библиотеки;
  3. (Опционально) Формирование каталога, в котором будут сложены итоговый бинарник, библиотеки, настроечные файлы и т.д.



Далеее каждая задача расписана подробно.



Задача 1


Для первой задачи, в *.pro-файле необходимо прописать специальные qmake-переменные с именами:



  • MOC_DIR - директория, куда будут складываться промежуточные moc_* файлы,
  • OBJECTS_DIR - директория, куда будут складываться объектники,
  • RCC_DIR - директория, куда будут складываться файлы ресурсов,
  • UI_DIR (или UI_SOURCES_DIR + UI_HEADERS_DIR) - директория, куда будут складываться UI-файлы, которые генерирует компилятор пользовательских интерфейсов uic.



По сути, в этих переменных перечислены директории, в которых будут складываться промежуточные артефакты сборки. Лучше всего формировать эти пути с использованием переменной OUT_PWD.



Из документации: переменная OUT_PWD задает полный путь к директории, куда qmake поместит сгенерированный Makefile.

То, что забыли написать в документации: по-умолчанию, переменная OUT_PWD содержит путь к директории, где произошел запуск утилиты qmake.



Если вспомнить принцип, написанный в начале этой статьи, то оказывается, что OUT_PWD как раз и надо использовать для генерации промежуточных артефактов сборки в каталоге запуска qmake. Выглядеть это может примерно вот так:



# Настройка мест, куда файлы складываются в процессе сборки

# Переменная BUILD_DIR - это просто пользовательская переменная

BUILD_DIR = $${OUT_PWD}/build

CONFIG(debug, debug|release) {

OBJECTS_DIR = $${BUILD_DIR}/debug/obj


} else {

OBJECTS_DIR = $${BUILD_DIR}/release/obj

}

MOC_DIR = $${BUILD_DIR}/moc

RCC_DIR = $${BUILD_DIR}/rcc

UI_DIR = $${BUILD_DIR}/ui



Этот проект будет генерировать следующую файловую структуру в директории, где запущен qmake:



├── build

│   ├── moc

│   │   ├── moc_file_01.cpp

│   │   └── moc_file_02.cpp

│   ├── debug

│   │   └── obj

│   │   ├── file_01.o

│   │   └── file_02.o

│   └── release

│   └── obj

│   ├── file_01.o

│   └── file_02.o

│   ├── rcc

│   └── ui

├── Makefile

├── Makefile.Debug

└── Makefile.Release



Задача 2


Вторая задача состоит в генерации итоговых бинарников и библиотек. Разные программисты по-разному устраивают свои проекты, но есть два основных подхода: либо складывать итоговые файлы куда-нибудь в build-каталог, либо класть их в каталог исходников проекта (в корень проекта или распихивать по подкаталогам проекта, в которых расположены соответствующие исходники).



  • Если итоговые файлы необходимо поместить в build-каталог, то для формирования пути надо использовать, как и в первой задаче, переменную OUT_PWD.
  • Если итоговые файлы размещаются где-то в каталоге/подкаталогах исходников, то для формирования пути используется переменная PWD.



Что содержит переменная PWD?



Согласно документации, в PWD содержится путь к каталогу, в котором находится обрабатываемый в данный момент *.pro , *.pri или *.prf файл. Другими словами: переменная PWD внутри файла проекта (pro), файла подпроекта (pri), файла профиля (prf) будет содержать полный путь к самому файлу. При этом совершенно без разницы, что файл "подключен" в другом файле. Переменная PWD будет содержать именно путь к файлу, в котором она находится.



Если принято решение, что результат сборки будет размещаться в- или относительно каталога исходников (а pro/pri файлы и пользовательские prf файлы как раз лежат в исходниках), то для формирования пути следует использовать переменную PWD. Директория, где будет размещаться результат сборки, указывается в переменной DESTDIR:



# Создание директории с пакетом модулей

# PACKAGE_DIR - это обычная пользовательская переменная

PACKAGE_DIR = $${PWD}/package


DESTDIR = $${PACKAGE_DIR}/modules



Задача 3


Третья задача опциональная. Она заключается либо в раскладывании заданных файлов по своим местам в Linux-системе, либо в формировании локального каталога, в котором собираются необходимые файлы проекта. В любом случае, это те действия, которые происходят при выполнении команды make install.


Если необходимо сформировать локальный каталог в каталоге проекта (т. е. по сути в каком-то каталоге исходников), то для формирования пути, как и в предыдущей задаче, следует использовать переменную PWD.


Пример:



# PACKAGE_DIR - это обычная пользовательская переменная

PACKAGE_DIR = $${PWD}/package


# Копирование неких XML-файлов в директорию пакета

settings.files += settings/messages.xml \

settings/network.xml

settings.path = $${PACKAGE_DIR}/settings/default # Директория, куда копируются файлы

INSTALLS += settings




Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования