LINUX.ORG.RU

Qt переходит с qmake на CMake

 , , ,


4

4

Сегодня в официальной рассылке Ларс Кнолл (Lars Knoll) подтвердил давно ходящие слухи об отказе от qmake в пользу CMake начиная с Qt 6.

Данное решение было результатом многочисленных дискуссий по поводу будущего системы сборки Qt. Команда признаёт, что эволюция qmake зашла в тупик и замена его было лишь вопросом времени. В июле Тьяго Мацейра (Thiago Macieira) перечислил требования к будущей системе сборки, из потенциальных кандидатов, удовлетворяющих им, в итоге остались Qbs и CMake.

Qbs разрабатывался внутри The Qt Company как альтернативная система сборки общего назначения, призванная избавиться от болячек qmake и предложить разработчикам декларативный язык описания проекта на основе QML. К сожалению, проект так и не получил достаточного развития и в последнее время поддерживался усилиями буквально одного человека. Для того чтобы Qbs конкурировал на рынке необходимо было бы приложить усилия, несоизмеримые с текущими возможностями и бизнес-целями компании. Таким образом, единственной областью применимой для Qbs мог бы стать перевод на неё самой Qt. Но даже это оказалось трудновыполнимой задачей из-за циклических зависимостей между Qt и Qbs, что прямо противоречило одному из основных требований.

И Qbs, и CMake показали хорошие результаты в ходе эксперимента по сборке Qt, но разработчики отмечают насколько далеко они сумели продвинуться именно с CMake за короткий промежуток времени.

Среди прочих достоинств CMake упоминаются широкое расспространение в экосистеме C++, в частности KDE, хорошая поддержка в популярных IDE и пакетных менеджерах (VCPkg, Conan и прочие), а также большая база пользователей.

Модули CMake уже официально входят в состав Qt 5 и планировались поддерживаться и далее наряду с qmake. Добавление третей системы сборки стало бы слишком тяжёлой задачей, поэтому отказ от Qbs был во многом предопределён.

Компания уверена в своём выборе CMake для Qt 6. Результаты уже сейчас можно опробовать в проекте qtbase, переключившись на ветку wip/cmake. Желающие принять участие в портировании остальных модулей приглашаются к сотрудничеству.

В дополнение, в официальном блоге Qt сегодня также заявили про прекращение разработки Qbs: http://blog.qt.io/blog/2018/10/29/deprecation-of-qbs.

>>> Подробности

★★★★★

Проверено: jollheef ()

Хорошо бы ещё добавить ссылочку http://lists.qt-project.org/pipermail/development/2018-July/033100.html

Требования были сформулированы ещё в июле. Вот одно из них:

b) Must be easily compiled from source on a standard system installation. All

of its dependencies must come from the system's package manager and there must be no cyclic dependencies. That is, it cannot require itself to build and it must not depend on Qt, either in source form or binary.

За всё это время проблема так и не решена, поэтому и пришлось прикопать этот проект.

anonymous ()

подтвердил давно ходящие слухи об отказе от qmake в пользу CMake

Модули CMake уже официально входят в состав Qt 5 и планировались поддерживаться и далее наряду с qmake

Так всё-таки, останется ли qmake хотя бы в качестве резервной системы? qmake просто работает, имеет достаточно простой синтаксис. У неё есть проблемы, например, с парсером, но эти проблемы, на мой взгляд, решаемы.

hobbit ★★★★★ ()

а что с qt creator? ему сделают такую же удобную обвязку для CMake, как была для qmake? или такие штуки как добавление существующих файлов и библиотек просто выкинут на мороз?

SR_team ★★ ()
Ответ на: комментарий от Dendy

Спасибо, добавил в текст.

Только я скопировал требование, которому QBS не удовлетворяет. Это основная причина, по которой на него не перешли.

anonymous ()
Ответ на: комментарий от anonymous

Спасибо!

Тогда заголовок выглядит не совсем точным. В оригинале были слова «we should move away from qmake», но они относились, скорее, к первоначальным планам.

Более правильный заголовок, по-моему, - «Qt переходит на CMake и отказывается от Qbs».

hobbit ★★★★★ ()

А почему они не сделали для CMake генератор для QtCreator, как для каких нибудь codeBlocks или eclipse? Это отлично работает, я, честно говоря, ждал этого.

Интересно будет посмотреть на то, как они впишут CMake-way в Qt, там конечно никакого рокет сайнс нет, но смена системы сборки всегда болезненна.

Согласен с тем, что им надо сосредотачиваться на интеграции QtCreator с CMake тем или иным образом (генератор, compile_commands.json). Чем собирать само Qt дело десятое.

PtiCa ★★★★★ ()
Ответ на: комментарий от hobbit

Так всё-таки, останется ли qmake хотя бы в качестве резервной системы?

Насколько я понял, qmake останется как система сборки для сторонних проектов, сам Qt им собираться больше не будет.

Dendy ★★★★★ ()
Ответ на: комментарий от anonymous

Только я скопировал требование, которому QBS не удовлетворяет. Это основная причина, по которой на него не перешли.

Сомневаюсь, что это циклические зависимости это основная проблема. Тьяго вообще там много глупослей понаписывал в требованиях. Думаю им просто лень развивать Qbs, когда CMake и так работает.

По поводу зависимостей. qmake написан на самом Qt. Ninja собирается сам собой. CMake тоже собирается сам собой, требуя предыдущую версию. Продолжать? Ключевое слово — bootstrap.

Dendy ★★★★★ ()

С одной стороны хорошо, что уменьшается количество велосипедов, с другой стороны cmake не идеален и конкуренция и новыые идеи нужны. Но, вроде, Qbs похоронили же, не qmake

Chelobaka ★★★★ ()

Для того чтобы Qbs конкурировал на рынке необходимо было бы приложить усилия, несоизмеримые с текущими возможностями и бизнес-целями компании.

У компании нет возможности выделить второго или даже третьего(!) разраба, серьезно?

CrossFire ★★★★★ ()
Ответ на: комментарий от UVV

В теме 12-го года ессно жесть с cmake, последние пару лет интеграция

Ничего не поменялось по этому вопросу. Проверял на Qt Creator из Ubuntu 18.04

fornlr ★★★★★ ()
Последнее исправление: fornlr (всего исправлений: 1)
Ответ на: комментарий от fornlr

Note: I'm using Qt creator v2.4.1.

Это что, шутка? На данный момент (4.7.2) интеграция с cmake на достаточно хорошем уровне. Файлы создавать можно, но в таргет cmake их нужно добавлять руками.

anonymous ()
Ответ на: комментарий от fornlr

Не идеальная, но разве где-то есть лучше? Как я понимаю, с технической точки зрения сейчас это не тривиальная задача (речь об автоматическом добавлении файлов в таргет).

anonymous ()
Ответ на: комментарий от Chelobaka

Для продвижения систем сборки нужен не разраб.

Они ведь сами пишут:

Добавление третей системы сборки стало бы слишком тяжёлой задачей, поэтому отказ от Qbs был во многом предопределён.

И да, кто по-вашему нужен для продвижения системы сборки?

CrossFire ★★★★★ ()
Ответ на: комментарий от hobbit

qmake просто работает

QMake просто не работает, со дня своего появления и за 18 (или сколько там) лет туда так и не завезли зависимости между заголовочниками. Это распиз^Wразгильдяйство галактического масштаба. Но самое упоротое, что они про это молчат, делая вид, что проблемы не существует, суя qmake как основную систему сборки в Qt Creator, следствием чего является поколение людей непонимающих что у них вообще происходит в проекте, когда через одну правку в исходниках сборка ломается, а спонтанные make clean на любой чих становятся привычным делом. Хуже только, что люди начинают думать, что это нормально и в порядке вещей.

Dendy ★★★★★ ()
Ответ на: комментарий от CrossFire

а вот не знаю кто. Популяризатор на зарплате, который шарил бы в системе и проталкивал её в среде программистов и заказчиков. Пиар нужен. Ездить на ивенты всякие, куча времени и бабла. Видишь же, напрограммировать они продукт смогли, а протолкнуть на рынок не могут. А жаль, cmake достаточно сложен, если бы сделали систему с учётом его минусов и плюсов, то было бы здорово.

Chelobaka ★★★★ ()
Ответ на: комментарий от anonymous

qmake не пользовался, а вот cmake - редкостное говно. Плохо все, начиная от документации, заканчивая убогим синтаксисом. И что самое печальное, cmake-параша принципиально нерасширяемая, т. е. невозможно сделать то, что в make делается с полпинка:

%.pdf: %.latex
        pdflatex $<
Добиться сходного эффекта можно, написав портянку, добавляющую кастомный таргет, но вот суффиксные правила принципиально невозможно писать, что привносит огромное количество боли при пользовании внешними препроцессорами (bison, lex, ragel, protoc и прочие).

В make можно написать

myexe: main.o mylib.a myresource.bin.o
...

%.bin.o: %.bin
        objcopy ...
В cmake такой прозрачной интеграции не будет никогда. И уж не знаю, кто виноват, но protobuf с cmake - это какая-то вселенская боль: без make clean/make -B изменения в proto-файле через раз не подхватываются.

anonymous ()
Ответ на: комментарий от Chelobaka

а вот не знаю кто. Популяризатор на зарплате, который шарил бы в системе и проталкивал её в среде программистов и заказчиков. Пиар нужен. Ездить на ивенты всякие, куча времени и бабла.

Сомневаюсь, что Qt и так не представлено на всех нужных выставках. Конечно, нужен кто-то, кто бы отвечал на вопросы на том же SO и официальном форуме, но для компании в 200+ это не такая уж проблема.

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

Ну как смогли, насколько я понимаю не получится собрать даже Hello World на Android из коробки, если выбран Qbs. Так что сил для возможности его полноценного использования в качестве замены qmake они приложили недостаточно — принцип Парето во всей красе.

CrossFire ★★★★★ ()
Ответ на: комментарий от anonymous

Модуль Protobuf входит в стандартную поставку CMake:

find_package(Protobuf)
protobuf_generate_cpp(my_proto_cpp my_proto_hpp my.proto)
add_executable(my_app ${my_proto_cpp})
target_link_libraries(my_app protobuf::libprotobuf)
Dendy ★★★★★ ()
Ответ на: комментарий от Dendy

не завезли зависимости между заголовочниками

Что это такое и зачем оно нужно?

В любом случае, единственная альтернатива qmake - это meson. Но сыроват.

cmake - страшный сон.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от CrossFire

По моим наблюдениям, о Qt вообще мало кто знает. С пиаром у них всё плохо. И я не говорю про Qbs.

А учитывая их убогий сайт, на котором всеми силами пытаются скрыть тот факт, что Qt бесплатный - это просто фейл.

Да и текущий упор на встраиваемые системы огорчает. Не понятно кто будет тянуть жирный Qt туда.

В общем нужно бежать с QtWidgets, а некуда.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Да и текущий упор на встраиваемые системы огорчает. Не понятно кто будет тянуть жирный Qt туда.

Для коммерческих клиентов есть Qt Lite.

В общем нужно бежать с QtWidgets, а некуда.

QML давным-давно допилили.

По моим наблюдениям, о Qt вообще мало кто знает.

Да ладно, знают все, кто хоть раз интересовался кроссплатформой на чем-нибудь кроме веб-технологий.

CrossFire ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Что это такое и зачем оно нужно?

Зависимости — основа инкрементальной сборки, за отсутствие которой в приличном обществе бьют с вертушки в щи. В qmake инкрементальной сборки никогда не было. Вместо Makefile они с тем же успехом могли бы генерировать скрипт на баше, который просто бы всё удалял и строил заново. Так хоть честнее было бы перед своими пользователями.

Dendy ★★★★★ ()
Ответ на: комментарий от CrossFire

Для коммерческих клиентов есть Qt Lite.

Я дефайнами смог от силы 30% скинуть. При том что каждый левый дефайн приводит к ошибке сборки. То есть это костыль, а не реальная фишка либы.

QML давным-давно допилили.

Не для десктопа.

Да ладно, знают все, кто хоть раз интересовался кроссплатформой на чем-нибудь кроме веб-технологий.

Знать должны заказчики, а не исполнители. А они знаю только про веб2.0

RazrFalcon ★★★★★ ()
Ответ на: комментарий от Dendy

Ninja собирается сам собой. CMake тоже собирается сам собой, требуя предыдущую версию. Продолжать? Ключевое слово — bootstrap.

Когда я их последний раз ставил на чистую Gentoo, cmake и ninja можно было собирать через ./confugure && make. Поломали?

question4 ★★★★★ ()
Ответ на: комментарий от Dendy

В qmake инкрементальной сборки никогда не было.

Что вы подразумеваете под инкрементальной сборкой? Ибо она есть.

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

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Что вы подразумеваете под инкрементальной сборкой?

Когда после правки произвольных файлов в проекте (вручную, через VCS или ещё как) запуск сборки (make) пересобирает все необходимые артефакты и ничего лишнего.

Ибо она есть.

В qmake? Нет, там её никогда небыло. В CMake — да, есть, там система зависимостей по-другому устроена, они хранятся в отдельный файлах и обновляются самостоятельно, а не только на этапе конфигурации.

Dendy ★★★★★ ()
Ответ на: комментарий от question4

Когда я их последний раз ставил на чистую Gentoo, cmake и ninja можно было собирать через ./confugure && make. Поломали?

Эти configure сделаны на основе bootstrap. И CMake и Ninja сначала собирают кусок самого себя самопальным скриптом, а потом этим собранным огрызком дособирают всё остальное. При этом и в том, и в другом есть вариант сборки без bootstrap, для этого CMake нужен другой CMake, а Ninja — другой Ninja.

Dendy ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Я дефайнами смог от силы 30% скинуть. При том что каждый левый дефайн приводит к ошибке сборки. То есть это костыль, а не реальная фишка либы.

Мне сложно судить о технологии не имея к ней доступа. Но графики интересные: https://qt-blog-uploads.s3.amazonaws.com/wp-content/uploads/2017/05/QtLiteCom...

Не для десктопа.

Сейчас мало кто заказывает десктопные приложения без кастомного дизайна, так что это не особая проблема.

Знать должны заказчики, а не исполнители. А они знаю только про веб2.0

Если заказчик адекватный, это обсуждаемо. Но надо понимать, что сделать на каком-нибудь Электроне всегда дешевле, чем нативно.

CrossFire ★★★★★ ()
Ответ на: комментарий от Dendy

Когда после правки произвольных файлов в проекте (вручную, через VCS или ещё как) запуск сборки (make) пересобирает все необходимые артефакты и ничего лишнего.

Всегда такое было.

RazrFalcon ★★★★★ ()

ИМХО, давно пора. В своё время как раз переехал с QMake на CMake на паре больших проектов из-за нерешаемых проблем первого. Синтаксис CMake, конечно, своеобразный, но по общему функционалу ему практически нет равных.

Поддержка CMake из-коробки, на мой взгляд, в QtCreator - вообще всегда была самой качественной (по сравнению с другими популярными IDE). Некоторых фич, вроде простого добавления файлов в проект, конечно, не хватает, но тут уже виновата «универсальность» CMake'а.

Сейчас вообще использую QtCreator + CMake как универсальную IDE для всех своих проектов на C\C++, перевел на CMake все свои проекты под микроконтроллеры и даже ардуину. А недавнее добавление какого-то минимального статического анализа прямо в IDE - вообще порадовало неимоверно. Надеюсь, разрабы Qt и QtCreator не просрут все полимеры с CMake и его поддержка будет только улучшаться без зацикливания на один только Qt.

DawnCaster ()

Ну, что CMake-шники, можете танцевать и упиваться могуществом на костях невинно убиенного младенца, в лице QBS. Ваши интриги, лобби и прочий шлак сделали свое дело! Радуйтесь, пока, придет еще и наше время.

QBS опередил время, как и СССР. Думаю, все вернется в свое время на круги своя, люди прозреют и скинут ярмо. :)

kuzulis ()
Ответ на: комментарий от CrossFire

Графики это прекрасно. Но реальность совсем другая. При этом нужно учитывать что было вырезано. Мне например нужны виджеты, а значит из QtCore/QtGui почти ничего не вырежешь.

Вот моя конфиг, который срезал от силы 30%:

./configure \
-platform linux-g++ \
-prefix ~/Qt-5.9.3 \
-opensource \
-confirm-license \
-no-sse3 \
-no-ssse3 \
-no-sse4.1 \
-no-sse4.2 \
-no-avx \
-no-avx2 \
-nomake tools \
-nomake examples \
-nomake tests \
-no-cups \
-no-icu \
-no-qml-debug \
-no-linuxfb \
-no-eglfs \
-no-opengl \
-no-libjpeg \
-no-sql-sqlite \
-no-sql-ibase \
-no-gif \
-no-ico \
-qt-libpng \
-qt-pcre \
-no-pch \
-no-accessibility \
-no-feature-big_codecs \
-no-feature-calendarwidget \
-no-feature-colordialog \
-no-feature-columnview \
-no-feature-commandlineparser \
-no-feature-commandlinkbutton \
-no-feature-datetimeedit \
-no-feature-dial \
-no-feature-errormessage \
-no-feature-fontcombobox \
-no-feature-fontdialog \
-no-feature-ftp \
-no-feature-gestures \
-no-feature-graphicseffect \
-no-feature-graphicsview \
-no-feature-inputdialog \
-no-feature-keysequenceedit \
-no-feature-lcdnumber \
-no-feature-listwidget \
-no-feature-localserver \
-no-feature-mdiarea \
-no-feature-movie \
-no-feature-pdf \
-no-feature-picture \
-no-feature-printdialog \
-no-feature-printer \
-no-feature-printpreviewdialog \
-no-feature-printpreviewwidget \
-no-feature-progressdialog \
-no-feature-rubberband \
-no-feature-sharedmemory \
-no-feature-splashscreen \
-no-feature-statusbar \
-no-feature-tableview \
-no-feature-tablewidget \
-no-feature-textodfwriter \
-no-feature-timezone \
-no-feature-treewidget \
-no-feature-undoview \
-no-feature-wizard \
-no-feature-xmlstreamwriter

Ещё ~5% можно скинуть выкинув qss, но тогда QTextEdit перестаёт работать. По крайней мере так было в 5.9.3.

RazrFalcon ★★★★★ ()