LINUX.ORG.RU

Cтек для разработки Qt-приложений с использованием Premake

 , , ,


0

3

Сегодня я опубликовал релизы трех компонентов для разработки Qt-приложений с использованием системы сборки Premake:

qt-support.lua 1.0

Это аддон для Premake, позволяющий использовать Qt в Premake-проектах. Qt-специфичная кодогенерация осуществляется автоматически - просто добавьте все исходники, заголовки, *.ui, *.qrc. и *.ts-файлы в список files!

Поведение qt-support.lua практически полностью совпадает с поведением qmake, позволяя практически безболезненно осуществлять миграцию. В отличие от qmake, по умолчанию генерируемые мейкфайлы переносимы, т.е. вы можете распространять их вместе с исходным кодом вашего приложения.

Документация

Ограничения

  • Требуются патчи для Premake (см. релиз ниже)
  • Поддерживается только GNU make
  • На Mac OS X поддерживается только конфигурация Qt в виде фреймворков
  • Следующие модули Qt пока не поддерживаются: ActiveQt, QtDBus, QtDesigner, Phonon

Загрузки

Файл включен в состав дистрибутивов Premake 4.4-qt-beta1


Premake 4.4-qt-beta1

Это неофициальный релиз Premake, содержащий патчи, необходимые для работы qt-support.lua

Загрузки (пакеты включают qt-support.lua)


PremakeProjectManager 0.2

Это плагин для среды разработки Qt Creator, добавляющий нативную поддержку проектов premake4.lua. Просто откройте в Qt Creator файл premake4.lua с конфигурацией вашего проекта, и вы сможете работать с его файлами, а так же компилировать и отлаживать проект! Плагин работает с Qt Creator 2.3.x и 2.4.0 (в составе Qt SDK или отдельно от него); более старые версии и master не поддерживаются.

Новое в версии 0.2

  • Поддержка ОС Windows
  • Поддержка Qt-проектов
  • Генерируемые файлы скрыты по умолчанию
  • Работает выбор тулчейна
  • Работает парсинг выдачи компилятора
  • Поддержка Qt Creator 2.4
  • Удалена поддержка Qt Creator 2.2

Загрузки

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

Форум Premake на Лоркоде

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

★★★★★

Проверено: DoctorSinus ()
Последнее исправление: DoctorSinus (всего исправлений: 8)
Ответ на: комментарий от Dark_SavanT

Синтаксис makefile «уж очень как, совсем» плох. В качестве примера посмотри Kconfig из ядра или buildroot.

Хотя я и не видел buildroot, GNU make няшен чуть менее, чем полностью.

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

GNU make няшен чуть менее, чем полностью.

Гну/бсд/вотевер мейк - всего лишь начинка для автотулзов!

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

Гну/бсд/вотевер мейк - всего лишь начинка для автотулзов!

Автотулзы - это попытка сделать из убогих бсд/вотевер мэйков хоть какое-то подобие сияющего и совершенного GNU Make.

Спокойно! Это была отчасти шутка.

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

Генерируемые файлы проектов и Makefile'ы по умолчанию переносимы, т.е. могут распространяться

каким образом это достигается, если пути к инклудникам и библиотекам везде разные ?

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

Типы выхлопа: GNU make, MSVS 2002-2010, Xcode 3-4, Code::Blocks, CodeLite, SharpDevelop, MonoDevelop. В разработке bsdmake, nmake, ninja.

А компилятор как выбирать? Оно может сгенерить проект для студии так, чтобы компилятором был icc ?

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

каким образом это достигается, если пути к инклудникам и библиотекам везде разные ?

Стандартные бибилотеки всегда в /usr/include и /usr/lib. В случае с Qt эффект достигается через qmake -query c сохранением в переменной мейкфайла. В случае с другими зависимостями фокус не пройдет.

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

А компилятор как выбирать?

Опция --tool

Оно может сгенерить проект для студии так, чтобы компилятором был icc ?

К сожалению, нет.

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

Зачем так сложно? В cmake это делается так

add_wtf_source(source test1.wtf test2.wtf ...)
....
add_executable(wtf-executable ${source})

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

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

Действие твое запрятано внутри add_wtf_source и выполняется именно для тех файлов, что ты перечислил.

Действие осуществляется при добавлении файла => беспросветная императивщина. С Premake я могу написать сколько угодно блоков files { ... } и excludes { ... }, а потом обойти только те файлы, которые были добавлены в проект и не были исключены.

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

pkg-config можно заюзать как wx-config в примере по ссылке

http://industriousone.com/buildoptions

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

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

После «тотального» сравнения с cmake становится более или менее понятно, что из себя представляет Premake. НО а что можете сказать на счет Premake vs (Scons/Waf) ?

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

Scons - тормоз, это знает каждый школьник. Premake работает очень быстро.

По сравнению с Waf, Premake отличается более простым и читаемым декларативным синтакисом, который не напоминает своим видом код.

По сравнению с обоими:

1) не требует установки питона (интерпретатор Lua слинкован с бинарником Premake)

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

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

Если ты сам обходишь, то это тоже императивщина.

Я могу написать плагин, императивно обходящий эти файлы перед генерацией. Если ты его подключишь, то для тебя как пользователя это будет декларативщина.

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

А для GTK+ есть что-нибудь такое?

Насколько я знаю, нет. Но запилить должно быть проще, так как в Qt много видов кодогенерации и фичей вроде плагинов, требующих специальных параметров.

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

Для Cmake есть экспериментальная версия с lua http://www.cmake.org/Wiki/CMake:Experiments_With_Lua

С точки зрения синтаксиса мне тоже казалось, что CMake страшен. Но с точки зрения практики Cmake работает сегодня и очень хорошо. Использую постоянно на протяжении более 2 лет для сборки под Windows,Linux/x86,Linux/ARM.

С другой стороны есть системы, которые не поддерживают C++ в достаточной мере, чтобы собрать CMake. А Lua на них работает! Lua вообще прорыв с точки зрения величины рантайма и мощности языка.

Но то, что сейчас у вас есть это как SCons - он тоже блистал в свое время, но сдал позиции отчасти потом, что требовал жирный питон, но главное на мой взгляд было то, что там не было из коробки всего, что есть в CMake. Поэтому для удачного развития проекта нужно поддерживать, то что уже есть в CMake.

А кто развивает продукт? И кем он поддерживается? Кто им известный пользуется?

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

Для Cmake есть экспериментальная версия с lua

Давно протухла. Да и идея немного бредовая: сначала кое-как реализовать часть Lua на С++ в своем коде, а затем прикрутить интерпретатор сверху.

А кто развивает продукт?

Jason Perkins, Liam Devine и я. Также поступает множество патчей от пользователей.

Кто им известный пользуется?

Skype, Bullet, ODE, некоторые другие проекты, связанные с геймдевом (как СПО, так и проприетарные).

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

Идея-то может и протухла, но вот есть большой проект и тупо не охота перелопачивать его в один день на Premake (тем более не понимая перспектив premake). Было бы круто взять проект на Cmake сконвертировать в Premake на этапе сборки. А другие части уже допиливать на lua. Или какие-то части на луа, а а для пользователей (программистов в данном случае) оставить базовый синтаксис CMake. Я просто хочу спросить насколько такая идея интересна? Или она только меня посещает?)) Просто у меня есть платформа (как я писал), на которой Cmake не работает, а lua вполне. И мне приходится только ради нее постоянно дописывать makefile. Хотелось бы плавный переход на Lua, но не отрываясь от mainstream, где CMake пока главный.

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

Интересно, что же это за волшебная платформа и почему нельзя для неё с[кросс]компилировать (скажем, даже статически) cmake?

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

кастани меня, пожалуйста, если анон научит тебя с++ на этом...

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

Это не то ?

Самое то (лично проверял),- Reset сказочник еще тот.

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

Scons - тормоз, это знает каждый школьник. Premake работает очень быстро.

Неосилятор обнаружен.

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

Извините, что отвечаю на несколько постов сразу.

Количество и названия конфигураций неограничены (в CMake их только 4: Debug, Release, DebugWithRelInfo, MinSizeRel)

В CMake есть `CMAKE_CONFIGURATION_TYPES`, а перечисленные конфигурации - лишь по умолчанию, удобства ради.

4.2 на твое 4.2. Попробуй в CMake получить, например, список сорсов для данной цели по ее названию.

На здоровье: `get_target_property(MY_TARGET_SOURCES MyTarget SOURCES)`

Бывают сложные ситуации, когда приходится смотреть вывод, чтобы понять, где косяк.

Плюс в CMake даже версии Qt для разных конфигураций не установишь.

Ни разу не было необходимости, расскажите о своих проектах. Более того, я использую CMake как раз для того, чтобы НЕ смотреть в Makefile'ы (или другие генерируемые проектные файлы).

Ну и к тому же трешовые мейкфайлы от CMake работают гораздо медленнее (отчасти из-за вызовов cmake изнутри)

Что поделать, во имя переносимости. Подождём, когда в ваших, в отличие от CMake, «переносимых Makefile'ах», вдруг потребуется во время сборки создать директорию. И насчёт «гораздо», таки приведите цифры.

Модульность. Ты создаешь проект, определяешь его «свойства» (декларативно), затем добавляешь плагин, который добавляет, например, правила кодогенерации. Можешь хоть C++ с m4-препроцесором организовать, если хочется.

Пример CMake кода из моего проекта (названия чего бы то ни было изменены, если что):

MY_PROJECT(Program1 GUI_APP
    SOLUTION_FOLDER
        GUI
    INSTALL_TO
        bin
    DEPENDS
        Library1
        Library2
    EXTERNAL_DEPENDS
        boost
        qt
        zip
    EXTERNAL_DEPENDS_USE_CURL
        curl
    EXTERNAL_DEPENDS_DUMPING_WITH_BREAKPAD
        breakpad
    EXTERNAL_DEPENDS_APPLE
        "-framework ApplicationServices"
        "-framework Cocoa"
        "-framework CoreFoundation"
        "-framework CoreServices"
    EXTERNAL_DEPENDS_WIN32
        rpcrt4
        mpr
)

MY_SOURCE_GROUP(NONE
    SOURCES
        main.cpp
    SOURCES_WIN32
        Program1.rc
    HEADERS_WIN32
        resource.h
)

MY_SOURCE_GROUP("Models"
    SOURCES
        Models/Model1.cpp
    HEADERS
        Models/Model1.h
)

MY_SOURCE_GROUP("Forms"
    UI_FILES
        Forms/Form1.ui
)

MY_PROJECT_END()

Магия? Нет, CMake.

Ну и мы с вами не на научной конференции :)

Слив защитан.

Могу ещё многое прокомментировать, но думаю вы поняли.

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

Ни разу не было необходимости, расскажите о своих проектах.

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

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

В данный момент это out of scope. Софт должен собираться со всеми возможностями, предусмотренными заданной конфигурацией.

В мусорку такую систему.

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

Могу ещё многое прокомментировать, но думаю вы поняли.

Хороший, годный ответ.

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

Стандартные бибилотеки всегда в /usr/include и /usr/lib

Открой глаза, линюксойд.

В моей системе большинство библиотек в /usr/pkg/lib и /usr/pkg/include соответственно

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

А для GTK+ есть что-нибудь такое?

GTK+ такие костыли не нужны. Генерация всякого барахла там нужна только для кастомного маршаллинга, а это обычно довольно редко бывает нужно.

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

make няшен ровно до тех пор, пока в makefile не требуется запихивать логику проверок и выбора. Это выливается в лютый ахтунг на мой взгляд.

С другой стороны, возможно, я не осознал Дао make.

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

Открой глаза, линюксойд. В моей системе большинство библиотек в /usr/pkg/lib и /usr/pkg/include соответственно

Пардон, имел в виду, что в дефолтных путях поиска компилятора

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

Думаю так сделать можно, надо смотреть документацию по FindQt

FindQt4 - ужасно стремный модуль. Насколько я понимаю, единственный способ поменять версию Qt - запихнуть в PATH нужный qmake, чтобы он шел первым, и получается, что вокруг cmake еще нужно городить скриптовые костыли.

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

Есть такое

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

Магия? Нет, CMake.

Эти функции есть в каком-то стандартном модуле? А *кодить* на недоязыке, чтобы сделать из CMake конфетку, у меня желания нет.

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

Что поделать, во имя переносимости. Подождём, когда в ваших, в отличие от CMake, «переносимых Makefile'ах», вдруг потребуется во время сборки создать директорию.

Директории без проблем создаются

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

CMAKE_CONFIGURATION_TYPES

Был не прав, извиняюсь

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

Ну и к тому же трешовые мейкфайлы от CMake работают гораздо медленнее (отчасти из-за вызовов cmake изнутри)

Что поделать, во имя переносимости.

И чем же желание обеспечить переносимость мешает геренировать для проекта 1 мейкфайл вместо целой директории с кучей makefile-ов, каким-то хитровывернутым способом вызывающих друг друга?

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

Идея-то может и протухла

Идея может и ничего, но реализацию давно забросили.

но вот есть большой проект и тупо не охота перелопачивать его в один день на Premake

Б-же упаси, я к этому не призываю.

Было бы круто взять проект на Cmake сконвертировать в Premake на этапе сборки.

Есть другой вариант - можно выделить конфигурационный код без вызовов типа add_executable (т.е. код, который может выполняться с cmake -P) в отдельный .cmake модуль, и импортировать выходные значения переменных в Premake-проект с помощью вот этого кода

http://industriousone.com/topic/cmake-integration

Хотелось бы плавный переход на Lua, но не отрываясь от mainstream, где CMake пока главный.

Это смотря где мейнстрим, у нас в конторе, например, qmake.

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

И чем же желание обеспечить переносимость мешает геренировать для проекта 1 мейкфайл вместо целой директории с кучей makefile-ов, каким-то хитровывернутым способом вызывающих друг друга?

Не только друг друга, но еще и cmake. Broken design мешает, очевидно.

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

Или какие-то части на луа, а а для пользователей (программистов в данном случае) оставить базовый синтаксис CMake. Я просто хочу спросить насколько такая идея интересна?

Идея очень даже интересна. У меня была мысль реализовать базовый набор функций CMake на Lua средствами Premake.

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

Но то, что сейчас у вас есть это как SCons - он тоже блистал в свое время, но сдал позиции

Что поделаешь, c'est la vie. Однако у SCons и сейчас есть своя аудитория, как и у Premake есть своя.

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

Бла-бла-бла... то же самое слышал про waff в своё время слышали. Уж по мне, так по сравнением с сабжем даже waff не кажется такой дурацкой идеей.

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

так как прибит гвоздями к GNU make

Безграмотность.

Просто ужас: почти каждому, кто берется писать свою билд-систему даже в голову не приходит овладеть autotools на достаточном уровне хотя бы для того, чтобы понять с чем именно у них проблемы и как делать надо, а как не надо.

Fail.

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

Бла-бла-бла... то же самое слышал про waff в своё время слышали. Уж по мне, так по сравнением с сабжем даже waff не кажется такой дурацкой идеей.

Во-первых, с одной f, во-вторых, в целом идеология сходна, но Premake, в отличие от waf, это meta build system. Кто-то считает это недостатком, для меня это преимущество.

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

Ну тогда извините, потому что кодить на вашем супер-языке, чтобы сделать из вашей системы конфетку, подходящую для моих проектов, у меня также нет никакого желания. Потому что она, как и CMake, и даже более, далека от совершенства, и я скорее выберу зарекомендовавшую себя систему с (как уже упоминалось) хорошей документацией, набором стандартных модулей и кучей известных FOSS проектов, её использующих. И если уж вы всё-таки не особо знакомы с CMake (что чувствуется), не стоит гнобить его со своей не особо высокой колокольни и делать заявления о функциональности, которую вы не изучили всего лишь потому, что не понравился используемый подход или синтаксис. Прежде чем сравнивать, нужно бы и попользовать, а не просто почитать исходники модулей.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.