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

Простой синтаксис include

# можно вынести общие настройки для группы проектов, # например свои функции, в один общий файл include(../common.pri) # можно разбить проект на части, и каждую # часть вести в своем каталоге include(subsystem1/subsystem1.pri) include(subsystem2/subsystem2.pri) # можно прописать настройки по подключению своих # статических библиотек в специальном месте, # и подключать их к проекту одной строкой include(d:/projects/libs/my_library.pri)

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

# можно вынести общие настройки для группы проектов,

# например свои функции, в один общий файл

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:

Использование _PRO_FILE_PWD_

# 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($${_PRO_FILE_PWD_}/common.pri)

 

Условный include

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

Условный синтаксис include

!include(lib1.pri) { # обработка ошибки, например включение заменяющего файла include(lib2.pri) }

 

1

2

3

4

5

6

 

!include(lib1.pri) {

  # обработка ошибки, например включение заменяющего файла

  include(lib2.pri)

}

 

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

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

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.pri

A = 1

B = 2

 

 

# файл project.pro

 

defineReplace(testInclude) {

  include(include.pri)

  export(A)

  return(0)

}

 

$$testInclude()

message($$A)  # 1

message($$B)  # пусто...

 

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

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

 

# файл include.pri

A = 10

 

 

# файл project.pro

 

include(include.pri, prefix)

message($$prefix.A) # 10

 

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