Russian Qt Forum

Разное => Новости Qt сообщества => Тема начата: Авварон от Декабрь 20, 2019, 21:12



Название: Qbs 1.15.0
Отправлено: Авварон от Декабрь 20, 2019, 21:12
Кузулис уже писал на хабре (https://habr.com/ru/post/480132/) про фичи для микроконтроллеров, но вот и официальный анонс вышел (https://www.qt.io/blog/qbs-1.15.0-released).


Название: Re: Qbs 1.15.0
Отправлено: kuzulis от Декабрь 22, 2019, 22:05
По ходу это никому не надо :). На опеннете вон, даж заминусовали (лучше там вообще не светиться - обгадят и придется обтекать, а иначе - впитывать).


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 22, 2019, 22:34
Ой, на опеннете всегда школота сидела :D

А так, наш форум никому не нужен, а не только Qbs ;) Ты посмотри на остальные темы... Даже про деревянный айтем никто не набрасывает.

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

Я вот на самом деле две недели трахался с msvc и clang-cl чтобы заработал -fsanitize=address и прямо не могу нарадоваться насколько всё просто и красиво получилось. Шутка ли, 200 строк дифф. У меня правда есть чувство что где-то собака порылась, но Qbs и QtCreator с патчем собираются на ура.


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 22, 2019, 23:53
Ты, кстати, починил Дискорд?


Название: Re: Qbs 1.15.0
Отправлено: kuzulis от Декабрь 23, 2019, 09:49
Цитировать
Ты, кстати, починил Дискорд?

Не, я потерял ссылку на "канал". Теперь жду когда кто-нибудь добавит упоминание о ней или в документацию или на вики.


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 23, 2019, 10:45
есть какая-то утилита для конвертации pro в qbs?

https://wiki.qt.io/Qbs_Quick_Reference/ru русская страница содержит больше инфы, чем английская :)


Название: Re: Qbs 1.15.0
Отправлено: kuzulis от Декабрь 23, 2019, 12:27
Цитировать
есть какая-то утилита для конвертации pro в qbs?

Вроде нету.


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 23, 2019, 14:15
Цитировать
Ты, кстати, починил Дискорд?

Не, я потерял ссылку на "канал". Теперь жду когда кто-нибудь добавит упоминание о ней или в документацию или на вики.

В посте на блоге она есть=)

Цитировать
We have recently started to use Discord (https://discord.gg/tw5HHyY) in addition to the existing IRC channel #qbs on chat.freenode.net. Feel free to join


Название: Re: Qbs 1.15.0
Отправлено: kuzulis от Декабрь 23, 2019, 14:20
Цитировать
В посте на блоге она есть=)

Ахх, Ёлки, спасибо.


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 23, 2019, 14:20
есть какая-то утилита для конвертации pro в qbs?

https://wiki.qt.io/Qbs_Quick_Reference/ru русская страница содержит больше инфы, чем английская :)

Есть аналог qmake -project:
Код:
qbs create-project

Сам не пользовался, за работоспособность не отвечаю

Вики я вообще не знаю зачем нужна, она просто скудно дублирует документацию (https://doc.qt.io/qbs/). Все идеи описаны в багтрекере а не в вики, то есть для разработки она тоже не используется. Я бы вообще всю информацию держал в одном месте - в документации. Она хотя бы под тем же версионным контролем, что и код.


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 23, 2019, 14:21
Цитировать
В посте на блоге она есть=)

Ахх, Ёлки, спасибо.

Но я тебя вижу в списке участников - тебе надо просто зайти под тем же логином/паролем что ты заходил в первый раз (если ты конечно их знаешь)


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 24, 2019, 11:16
Есть аналог qmake -project:
Код:
qbs create-project

Сам не пользовался, за работоспособность не отвечаю
работать она работает, но просто собирает все обнаруженные файлы в один qbs верхнего уровня. для простых проектов сойдет, наверное :)

попытался руками написать qbs файлы для https://github.com/kambala-decapitator/qt-test-subprojects, пока застрял на header-only либе. app1 зависит от core и header-only, core зависит от header-only: при сборке получаю
Цитировать
qt-test-subprojects/header-only/header-only.qbs:1:1 First product defined here.
qt-test-subprojects/header-only/header-only.qbs:1:1 Second product defined here.
как исправить?

можно вопросы тут задавать или лучше использовать SO/mailing list?


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 24, 2019, 11:55
работать она работает, но просто собирает все обнаруженные файлы в один qbs верхнего уровня. для простых проектов сойдет, наверное :)
Жаль, могла бы хотя бы по папочкам раскладывать

попытался руками написать qbs файлы для https://github.com/kambala-decapitator/qt-test-subprojects, пока застрял на header-only либе. app1 зависит от core и header-only, core зависит от header-only: при сборке получаю
Цитировать
qt-test-subprojects/header-only/header-only.qbs:1:1 First product defined here.
qt-test-subprojects/header-only/header-only.qbs:1:1 Second product defined here.
как исправить?
Проблема в том, что у вас есть два проекта (app1 и core), которые референсят один и тот же проект (header-only). Референсить/включать (по сути, это такой инклюд, только, слава богу, не текстовый, но можно думать о нем и так) один и тот же (под)проект более одного раза нельзя - для подпроекта можно переопределять его дефолтные проперти и если проект подключается с разными пропертями, то неясно, как это обрабатывать (брать первый? второй? брать оба нельзя!)
Обычно делают не так - обычно заводят топлевел-проект, который референсит прямые подпапки и так далее по иерархии папок. А реальные зависимости разгребаются через Depends. В qbs структура Продуктов и (более-менее) Модулей "плоская" - они видны для Depends ото всюду, без привязки к исходной иерархии. Объяснение - вы логически зависите от либы "foo", а не от папки src/libs/foo/ которая может быть где угодно (и да, как следствие, двух либ/приложений с одинаковым именем в проекте быть не может)
То есть, структура папок отдельно, зависимости отдельно (хотя они частично и параллельны).

Просто перенесите
Код:
references: [
    "../core/core.qbs",
    "../header-only/header-only.qbs",
  ]
В корневой проект (и создайте его).
Вообще, реальный Project в проекте, как правило, один - на верхнем уровне. Рекурсивные подпапки (ака TEMPLATE+=subdirs в qmake) тоже делаются через Project, но он такой "фейковый" - не содержит ничего, кроме references ниже (https://github.com/ABBAPOH/qbsfish/blob/master/src/src.qbs) (не пугайтесь SubProject (https://doc.qt.io/qbs/qml-qbslanguageitems-subproject.html), в данном случае он полностью эквивалентен references, просто более "декларативно")

Цитировать
qt-test-subprojects/header-only/header-only.qbs:1:1 First product defined here.
можно вопросы тут задавать или лучше использовать SO/mailing list?

В mail листе отвечают достаточно оперативно, насчет SO не знаю. Другое дело что у буржуев щаз праздники и даже коммиты в геррите не ревьювят. Ох уж это время года :)
Задавайте пока тут


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 24, 2019, 14:12
большое спасибо, все получилось!

(частично по теме) а как запустить Qt приложение, собранное вне креатора, без модификации rpath? запуск через
Код:
DYLD_LIBRARY_PATH=/Volumes/hdd/Applications/Qt/5.13.1/clang_64/lib app2.app/Contents/MacOS/app2
не помогает:
Цитировать
dyld: Library not loaded: @rpath/QtCore.framework/Versions/5/QtCore
  Referenced from: .../default/app2.998ffe0d/app2.app/Contents/MacOS/app2
  Reason: image not found


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 24, 2019, 14:19
Там в какой-то макоси появился DYLD_FRAMEWORK_PATH в дополнение к DYLD_LIBRARY_PATH.
У меня так:
Код:
export DYLD_FRAMEWORK_PATH=/Applications/Qt/5.13.1/clang_64/lib/:`pwd`/default/sharedLib.c0837e29/
Еще учтите что это может не работать в баш скриптах, безопасности ради эта переменная при каких-то условиях не передается детям. Но из консоли вроде работает.

Еще есть команда qbs run (https://doc.qt.io/qbs/cli-run.html) которая умеет делать это за вас=)
Код:
qbs run -p <ваш продукт>

Код:
mbp-abbapoh:qt-test-subprojects abbapoh$ qbs run -p app2
Restoring build graph from disk
Building for configuration default
Build done for configuration default.
Installing
Starting target. Full command line: /Users/abbapoh/Programming/qt5/alien/qt-test-subprojects/default/app2.998ffe0d/app2.app/Contents/MacOS/app2

На мне висит тикет (https://bugreports.qt.io/browse/QBS-1204) это документировать, но я ленюсь


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 24, 2019, 15:02
DYLD_FRAMEWORK_PATH помог, спасибо. я чисто потестить через терминал :)

с qbs run намного лучше! :)


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 24, 2019, 15:39
а как выбрать тип библиотеки-зависимости на лету? хочу, чтоб app1 статически линковалось к core, а app2 — динамически. вот так выдает ошибку:
Код
Javascript
// core.qbs
Product {
 property bool isDynamicLib
 type: isDynamicLib ? "dynamiclibrary" : "staticlibrary"
 name: "core"
 // ...
 Export {
   // ...
   Parameters {
     core.isDynamicLib: true
   }
 }
}
 
// app1.qbs
CppApplication {
 // ...
 Depends { name: "core"; core.isDynamicLib: false }
}

Цитировать
app1/app1.qbs:1:1 Error while handling product 'app1':
app1/app1.qbs:1:1 Parameter 'core.isDynamicLib' is not declared.
app2/app2.qbs:1:1 Error while handling product 'app2':
app2/app2.qbs:1:1 Parameter 'core.isDynamicLib' is not declared.


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 24, 2019, 15:49
А вот это я вам не подскажу=)

То, как вы делаете, не заведется, параметры в Depends не управляют (как это ни странно) параметрами зависимого продукта/модуля, они нужны, чтобы управлять модулями, от которых сам этот продукт зависит (+1 уровень зависимости). Единственный пример для чего это надо, это чтобы НЕ линковаться к плагинам:
Код:
Depends { name: "myplugin"; cpp.link: false }

Кажется, это можно сделать через мультиплексинг (https://doc.qt.io/qbs/multiplexing.html), но это тема, в которой я не особо шарю.
Идея в том чтобы собирать проект в два прохода - один раз для "статического" профиля (https://doc.qt.io/qbs/qml-qbslanguageitems-profile.html) и один для "динамического".
Как это сделать и будет ли работать - ума не приложу, никогда не было нужно=)


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 24, 2019, 15:59
Ой нет, что-то я тупанул, можно же проще сделать - через два продукта
Код:
StaticLibrary {
    name: "foo-static"
}

DynamicLibrary {
    name: "foo"
    Depends { name: "foo-static"; cpp.linkWholeArchive:true }
}

CppApplication {
    name: "app1"
    Depends { name: "foo-static" }
}

CppApplication {
    name: "app2"
    Depends { name: "foo" }
}

Update: Хотя я уверен что придется повозиться с макросами экспорта не венде=(


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 24, 2019, 16:26
ага, я примерно так и сделал: https://github.com/kambala-decapitator/qt-test-subprojects/commit/3976584e86155fda34dea9ac7f11df1a87f551a1. может, через модуль можно как-то красивее оформить, чтобы получилось примерно как в https://doc.qt.io/qbs/howtos.html#how-do-i-make-my-app-build-against-my-library — Choosing Between Dynamic and Statically-built Qt Projects.

да, макросы надо будет сделать аналогично sharedLib. еще обнаружил, что просто изменение type вместо использования DynamicLibrary/StaticLibrary не упаковывает либы во фреймворки на Макос :)

когда пытался подобное сделать через qmake, получилось как-то слишком громоздко...

P.S. опечатки нашел в доках :)
1. https://doc.qt.io/qbs/qml-qbsconvenienceitems-qtapplication.html — лишняя } в Depends
2. https://doc.qt.io/qbs/overview.html#build-process — скобки перепутаны везде внутри Rule (второй кусок кода)


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 24, 2019, 18:45
ага, я примерно так и сделал: https://github.com/kambala-decapitator/qt-test-subprojects/commit/3976584e86155fda34dea9ac7f11df1a87f551a1. может, через модуль можно как-то красивее оформить, чтобы получилось примерно как в https://doc.qt.io/qbs/howtos.html#how-do-i-make-my-app-build-against-my-library — Choosing Between Dynamic and Statically-built Qt Projects.

да, макросы надо будет сделать аналогично sharedLib.

Я боюсь вендопроблем, ведь макросы экспорта должны быть пустыми в static либе и непустыми в shared. Возможно, единственный способ собирать дважды с разными макросами соответственно. Вендопроблемы=(

еще обнаружил, что просто изменение type вместо использования DynamicLibrary/StaticLibrary не упаковывает либы во фреймворки на Макос :)

Что в Qbs удобно, это всегда можно посмотреть что и как сделано
Код:
 $ cat "/Applications/Qt/Qt Creator.app/Contents/Resources/qbs/share/qbs/imports/qbs/base/NativeBinary.qbs"
...
Product {
...
    property bool isForDarwin: qbs.targetOS.contains("darwin")
    property bool isBundle: isForDarwin && bundle.isBundle
...
    Depends { name: "bundle"; condition: isForDarwin }
...
}

P.S. опечатки нашел в доках :)
1. https://doc.qt.io/qbs/qml-qbsconvenienceitems-qtapplication.html — лишняя } в Depends
2. https://doc.qt.io/qbs/overview.html#build-process — скобки перепутаны везде внутри Rule (второй кусок кода)

Спасибо, поправил (https://codereview.qt-project.org/c/qbs/qbs/+/285298)


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 24, 2019, 21:42
переделал на StaticLibrary/DynamicLibrary как выше — все-таки правильнее будет.

наткнулся на спорный момент в документации: https://doc.qt.io/qbs/qml-qbslanguageitems-export.html утверждает
Цитировать
This relationship is transitive, so a product C depending on product B will also get the include paths and preprocessor macros via A's Export item.
то есть при цепочке StaticLibrary -> DynamicLibrary -> App2 хедеры StaticLibrary должны быть видны в App2, т.к. в StaticLibrary прописано
Код:
  Export {
    Depends { name: "cpp" }
    cpp.includePaths: [product.sourceDirectory]
  }
но без добавления идентичного куска в DynamicLibrary получаю ошибку:
Код:
qt-test-subprojects/app2/main.cpp:6:10: fatal error: 'core.h' file not found
#include "core.h"
         ^~~~~~~~
1 error generated.
или я что-то неверно понял?


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 24, 2019, 22:05
Мне кажется, для этого там должно быть

Код:
Product {
    name: "B"
    Depends { name: "A" }
    Export {
        Depends { name: "A" }
    }
}

Само по себе оно вроде не экспортирует зависимость от А. Этой строке в документации 6 лет, скоро в школу пойдет, так что оно могло поменяться - ведь если вы зависите от QtCore и QtXml но наружу торчит только QtCore, то нет смысла экспортировать всё подряд.


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 25, 2019, 13:32
спасибо. значит, просто документация не обновлена.

нашел трюк получше как в «производном классе» выбирать тип библиотеки: «базовый класс» наследовать не от Product, а от NativeBinary, тогда доступна упаковка в бандл из коробки, а функционал из Library и *Library не особо-то и нужен (install не планирую).

это баг или фича, что список в https://doc.qt.io/qbs/qbsconvenienceitems-qmlmodule.html и https://github.com/qbs/qbs/tree/master/share/qbs/imports/qbs/base отличается? во всяком случае, недокументированный NativeBinary можно спокойно использовать.


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 25, 2019, 16:23
спасибо. значит, просто документация не обновлена.

Я на всякий спросил в чатике в дискорде на предмет того правда ли это, если нет, исправим.

нашел трюк получше как в «производном классе» выбирать тип библиотеки: «базовый класс» наследовать не от Product, а от NativeBinary, тогда доступна упаковка в бандл из коробки, а функционал из Library и *Library не особо-то и нужен (install не планирую).

это баг или фича, что список в https://doc.qt.io/qbs/qbsconvenienceitems-qmlmodule.html и https://github.com/qbs/qbs/tree/master/share/qbs/imports/qbs/base отличается? во всяком случае, недокументированный NativeBinary можно спокойно использовать.

Что-то баг, что-то фича. Я бы описал недостающее но понятия не имею как использовать NSISSetup, NetModule, NodeJSApplication и некоторые другие.

Часть айтемов (NativeBinary, Library) являются чисто деталями имплементации и не предполагаются для использования напрямую (и потому не документированы). В простых случаях вы используете верхнеуровневые айтемы, в сложных - наследуете Продукт напрямую.
Например, если ваш юз-кейз чуть усложнить - то есть разрешить собирать не только статик/динамик, а статик/динамик/фреймворк, то нативного бинаря уже не достаточно, придется делать MyLibrary (https://github.com/ABBAPOH/qbsfish/blob/master/qbs/imports/MyLibrary.qbs#L10)

Насчет установки - в философии Qbs это считается (но не является) обязательным - запуск (по-хорошему) должен осуществляться только из установочной директории (например, install-root внутри директории сборки - по дефолту оно во время сборки (!) ставит в `pwd`/<config>/install-root/<install prefix>). Это сделано для того, чтобы частично (или полностью) избежать вышеназванных проблем с DYLD_FRAMEWORK_PATH и/или двойным набором переменных в файлах проекта - install dir и destination dir и/или проверками в коде - мы запущены из установочной директории? мы запущены из сборки?. Так как вам и так и так придется (в реальном проекте) это все куда-то ставить, так почему не делать это сразу?=)
В вашем примере если бы либа была установлена и прописан правильно rpath, не пришлось бы указывать путь в DYLD_FRAMEWORK_PATH, только достаточно указать путь к Qt. Впрочем, ставить либы Qt никто не запрещает и сама qbs так делает (https://github.com/qbs/qbs/blob/master/src/shared/bundledqt/bundledqt.qbs)


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 25, 2019, 23:29
спасибо, значит, NativeBinary специально недокументирован и лучше его не использовать.

насколько я понимаю, тогда не получится выставить правильные макросы для винды при вашем предложенном подходе заворачивания StaticLibrary в DynamicLibrary, т.к. в этом случае не осуществляется пересборки с новыми флагами. Во всяком случае, я не вижу -DCORE_LIBRARY в логе сборки https://github.com/kambala-decapitator/qt-test-subprojects/commit/547ddf4f67cba5303f91d4ef9480a8761b588140. И остаются подходы через установку type или использование MyLibrary. Или как-то можно «заинлайнить» все нужные свойства внутрь StaticLibrary и DynamicLibrary (чтоб не копипастить), но без наследования от Product? Group позволяет только файлы группировать, больше я возможностей не нашел...


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 26, 2019, 03:02
Ваш способ с наследованием от NativeBinary вполне себе ок, это самое простое, что можно сделать.
То, что он "приватный" - ничего страшного, вряд ли он куда-то денется.

Я, кстати, проверил транзитивность зависимостей - пример действительно конфузящий.
1. Если есть цепочка Depends A <- B <- C <- app
2. А экспортирует инклюды, B экспортирует зависимость от А + свои инклюды, С экспортирует зависимость от B + свои инклюды
3. Тогда в app видно инклюды из A

Если убрать экспорт А из B или B из С, тогда инклюды не видно. То есть экспорты, конечно, транзитивны, но не автоматически транзитивны. Пример во вложении.


Название: Re: Qbs 1.15.0
Отправлено: kambala от Декабрь 26, 2019, 12:19
спасибо большое за помощь! вернул NativeBinary.

документацию надо будет подправить про транзитивность экспортов :)

и пока последний вопрос :) правильно ли делать хедерные либы Product? как здесь https://github.com/kambala-decapitator/qt-test-subprojects/blob/master/header-only/header-only.qbs


Название: Re: Qbs 1.15.0
Отправлено: Авварон от Декабрь 26, 2019, 12:47
и пока последний вопрос :) правильно ли делать хедерные либы Product? как здесь https://github.com/kambala-decapitator/qt-test-subprojects/blob/master/header-only/header-only.qbs

Да, я бы делал так же (https://github.com/ABBAPOH/qbs/blob/constexpr/src/shared/gsl/gsl.qbs).
Продукт вообще базовая вещь для всего