LINUX.ORG.RU

Qbs - создание, генерация файлов

 


0

1

Привет ЛОР. Решил посмотреть, во что могёт qbs и что это за зверь такой, до этого им не пользовался, но он меня заинтересовал некоторыми фишками.

Так вот пока столкнулся с одной проблемой. Есть необходимость создать файл рядом с собранным исполняемым файлом, в сам файл необходимо передать определённую инфу, например название проекта, путь к билду, версию проекта...

Почитал доку, вроде бы понял, что всё это делается через Rule, но есть одна проблема. Как я понял Rule не работает если в него не передавать уже заранее созданный файл. Может есть более простой способ? Например в том же CMake, это всё осуществляется специализированными командами встроенными в язык.

P.S. Дока у qbs мне не понравилась, деталей мало, примеров почти нет, нет поиска по ключевым словам, даже на сторонних сайтах почти ничего нет про qbs.

★★

Последнее исправление: Dr64h (всего исправлений: 1)

Поддержка Qbs прекращена. Одна надежда на сообщество.

Брось каку.

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

The Qt Company announced that it will discontinue the further development of Qbs by the end of 2019 deprecated. The project is maintained by the community as part of the Qt Project.

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

Просто один товарищ утверждал, что qbs может всё, что может cmake и даже круче.

Пока что, для меня система Rule + Artifact выглядит как какой-то запутанный костыль, вместо которого, можно было бы просто вызывать скрипты по условиям и зависимостям.

Dr64h ★★
() автор топика

Почитал доку, вроде бы понял, что всё это делается через Rule

Все через рули. Но для генерации текстовых файлов есть два способа:

  1. Самый простой - использование шаблонов и модуль texttemplate .

  2. Сложнее но универсалнее - самому создавать текстовые файлы.

Пример первого способа:

Файл проекта: gen-template.qbs :


import qbs
import qbs.FileInfo

CppApplication {

    // Подключаем модуль-генератор шаблонов.
    Depends { name: "texttemplate" }

    // Добавляем тег "text" к твоему продукту приложения,который
    // по умолчанию используется модулем 'texttemplate' для всех
    // входных файлов с расширением '*.in'.
    type: base.concat("text")

    consoleApplication: true

    // Твоя версия приложения или хз чего.
    property string version: "1.2.3"

    // Заполняешь соответствие пропертей генерируемого шаблона и того чо те надо.
    texttemplate.dict: ({
        appname: product.name,
        apppath: FileInfo.joinPaths(my_install_group.qbs.installRoot, my_install_group.qbs.installDir),
        appver: product.version,
    })

    // Список входных файлов твоего продукта приложения.
    // - файлы с расширением '*.cpp' будут компиляться модулем 'cpp'.
    // - файлы с расширением '*.in' будут обрабатываться модулем 'texttemplate'.
    files: ["main.cpp", "info.txt.in"]

    // Эта группа для установки твоих выходных артефактов (коими являются екзешка
    // приложения и твоя сгенеренная инфа) в нужную директорию.
    // Тут будет 'install-root/bon'
    Group {
        id: my_install_group
        fileTagsFilter: ["application", "text"]
        qbs.install: true
        qbs.installDir: "bin"
    }
}

Файл исходного шаблона: info.txt.in :

# This is generated file

app-name: ${appname}
app-path: ${apppath}
app-version: ${appver}

Файл сгенеренного файла: info.txt :

# This is generated file

app-name: gen-template
app-path: C:\Users\ass\Documents\build-gen-template-debug\Debug_Desktop__e24fef6e51900fb5/install-root/bin
app-version: 1.2.3

Чо тут сложного то? :)

PS: Для оперативных вопросов есть канал на дискорде https://discord.gg/ZXT6YKq

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

Пока что, для меня система Rule + Artifact выглядит как какой-то запутанный костыль,

Наоборот - все очень просто. У каждой рули есть набор входных и выходных артифактов. Наборы артифактов идентифицируются тегами. Т.е. к любому файлу/артифакту ты можешь назначить любой тег и обрабатывать этот файл по своему (например cpp файлы не компилять а шо нить другое с ними делать). Сами рули выстраиваются в цепочки, где выходы одних рулей соединяются со входами других… что то вроде pipeline.

Ваши CMake сосут по полной. ))

UPD: Так работает все в QBS, даже компиляция. Например этим занимается модуль cpp, который также содержит набор рулей, соединенных между собой. Например, руля компилятора берет на вход все файлы, оттегированные как ‘c’, ‘cpp’, ‘h’ и прочие (по умолчанию), эти файлы компиляться в объектники, которые являются выходными артифактами для этой рули (эти файлы также теггируются своими тегами). Потом эти объектники поступают на вход другой руле линкеру. Она берет объектники и линкует их в екзешку или чо то еще. Эта екзешка является выходным артифактом для этой рули. Далее можно эту экзешку подать на вход еще какой-нить юзерской руле… Например для генерации HEX файлов из ELF и прочее.

Ваши CMake сосут по полной все сильнее. ))

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

Ок спасибо, сейчас проверю. Есть ещё вопрос. В CMake можно добавлять свои ключи (параметры сборки проекта), например:

cmake ./build -DCMAKE_CXX_COMPILER=clang++                 \
              -DEXAMPLE_INSTALL_ICONS=ON                   \
              -DEXAMPLE_INSTALL_ICONS_SET="ALL"            \
              -DEXAMPLE_INSTALL_TRANSLATIONS="en_US;ru_RU"
Как сделать что-то подобное с Qbs?

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

Как то так, https://doc.qt.io/qbs/language-introduction.html#overriding-property-values-from-the-command-line :

Например:

Project {
     name: "my_project"
     property string project_property1: "foo"
     property string project_property2: "bar"

     Product {
          name: "my_product"
          property string product_property1: "baz"

     }
}

и тогда:

qbs build projets.my_project.project_property1:"new-foo" projets.my_project.project_property2:"new-bar" products.my_product.product_property1:"new-baz"
kuzulis ★★
()
Ответ на: комментарий от kuzulis

C-Maka :)

Да вот не могу я выбрать систему сборки, которая бы нравилась.

Синтаксис CMake для меня остался инопланетным, и что-то сделать в нем получается только программированием на гугле. qmake вне инфраструктуры Qt не очень полезен.

На работе - чистый make без всяких надстроек.

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

Попробуй ninja-build, тот же make, только лучше

как сказать, не умеет job server, приходится ставить https://github.com/Kitware/ninja/releases

некторые от него отказываются, в частности alpine перешёл на https://github.com/michaelforney/samurai

imb ★★
()