qmake: модульность с помощью include

qmake позволяет включать в файл проекта другие файлы в синтаксисе .pro файла с помощью команды include. Работает она практически аналогично директиве #include препроцессора C/C++: содержимое указанного файла вставляется в месте написания include.

Расширение .pri для включаемых файлов необязательно, это просто устоявшаяся традиция для обозначения подключаемых файлов, которые не являются самостоятельными файлами проектов.

Путь к включаемому файлу должен быть или абсолютным, или относительным. Относительно чего? Текущего обрабатываемого qmake’ом файла, т.е. относительно того файла, в котором написан include. Это обычная для qmake интерпретация относительных путей. В связи с таким поведением qmake возникает вопрос: как быть, если проект разбит на подкаталоги, которые тоже могут быть разбиты на подкаталоги, каждый такой каталог обслуживается своим .pri файлом, и нужно в них во всех включать какой-нибудь common.pri, который лежит рядом .pro файлом? Относительные пути использовать неудобно из-за разных уровней вложенности каталогов, абсолютный путь — это тоже, мягко говоря, некрасиво.

Для решения такого рода вопросов существует встроенная переменная _PRO_FILE_PWD_, которая содержит путь к каталогу самого первого файла, который начал обрабатывать qmake, т.е. к каталогу .pro файла. С ее помощью всегда можно вычислить абсолютный путь к файлам вроде common.pri:

Условный include

Если включаемый файл не будет найден, qmake не завершиться с ошибкой, но выдаст предупреждение (warning). Если нужно, такие ситуации можно обрабатывать самостоятельно, используя include в условной форме:

include в функциях пользователя

К сожалению, include в qmake работает уж слишком как в препроцессоре C, что сильно ограничивает применение include в функциях пользователя.

Так что если не знать заранее, какие переменные включаются, чтобы их сэкспортить наружу функции, include в функциях бесполезен. Я уже молчу от вариантах, когда внутри включаемого файла, например, функция пользователя определяется…

include с префиксом

Для истинных любителей поизвращаться у функции include есть второй параметр, который задает произвольный префикс для всего, что включается:

Лично я пока не нашел применений для этой фичи 😉

include и Qt Creator

Отображение исходников, разбитых на подкаталоги

Отображение исходников, разбитых на подкаталоги

Отображение исходников, разбитых на модули с помощью .pri файлов

Отображение исходников, разбитых на модули с помощью .pri файлов

По своей идеологии сайдбар Projects в Qt Creator показывает структуру проекта, а не файловую организацию исходников. В частности, заголовочные файлы показываются отдельно, исходники — отдельно. И это очень неудобно получается в том случае, если исходные файлы лежат в разных каталогах, т.к. разбиение исходников на каталоги делается, как правило, для разделения проекта на модули. В результате исходные файлы одного модуля оказываются в разных — и весьма друг от друга удаленных — местах.

«Вылечить» это неудобство можно, если использовать .pri файлы для подкаталогов модулей. Qt Creator полностью поддерживает такую идиому: и отображает правильно, и добавлять файлы в каталог модуля по контекстному меню умеет. Все, что нужно — это создать пустые .pri файлы в нужных каталогах и подключить их в файле проекта подобным образом:

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

Цикл: qmake

Добавить комментарий