qmake позволяет включать в файл проекта другие файлы в синтаксисе .pro файла с помощью команды include. Работает она практически аналогично директиве #include препроцессора C/C++: содержимое указанного файла вставляется в месте написания include.
# можно вынести общие настройки для группы проектов, # например свои функции, в один общий файл include(../common.pri) # можно разбить проект на части, и каждую # часть вести в своем каталоге include(subsystem1/subsystem1.pri) include(subsystem2/subsystem2.pri) # можно прописать настройки по подключению своих # статических библиотек в специальном месте, # и подключать их к проекту одной строкой include(d:/projects/libs/my_library.pri)
Расширение .pri для включаемых файлов необязательно, это просто устоявшаяся традиция для обозначения подключаемых файлов, которые не являются самостоятельными файлами проектов.
Путь к включаемому файлу должен быть или абсолютным, или относительным. Относительно чего? Текущего обрабатываемого qmake’ом файла, т.е. относительно того файла, в котором написан include. Это обычная для qmake интерпретация относительных путей. В связи с таким поведением qmake возникает вопрос: как быть, если проект разбит на подкаталоги, которые тоже могут быть разбиты на подкаталоги, каждый такой каталог обслуживается своим .pri файлом, и нужно в них во всех включать какой-нибудь common.pri, который лежит рядом .pro файлом? Относительные пути использовать неудобно из-за разных уровней вложенности каталогов, абсолютный путь – это тоже, мягко говоря, некрасиво.
Для решения такого рода вопросов существует встроенная переменная _PRO_FILE_PWD_, которая содержит путь к каталогу самого первого файла, который начал обрабатывать qmake, т.е. к каталогу .pro файла. С ее помощью всегда можно вычислить абсолютный путь к файлам вроде common.pri:
# part/subpart/subsubpart/subsubpart.pri # вместо include(../../../common.pri) include($${_PRO_FILE_PWD_}/common.pri)
1 2 3 4 5 |
# part/subpart/subsubpart/subsubpart.pri # вместо include(../../../common.pri) |
Условный include
Если включаемый файл не будет найден, qmake не завершиться с ошибкой, но выдаст предупреждение (warning). Если нужно, такие ситуации можно обрабатывать самостоятельно, используя include в условной форме:
!include(lib1.pri) { # обработка ошибки, например включение заменяющего файла include(lib2.pri) }
1 2 3 4 5 6 |
include в функциях пользователя
К сожалению, include в qmake работает уж слишком как в препроцессоре C, что сильно ограничивает применение include в функциях пользователя.
# файл include.pri A = 1 B = 2 # файл project.pro defineReplace(testInclude) { include(include.pri) export(A) return(0) } $$testInclude() message($$A) # 1 message($$B) # пусто...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Так что если не знать заранее, какие переменные включаются, чтобы их сэкспортить наружу функции, include в функциях бесполезен. Я уже молчу от вариантах, когда внутри включаемого файла, например, функция пользователя определяется…
include с префиксом
Для истинных любителей поизвращаться у функции include есть второй параметр, который задает произвольный префикс для всего, что включается:
# файл include.pri A = 10 # файл project.pro include(include.pri, prefix) message($$prefix.A) # 10
1 2 3 4 5 6 7 8 9 10 |
Лично я пока не нашел применений для этой фичи