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

    Всем хабрапривет!

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

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

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

    Но если уважаемые хабралюди предложат иной, более адекватный метод решения проблемы, буду только рад.

    Комментарии 12

      +1
      Решение проблемы называется qbs
        0
        End-user вряд ли будет для сборки моего проекта собирать для начала Qbs. Вот когда qmake им заменят полностью — тогда и переходить можно.
          0
          Не вижу сложностей особенных. Можно сделать доп репу для QtSDK и пакеты для линуксов. А потом оно думаю скоро в дистрах появится.
          Но это наиболее правильное решение проблемы!
            0
            Я не спорю, что правильное, просто сложно сейчас это воплощать в жизнь.
            Кроме того, пока эта штука не допилена до релизного состояния.
              0
              Можно в допиле зато поучаствовать!
                0
                Это можно, но если есть на то время ;)
            0
            Самая проблема имхо в отсутствии поддержки со стороны Креатора))
              0
              Это да, это совсем плохо =)
            0
            Ну да, только когда оно ещё будет живое, стабильное и в репозиториях. Я как представлю, как буду всех разработчиков заставлять собирать этот самый qbs (сейчас пользуемся CMake)… Сразу тяга к экспериментам пропадает :)
            0
            А не проще построить что-то вроде такого:
            all.pro:
            include(winplugin/platform.inc)
            include(macplugin/platform.inc)


            winplugin/platform.inc:
            win32: SUBDIRS+=winplugin
            ?
            Путь для winplugin же всё равно от all.pro считаться будет, вроде. Или я не прав?
              0
              Это не очень хорошо по нескольким причинам:
              1. дополнительный файл в папке каждого плагина
              2. вносит неясность в all.pro
              3. сложнее добавлять плагин (больше буковок набирать руками)

              Хотя в чём-то и лучше моего варианта.
                0
                Не могу лайкать, поэтому плюсану комментом
                SUBDIRS и подключать нужные проекты в зависимости от OS.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое