Pull to refresh

Выборочная сборка плагинов — мы пойдём иным путём

Reading time 2 min
Views 1.3K
Всем хабрапривет!

Маленькая (ну очень маленькая) заметка о том, как дать плагину выбирать самому — собираться в данной системе или нет. Конечно, есть старый добрый способ — просто исключить сам лишний плагин из сборки, к примеру, так:

# 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 не пытался внедрить манифест в несобранный бинарник.

«Заключение» или типа того.
Метод грязноват, явный костыль, но он работает. И потом — что за программа без костылей? =)

Но если уважаемые хабралюди предложат иной, более адекватный метод решения проблемы, буду только рад.
Tags:
Hubs:
+17
Comments 12
Comments Comments 12

Articles