Предыстория
Так вышло, что, работая над очередным проектом с использованием Qt, мне окончательно надоело прописывать вручную шаги построения (Custom Build Steps) для файлов, которые нужно предварительно обрабатывать с помощью метаобъектного компилятора Qt (Meta-Object Compiler, MOC).
Я конечно знал о существовании Qt Visual Studio Add-in, который умеет это делать автоматически, однако, в моей профессиональной деятельности наступил тот этап, когда хотелось бы контролировать каждую мелочь самостоятельно, но делать это с удобством. Посему я решил вынести правила построения для MOC в отдельный файл, ну а заодно сделал это и для компилятора описаний графического интерфейса UIC и компилятора ресурсов RCC.
Результат
В студии есть такая штука как пользовательские правила построения (Custom Build Rules). По сути это обычный xml-файл, в котором описано, каким образом нужно собирать те или иные типы файлов.
Руководствуясь документацией Qt, я записал все параметры для запуска MOC, UIC и RCC в файл правил. В результате (стоит лишь подключить этот файл к проекту) имеем вот что:
и соответственно в свойствах заголовочного файла:
Подключить файл к проекту проще простого: кликаем правой кнопкой мышки на проекте и в меню выбираем «Custom Build Rules…». Дальше находим наш файл правил и ставим напротив соответствующего пункта галочку.
Я ещё не полностью протестировал все параметры (особенно я не уверен касательно правильности указания параметров сжатия RCC), однако, уже с удовольствием пользуюсь подобным подходом.
Достоинства:
- Высокая экономия времени за счёт отсутствия необходимости прописывать Custom Build Steps для каждого файла, требующего обработку метаобъектным компилятором.
- Если мы внезапно захотим изменить путь, по которому будут складываться сгенерированные файлы, нам достаточно будет это сделать единожды в настройках проекта, а не рыскать по свойствам каждого файла в отдельности.
- Гораздо удобнее выбрать в свойствах нужный параметр (тем более, для каждого их них есть краткое описание), чем помнить наизусть ключи командной строки.
Недостатки:
- В студии обнаружилась проблема: если мы вручную выставляем в свойствах файла кастомный инструмент для сборки, она почему-то не сохраняет это в файл проекта. Выход из этой ситуации — привязка инструментов к файлам по расширению. Отсюда следует, что для заголовочных файлов, которые нужно обрабатывать moc’ом, нужно использовать отличное от *.h расширение. Я использую *.hxx, а в одном проекте вообще заставил MOC проходить по всем заголовочным файлам — потеря времени при этом оказалась несущественной даже при полной пересборке проекта.
- Нет совместимости с новой VS 2010. Дело в том, что в 2010 студии Microsoft полностью перешла на свою систему сборки MSBuild (чем-то похожа на Apache Ant… тоже юзают XML…), для задания своих правил в которой используются файлы *.targets, если я не ошибаюсь. Как только я разберусь с MSBuild, сделаю поддержку и для него, но пока эта задача для меня неактуальна.
В общем, делюсь с народом: Правила построения MOC, UIC и RCC для Visual Studio.
С большим удовольствием выслушаю замечания и/или пожелания касательно этих правил.