Исходные файлы задаются списками в различных специально предназначенных для этого переменных, для каждого типа файлов — своя переменная.
Большая часть этих переменных отображается в интерфейсе 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
добавьте строку:
1 2 3 |
#include "myfile.moc" |
Что происходит? Когда 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. Не могу понять как добавить qm файлы в ресурсы программы после их генерации в qmake. Спасибо.
.qm файлы добавляются в ресурс (.qrc файл) точно также, как и любые другие файлы, так что я, если честно, не понял вопроса. Никаких нюансов нет совершенно.
О том, как использовать в программе .qm файлы, читайте в справке по классу QTranslator. Обратите внимание, .qm файлы вовсе не обязательно добавлять в ресурс, просто так зачастую удобнее.
Возможно я ошибаюсь, но если я добавлю qm файл в ресурс то при чистой компиляции мы должны получить ошибку отсутствия файла ресурса. Я же пытаюсь найти способ как 1) При компиляции автоматически обновлять переводы, создавая файлы qm. 2)Быстренько подсунуть эти файлы в ресурс и уже тогда продолжать компиляцию программы.
Теперь вопрос понятен)
Для себя я нарисовал заплатку с помощью QMAKE_EXTRA_COMPILERS, которая вызывает lrelease при изменившихся .ts файлах. Автоматический вызов lupdate я для debug не делал, т.к. lupdate, естественно, не молниеносно работает, но для release такой вызов прикрутил.
Как будет достаточно свободного времени — приведу скрипт в порядок и выложу в блог.
Спасибо, буду очень признателен.
Офтоп. Не плохо было бы добавить запоминание имени и e-mail, а то постоянно приходится вводить по новому.
Я так понимаю, имя и e-mail — это для тех, кому не хочется регистрироваться. Если зарегистрироваться и войти (этот факт, естественно, запоминается), то при написании комментариев имя с e-mail запрашиваться не будут.
Увы, для Qt 5.2.1 + MinGW 4.8.0 (Windows) маски в переменных SOURCES и HEADERS недопустимы. Qt Creator их понимает нормально, а вот qmake даёт осечку; вероятно, дело где-то в связке qmake + MinGW. В Линуксе всё нормально. Лечится функцией $$files().