Разработчики из компании Nokia представили новый экспериментальный сборочный инструментарий qbs (Qt Build Suite), предназначенный для сборки приложений, основываясь на данных файла-проекта, все команды которого записаны на упрощенном диалекте языка QML. Файл с правилами сборки описывает только один проект, который в тоже время может содержать несколько разных программных продуктов, каждый из которых может иметь свой тип (приложение, библиотека и так далее) и отдельную схему сборки. Код qbs открыт под лицензией LGPL.
Использование упрощённой версии QML для оформления файлов с правилами сборки с одной стороны упрощает интеграцию с интегрированными средами разработки, а с другой позволяет реализовать нестандартные шаги, интегрируя в файл сборки функции, реализованные на языке JavaScript, а также подключая внешние модули. Например, в qbs можно создавать свои дополнительные правила, позволяющие задействовать дополнительные генераторы кода и компиляторы ресурсов, для трансформации файлов из одного типа в другой. Исходя из данного высокоуровневого описания в проектном файле, qbs генерирует корректный и очень подробный граф всех зависимостей проекта. В отличии от qmake, — qbs жестко не привязан к Qt и может использоваться для организации сборки любых программных продуктов.
Главное же отличие qbs в том, что классические makefile-генераторы, такие как qmake или CMake, создают лишь makefile’ы, оставляя непосредственно процесс сборки на откуп таких инструментов, как make или ninja. В отличие от данной схемы, qbs берёт на себя и роль утилиты make, без посредников напрямую запуская компиляторы, линковщики или другие инструменты сборки, такие как SCons или Ant. Сборка осуществляется в режиме параллельного выполнения нескольких сборочных потоков. Qbs изначально видит весь проект целиком, без необходимости поиска дополнительных сборочных файлов в поддиректориях, что позволяет в сочетании с техникой инкрементальной сборки достигнуть высокой производительности, заметно опережающей стандартную утилиту make. Например, для проекта из 200 библиотек, по 50 C++ классов в каждой, повторная пересборка, в ситуации когда с прошлой сборки не внесено изменений, занимает в qbs 0.843 сек., а при использовании make более 4 секунд.
Отмечается, что по сравнению с такими пакетами, как CMake и GNU Autotools, в qbs пока мало возможностей для организации полноценной кросс-платформенной сборки, учитывающей многочисленные нюансы различных программных окружений. Поэтому qbs пока невозможно использовать для серьёзных проектов в качестве полноценного аналога CMake и GNU Autotools. Тем не менее, подчеркивается, что qbs ещё на начальной стадии развития и воспринимать его следует пока только как экспериментальный проект.
Пример простого сборочного файла helloworld.qbp:
import qbs.base 1.0 Application { name: "HelloWorld" files: "main.cpp" Depends { name: "cpp" } }
Более сложный пример, с импортом вспомогательной функции planetsCorrectlyAligned из файла helpers.js.
import qbs.base 1.0 import "helpers.js" as Helpers Product { name: "myproject" Group { condition: Helpers.planetsCorrectlyAligned() file: "magic_hack.cpp" } }