qmake: переменные для указания исходных файлов

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

Большая часть этих переменных отображается в интерфейсе Qt Creator в сайдбаре Projects.

Как минимум в SOURCES, HEADERS и OTHER_FILES допустимы маски (wildcards, *.cpp и т.п.), остальные переменные не проверял. Qt Creator, кстати, покажет список найденный файлов, а не маску.

Все относительные пути — относительные относительно PWD, т.е. файла, содержащего переменные. Все переменные могут содержать как абсолютные, так и относительные пути.

Во избежание ненужных проблем лучше вообще не используйте пробелы в именах файлов! Да, можно использовать двойные кавычки, но выстрелить может где угодно. Так что лучше избегать ненужной головной боли.

HEADERS

Заголовочные файлы проекта (*.h). Заголовочные файлы не компилируются сами по себе, но для них вызывается moc. Также для них генерируются зависимости в Makefile, так что если некий заголовочный файл изменится, то будут перекомпилированы все файлы, его включающие.

SOURCES

Файлы, компилируемые с/с++ компилятором (*.c, *.cpp, *.cxx и т.п.). Естественно, список не включает в себя автоматически генерируемые файлы от moc, uic и т.п.

Замечу, что для SOURCES moc не вызывается, и это создает проблемы в том случае, если захочется объявить класс, порожденный от QObject и, скажем, объявляющий свои слоты и сигналы. Но эта проблема решается — с помощью следующего задокументированного хака.

Пусть у вас есть файл myfile.cpp, в котором вы хотите объявить класс, порожденный от QObject, и хотите, чтобы этот файл moc обработал. Для этого в конец файла myfile.cpp добавьте строку:

Что происходит? Когда qmake сканирует .cpp файл, он генерирует зависимости от файлов, которые тот включает (схема там сложнее, но для текущего обсуждения подойдет). Соответственно, в нашем случае генерируется зависимость от myfile.cpp от myfile.moc, а также создается цель (target) в Makefile для myfile.moc (специальная обработка этого хака, как я понял). Эта цель вызывает moc для myfile.cpp, в результате чего файл myfile.moc и будет создан. Представляет он собой C++ файл. Далее с ним (в отличие от обработки заголовочных файлов, для которых создаются *.cpp файлы, добавляемые в проект) ничего не происходит, потому что не нужно. Ведь файл myfile.moc уже включен в .cpp файл, так он и становится частью исходников. А включается в конец, потому что myfile.moc использует объявления из myfile.cpp.

FORMS

*.ui файлы. Для них будет вызван uic.

RESOURCES

*.qrc файлы (файлы ресурсов Qt). Для них будет вызван rcc.

Отмечу, что файлы, включенные в ресурс, будут прописаны как зависимости для файла ресурсов в Makefile. Соответственно, если любой такой файл изменится, qrc файл будет перекомпилирован, и проект будет корректно пересобран при вызове make или qmake. Нюанс: чтобы зависимость сформировалась, файл, включенный в ресурс, должен существовать во время работы qmake.

OTHER_FILES

Любые файлы, ассоциированные с проектом (например, readme.txt). Переменная имеет смысл только при использовании Qt Creator, поскольку тот показывает содержимое OTHER_FILES в папке Other Files. Тот же readme.txt можно редактировать прямо в Qt Creator, что может быть удобно.

Файлы в OTHER_FILES зависимостей не создают.

VPATH

Список каталогов, в которых будет произведен поиск файлов из SOURCES, HEADERS и вроде и других переменных, не найденных в PWD. Такие себе дополнительные PWD, получается. Честное слово, не знаю, к чему это можно приспособить. Не тестировал.

А сделали, видимо, по аналогии с переменной VPATH в make, есть там такая.

DEF_FILE

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

RC_FILE

Тоже только для Windows, и тоже, к сожалению, только один файл ресурсов Windows (расширение .rc). В отличие от предыдущей переменной, с этой вам придется столкнуться, поскольку вы наверняка захотите к своему приложению иконку приделать. К сожалению, тут полно подводных камней, о которых я еще расскажу позднее.

RC_ICONS

Появилась переменная с версии Qt 5.0.2. На Windows она содержит список иконок, которые будут добавлены в автоматически созданный файл ресурсов Windows и приликованы к проекту. Работать будет только в том случае, есть переменная RC_FILE пустая.

TRANSLATIONS

Список *.ts файлов — текстовых файлов переводов программы, не бинарных. Что делать с бинарными (*.qm) файлами — решать программисту; как вариант, их можно в ресурс запихнуть. Технически, *.ts файлы никак не участвуют в построении проекта, но семантически это редактируемые пользователем исходники. Файлов может быть несколько, т.к. языков может быть несколько.

Используется эта переменная не qmake, а lupdate. Эта утилита сканирует все файлы в HEADERS, SOURCES и FORMS на предмет переводимых строк, и записывает их во все файлы, перечисленные в TRANSLATIONS.

Цикл: qmake

  7 comments for “qmake: переменные для указания исходных файлов

  1. Роман
    18.09.2013 at 18:07

    Здравствуйте. Поделитесь опытом как правильно работать с переводами программы в qmake. Не могу понять как добавить qm файлы в ресурсы программы после их генерации в qmake. Спасибо.

    • mgsxx
      18.09.2013 at 18:19

      .qm файлы добавляются в ресурс (.qrc файл) точно также, как и любые другие файлы, так что я, если честно, не понял вопроса. Никаких нюансов нет совершенно.

      О том, как использовать в программе .qm файлы, читайте в справке по классу QTranslator. Обратите внимание, .qm файлы вовсе не обязательно добавлять в ресурс, просто так зачастую удобнее.

      • Роман
        18.09.2013 at 18:31

        Возможно я ошибаюсь, но если я добавлю qm файл в ресурс то при чистой компиляции мы должны получить ошибку отсутствия файла ресурса. Я же пытаюсь найти способ как 1) При компиляции автоматически обновлять переводы, создавая файлы qm. 2)Быстренько подсунуть эти файлы в ресурс и уже тогда продолжать компиляцию программы.

        • mgsxx
          18.09.2013 at 18:41

          Теперь вопрос понятен)

          Для себя я нарисовал заплатку с помощью QMAKE_EXTRA_COMPILERS, которая вызывает lrelease при изменившихся .ts файлах. Автоматический вызов lupdate я для debug не делал, т.к. lupdate, естественно, не молниеносно работает, но для release такой вызов прикрутил.

          Как будет достаточно свободного времени — приведу скрипт в порядок и выложу в блог.

          • Роман
            18.09.2013 at 18:55

            Спасибо, буду очень признателен.
            Офтоп. Не плохо было бы добавить запоминание имени и e-mail, а то постоянно приходится вводить по новому.

          • mgsxx
            18.09.2013 at 19:13

            Я так понимаю, имя и e-mail — это для тех, кому не хочется регистрироваться. Если зарегистрироваться и войти (этот факт, естественно, запоминается), то при написании комментариев имя с e-mail запрашиваться не будут.

  2. Сергей Никонов
    09.04.2014 at 17:34

    Увы, для Qt 5.2.1 + MinGW 4.8.0 (Windows) маски в переменных SOURCES и HEADERS недопустимы. Qt Creator их понимает нормально, а вот qmake даёт осечку; вероятно, дело где-то в связке qmake + MinGW. В Линуксе всё нормально. Лечится функцией $$files().

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