Всем хабрапривет!
Маленькая (ну очень маленькая) заметка о том, как дать плагину выбирать самому — собираться в данной системе или нет. Конечно, есть старый добрый способ — просто исключить сам лишний плагин из сборки, к примеру, так:
# plugins.pro TEMPLATE=subdirs SUBDIRS+=common macx: SUBDIRS+=macplugin win32: SUBDIRS+=winplugin
Но при таком подходе при добавлении каждого нового плагина надо его прописать в plugins.pro и установить для каких систем он будет собираться. Если плагинов всего-то 5 штук и больше не предвидится, то это нормально. Но если уже есть 20 плагинов, и ещё 30 планируется, причём многие из них должны собираться только под некоторые платформы, то plugins.pro превращается в помойку. Если разработчиков несколько, то это вносит ещё большую путаницу.
Не логичнее ли перенести заботу о том, в каких системах плагину собираться, на хрупкие плечи его разработчика? Тогда файлик plugins.pro становится совсем простым и понятным:
# plugins.pro TEMPLATE=subdirs SUBDIRS+=common SUBDIRS+=macplugin SUBDIRS+=winplugin
Но зато в macplugin.pro придётся писать что-то вот такое (аналогично будет и для winplugin.pro):
# macplugin.pro macx: { # project configuration here } else { include(../nobuild.inc) }
Как видно, дело теперь за малым — сделать в корне папки с исходниками плагинов файлик nobuild.inc и написать в него нечто, чтобы он отменял сборку плагина. Сначала кажется, что его лучше вообще пустым оставить, но это приведёт к попытке плагин собрать — ибо Qt для пустых .pro файлов пытается собрать все исходники в папке с параметрами по-умолчанию. А значит, попытается исходники плагина собрать в исполняемый файл, да тем более исходники, не предназначенные для данной OS. Разумеется, в этом случае Вы, скорее всего, увидите нечто похожее на картинку в начале топика.
Перерыв документацию по qmake, я не нашёл ни одной функции для пропуска сборки проекта, поэтому пришлось делать грязный хак: подменить компилятор и линковщик! На что? Ну, какая программа есть во всех системах, не делает ничего деструктивного, принимает любые аргументы и при этом всегда возвращает 0?
В общем, пишем так:
# nobuild.inc QMAKE_CXX=echo QMAKE_LINK=echo win32: { CONFIG-=embed_manifest_exe CONFIG-=embed_manifest_dll TARGET= }
Блок для Windows нужен чтобы qmake не пытался внедрить манифест в несобранный бинарник.
«Заключение» или типа того.
Метод грязноват, явный костыль, но он работает. И потом — что за программа без костылей? =)
Но если уважаемые читатели предложат иной, более адекватный метод решения проблемы, буду только рад.
Автор: silvansky