|
|||||||
Сборка 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 Для первой задачи, в *.pro-файле необходимо прописать специальные qmake-переменные с именами:
По сути, в этих переменных перечислены директории, в которых будут складываться промежуточные артефакты сборки. Лучше всего формировать эти пути с использованием переменной 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-каталог, либо класть их в каталог исходников проекта (в корень проекта или распихивать по подкаталогам проекта, в которых расположены соответствующие исходники).
Что содержит переменная 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 |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|