From 6a395d9a2998610e507c2aa682170231c36f8785 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Mon, 25 Nov 2013 19:03:06 +0100 Subject: [PATCH] Qt5: enable QML support This patch enables experimental QML support in Qt5. Only the QtQuick plugin is available yet. Currently runs best on Linux and has some problems on NOVA and Fiasco.OC. Fixes #979. --- .gitignore | 1 + libports/lib/import/import-qt5_qml.mk | 7 + .../lib/import/import-qt5_qtquick2plugin.mk | 7 + libports/lib/import/import-qt5_quick.mk | 7 + libports/lib/import/import-qt5_v8.mk | 5 + libports/lib/mk/qt5_qml.mk | 12 + libports/lib/mk/qt5_qml_generated.inc | 239 ++++++ libports/lib/mk/qt5_qtquick2plugin.mk | 39 + .../lib/mk/qt5_qtquick2plugin_generated.inc | 38 + libports/lib/mk/qt5_quick.mk | 11 + libports/lib/mk/qt5_quick_generated.inc | 344 ++++++++ libports/lib/mk/qt5_v8.mk | 83 ++ libports/lib/mk/qt5_v8_generated.inc | 161 ++++ libports/ports/qt5.mk | 12 + libports/run/qt5_quicktest.run | 158 ++++ libports/run/qt5_samegame.run | 158 ++++ .../src/app/qt5/examples/samegame/main.cpp | 19 + .../app/qt5/examples/samegame/samegame.pro | 3 + .../app/qt5/examples/samegame/samegame.qrc | 17 + .../src/app/qt5/examples/samegame/target.mk | 10 + libports/src/app/qt5/qt_quicktest/main.cpp | 19 + .../src/app/qt5/qt_quicktest/qt_quicktest.pro | 5 + .../src/app/qt5/qt_quicktest/qt_quicktest.qml | 32 + .../src/app/qt5/qt_quicktest/qt_quicktest.qrc | 6 + libports/src/app/qt5/qt_quicktest/target.mk | 10 + libports/src/app/qt5/tmpl/target_final.inc | 5 + .../lib/qt5/patches/qt5_configuration.patch | 15 +- libports/src/lib/qt5/patches/qt5_qml.patch | 796 ++++++++++++++++++ libports/src/lib/qt5/patches/series | 1 + .../qt5/qtbase/src/corelib/global/qconfig.cpp | 2 +- .../src/imports/qtquick2/target.mk | 3 + .../create_generated_incs | 6 + 32 files changed, 2227 insertions(+), 4 deletions(-) create mode 100644 libports/lib/import/import-qt5_qml.mk create mode 100644 libports/lib/import/import-qt5_qtquick2plugin.mk create mode 100644 libports/lib/import/import-qt5_quick.mk create mode 100644 libports/lib/import/import-qt5_v8.mk create mode 100644 libports/lib/mk/qt5_qml.mk create mode 100644 libports/lib/mk/qt5_qml_generated.inc create mode 100644 libports/lib/mk/qt5_qtquick2plugin.mk create mode 100644 libports/lib/mk/qt5_qtquick2plugin_generated.inc create mode 100644 libports/lib/mk/qt5_quick.mk create mode 100644 libports/lib/mk/qt5_quick_generated.inc create mode 100644 libports/lib/mk/qt5_v8.mk create mode 100644 libports/lib/mk/qt5_v8_generated.inc create mode 100644 libports/run/qt5_quicktest.run create mode 100644 libports/run/qt5_samegame.run create mode 100644 libports/src/app/qt5/examples/samegame/main.cpp create mode 100644 libports/src/app/qt5/examples/samegame/samegame.pro create mode 100644 libports/src/app/qt5/examples/samegame/samegame.qrc create mode 100644 libports/src/app/qt5/examples/samegame/target.mk create mode 100644 libports/src/app/qt5/qt_quicktest/main.cpp create mode 100644 libports/src/app/qt5/qt_quicktest/qt_quicktest.pro create mode 100644 libports/src/app/qt5/qt_quicktest/qt_quicktest.qml create mode 100644 libports/src/app/qt5/qt_quicktest/qt_quicktest.qrc create mode 100644 libports/src/app/qt5/qt_quicktest/target.mk create mode 100644 libports/src/lib/qt5/patches/qt5_qml.patch create mode 100644 libports/src/lib/qt5/qtdeclarative/src/imports/qtquick2/target.mk diff --git a/.gitignore b/.gitignore index 9a6d3cef3..a911812f6 100644 --- a/.gitignore +++ b/.gitignore @@ -129,6 +129,7 @@ /libports/src/lib/ncurses/make_keys /libports/src/lib/ncurses/names.c /libports/src/lib/ncurses/unctrl.c +/libports/src/lib/qt5/qtjsbackend /libports/src/lib/qt5/qtwebkit/Source/JavaScriptCore /libports/src/lib/qt5/qtwebkit/Source/WebCore/generated /libports/tool/mesa/glsl diff --git a/libports/lib/import/import-qt5_qml.mk b/libports/lib/import/import-qt5_qml.mk new file mode 100644 index 000000000..cb6cbd6ed --- /dev/null +++ b/libports/lib/import/import-qt5_qml.mk @@ -0,0 +1,7 @@ +IMPORT_QT5_INC=$(call select_from_repositories,lib/import/import-qt5.inc) + +include $(IMPORT_QT5_INC) + +QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtdeclarative/include +QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtdeclarative/include/QtQml + diff --git a/libports/lib/import/import-qt5_qtquick2plugin.mk b/libports/lib/import/import-qt5_qtquick2plugin.mk new file mode 100644 index 000000000..3a26dc16a --- /dev/null +++ b/libports/lib/import/import-qt5_qtquick2plugin.mk @@ -0,0 +1,7 @@ +IMPORT_QT5_INC=$(call select_from_repositories,lib/import/import-qt5.inc) + +include $(IMPORT_QT5_INC) + +#QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtdeclarative/include +#QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtdeclarative/include/QtQuick + diff --git a/libports/lib/import/import-qt5_quick.mk b/libports/lib/import/import-qt5_quick.mk new file mode 100644 index 000000000..0f8d0d434 --- /dev/null +++ b/libports/lib/import/import-qt5_quick.mk @@ -0,0 +1,7 @@ +IMPORT_QT5_INC=$(call select_from_repositories,lib/import/import-qt5.inc) + +include $(IMPORT_QT5_INC) + +QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtdeclarative/include +QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtdeclarative/include/QtQuick + diff --git a/libports/lib/import/import-qt5_v8.mk b/libports/lib/import/import-qt5_v8.mk new file mode 100644 index 000000000..b98da501e --- /dev/null +++ b/libports/lib/import/import-qt5_v8.mk @@ -0,0 +1,5 @@ +IMPORT_QT5_INC=$(call select_from_repositories,lib/import/import-qt5.inc) + +include $(IMPORT_QT5_INC) + +QT5_INC_DIR += $(QT5_REP_DIR)/contrib/$(QT5)/qtjsbackend/include/QtV8 diff --git a/libports/lib/mk/qt5_qml.mk b/libports/lib/mk/qt5_qml.mk new file mode 100644 index 000000000..e7c42aa1a --- /dev/null +++ b/libports/lib/mk/qt5_qml.mk @@ -0,0 +1,12 @@ +include $(REP_DIR)/lib/import/import-qt5_qml.mk + +SHARED_LIB = yes + +include $(REP_DIR)/lib/mk/qt5_qml_generated.inc + +include $(REP_DIR)/lib/mk/qt5.inc + +#INC_DIR += $(REP_DIR)/include/qt5/qtbase/QtXml/private \ +# $(REP_DIR)/contrib/$(QT5)/qtbase/include/QtCore/$(QT_VERSION)/QtCore \ + +LIBS += qt5_v8 qt5_core libc diff --git a/libports/lib/mk/qt5_qml_generated.inc b/libports/lib/mk/qt5_qml_generated.inc new file mode 100644 index 000000000..34b03928e --- /dev/null +++ b/libports/lib/mk/qt5_qml_generated.inc @@ -0,0 +1,239 @@ +QT_DEFINES += -DQT_NO_LIBUDEV -DQT_NO_XCB -DQT_NO_XKBCOMMON -DQT_NO_URL_CAST_FROM_STRING -DQT_NO_INTEGER_EVENT_COORDINATES -DQT_BUILD_QML_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_V8_LIB -DV8_SHARED -DUSING_V8_SHARED + +QT_INCPATH += \ + qtbase/include \ + qtbase/include/QtCore \ + qtbase/include/QtCore/5.1.0 \ + qtbase/include/QtCore/5.1.0/QtCore \ + qtbase/include/QtNetwork \ + qtbase/mkspecs/genode-g++ \ + qtdeclarative/include \ + qtdeclarative/include/QtQml \ + qtdeclarative/include/QtQml/5.1.0 \ + qtdeclarative/include/QtQml/5.1.0/QtQml \ + qtdeclarative/src/qml \ + qtdeclarative/src/qml/animations \ + qtjsbackend/include \ + qtjsbackend/include/QtV8 \ + qtjsbackend/include/QtV8/5.1.0 \ + qtjsbackend/include/QtV8/5.1.0/QtV8 \ + +QT_SOURCES += \ + qqmlchangeset.cpp \ + qqmllistaccessor.cpp \ + qqmllistcompositor.cpp \ + qqmladaptormodel.cpp \ + qqmlpropertymap.cpp \ + qqmlinstruction.cpp \ + qqmlopenmetaobject.cpp \ + qqmlvmemetaobject.cpp \ + qqmlengine.cpp \ + qqmlexpression.cpp \ + qqmlproperty.cpp \ + qqmlcomponent.cpp \ + qqmlincubator.cpp \ + qqmlcontext.cpp \ + qqmlcustomparser.cpp \ + qqmlpropertyvaluesource.cpp \ + qqmlpropertyvalueinterceptor.cpp \ + qqmlproxymetaobject.cpp \ + qqmlvme.cpp \ + qqmlcompiler.cpp \ + qqmlcompileddata.cpp \ + qqmlboundsignal.cpp \ + qqmlmetatype.cpp \ + qqmlstringconverters.cpp \ + qqmlparserstatus.cpp \ + qqmltypeloader.cpp \ + qqmlinfo.cpp \ + qqmlerror.cpp \ + qqmlscript.cpp \ + qqmlrewrite.cpp \ + qqmlvaluetype.cpp \ + qqmlaccessors.cpp \ + qqmlxmlhttprequest.cpp \ + qqmlwatcher.cpp \ + qqmlcleanup.cpp \ + qqmlpropertycache.cpp \ + qqmlnotifier.cpp \ + qqmlintegercache.cpp \ + qqmltypenotavailable.cpp \ + qqmltypenamecache.cpp \ + qqmlscriptstring.cpp \ + qqmlnetworkaccessmanagerfactory.cpp \ + qqmldirparser.cpp \ + qqmlextensionplugin.cpp \ + qqmlimport.cpp \ + qqmllist.cpp \ + qqmllocale.cpp \ + qqmlabstractexpression.cpp \ + qqmljavascriptexpression.cpp \ + qqmlabstractbinding.cpp \ + qqmlvaluetypeproxybinding.cpp \ + qqmlglobal.cpp \ + qqmlfile.cpp \ + qqmlbundle.cpp \ + qqmlmemoryprofiler.cpp \ + qqmlplatform.cpp \ + qqmlbinding.cpp \ + qqmlabstracturlinterceptor.cpp \ + qqmlapplicationengine.cpp \ + qqmljsast.cpp \ + qqmljsastvisitor.cpp \ + qqmljsengine_p.cpp \ + qqmljsgrammar.cpp \ + qqmljslexer.cpp \ + qqmljsparser.cpp \ + textwriter.cpp \ + qintrusivelist.cpp \ + qhashedstring.cpp \ + qqmlpool.cpp \ + qqmlthread.cpp \ + qqmltrace.cpp \ + qv4compiler.cpp \ + qv4ir.cpp \ + qv4irbuilder.cpp \ + qv4instruction.cpp \ + qv4bindings.cpp \ + qjsengine.cpp \ + qjsvalue.cpp \ + qjsvalueiterator.cpp \ + qv8stringwrapper.cpp \ + qv8engine.cpp \ + qv8sequencewrapper.cpp \ + qv8contextwrapper.cpp \ + qv8qobjectwrapper.cpp \ + qv8typewrapper.cpp \ + qv8listwrapper.cpp \ + qv8variantwrapper.cpp \ + qv8valuetypewrapper.cpp \ + qv8jsonwrapper.cpp \ + qv8include.cpp \ + qv8worker.cpp \ + qv8bindings.cpp \ + qv8domerrors.cpp \ + qv8sqlerrors.cpp \ + qqmlbuiltinfunctions.cpp \ + qqmldebugservice.cpp \ + qqmlprofilerservice.cpp \ + qqmldebugserver.cpp \ + qqmlinspectorservice.cpp \ + qv8debugservice.cpp \ + qv8profilerservice.cpp \ + qqmlenginedebugservice.cpp \ + qdebugmessageservice.cpp \ + qabstractanimationjob.cpp \ + qanimationgroupjob.cpp \ + qsequentialanimationgroupjob.cpp \ + qparallelanimationgroupjob.cpp \ + qpauseanimationjob.cpp \ + qqmlbind.cpp \ + qqmlconnections.cpp \ + qqmldelegatemodel.cpp \ + qqmllistmodel.cpp \ + qqmllistmodelworkeragent.cpp \ + qqmlmodelsmodule.cpp \ + qqmlobjectmodel.cpp \ + qqmltimer.cpp \ + qquickpackage.cpp \ + qquickworkerscript.cpp \ + qqmlinstantiator.cpp \ + moc_qqmlpropertymap.cpp \ + moc_qqmlglobal_p.cpp \ + moc_qqmlcomponent.cpp \ + moc_qqmlengine.cpp \ + moc_qqmlcontext.cpp \ + moc_qqmlvaluetype_p.cpp \ + moc_qqmlwatcher_p.cpp \ + moc_qqmltypenotavailable_p.cpp \ + moc_qqmlextensionplugin.cpp \ + moc_qqmllocale_p.cpp \ + moc_qqmlcomponentattached_p.cpp \ + moc_qqmlplatform_p.cpp \ + moc_qv8include_p.cpp \ + moc_qqmldebugservice_p.cpp \ + moc_qqmlinspectorservice_p.cpp \ + moc_qv8debugservice_p.cpp \ + moc_qv8profilerservice_p.cpp \ + moc_qqmlenginedebugservice_p.cpp \ + moc_qdebugmessageservice_p.cpp \ + moc_qabstractanimationjob_p.cpp \ + moc_qqmlbind_p.cpp \ + moc_qqmlconnections_p.cpp \ + moc_qqmldelegatemodel_p.cpp \ + moc_qqmldelegatemodel_p_p.cpp \ + moc_qqmllistmodel_p.cpp \ + moc_qqmllistmodel_p_p.cpp \ + moc_qqmllistmodelworkeragent_p.cpp \ + moc_qqmlobjectmodel_p.cpp \ + moc_qqmltimer_p.cpp \ + moc_qquickpackage_p.cpp \ + moc_qquickworkerscript_p.cpp + +QT_VPATH += \ + qtdeclarative/src/qml/animations \ + qtdeclarative/src/qml/debugger \ + qtdeclarative/src/qml/qml \ + qtdeclarative/src/qml/qml/ftw \ + qtdeclarative/src/qml/qml/parser \ + qtdeclarative/src/qml/qml/rewriter \ + qtdeclarative/src/qml/qml/v4 \ + qtdeclarative/src/qml/qml/v8 \ + qtdeclarative/src/qml/types \ + qtdeclarative/src/qml/util \ + +# some source files need to be generated by moc from other source/header files before +# they get #included again by the original source file in the compiling stage + +# source files generated from existing header files ('moc_%.cpp: %.h' rule in import-qt5.inc) +# extracted from 'compiler_moc_header_make_all' target + +COMPILER_MOC_HEADER_MAKE_ALL_FILES = \ + moc_qqmlpropertymap.cpp \ + moc_qqmlglobal_p.cpp \ + moc_qqmlcomponent.cpp \ + moc_qqmlengine.cpp \ + moc_qqmlcontext.cpp \ + moc_qqmlexpression.cpp \ + moc_qqmlvaluetype_p.cpp \ + moc_qqmlwatcher_p.cpp \ + moc_qqmltypenotavailable_p.cpp \ + moc_qqmlextensionplugin.cpp \ + moc_qqmllocale_p.cpp \ + moc_qqmlcomponentattached_p.cpp \ + moc_qqmlplatform_p.cpp \ + moc_qqmlapplicationengine.cpp \ + moc_qjsengine.cpp \ + moc_qv8include_p.cpp \ + moc_qqmldebugservice_p.cpp \ + moc_qqmldebugserver_p.cpp \ + moc_qqmlinspectorservice_p.cpp \ + moc_qv8debugservice_p.cpp \ + moc_qv8profilerservice_p.cpp \ + moc_qqmlenginedebugservice_p.cpp \ + moc_qdebugmessageservice_p.cpp \ + moc_qabstractanimationjob_p.cpp \ + moc_qqmlbind_p.cpp \ + moc_qqmlconnections_p.cpp \ + moc_qqmldelegatemodel_p.cpp \ + moc_qqmldelegatemodel_p_p.cpp \ + moc_qqmllistmodel_p.cpp \ + moc_qqmllistmodel_p_p.cpp \ + moc_qqmllistmodelworkeragent_p.cpp \ + moc_qqmlobjectmodel_p.cpp \ + moc_qqmltimer_p.cpp \ + moc_qquickpackage_p.cpp \ + moc_qquickworkerscript_p.cpp \ + moc_qqmlinstantiator_p.cpp + +# source files generated from existing source files ('%.moc: %.cpp' rule in import-qt5.inc) +# extracted from 'compiler_moc_source_make_all' rule + +COMPILER_MOC_SOURCE_MAKE_ALL_FILES = \ + qqmladaptormodel.moc \ + qqmltypeloader.moc \ + qqmlxmlhttprequest.moc \ + qqmlwatcher.moc \ + qqmlfile.moc \ + qquickworkerscript.moc + diff --git a/libports/lib/mk/qt5_qtquick2plugin.mk b/libports/lib/mk/qt5_qtquick2plugin.mk new file mode 100644 index 000000000..95d5ea083 --- /dev/null +++ b/libports/lib/mk/qt5_qtquick2plugin.mk @@ -0,0 +1,39 @@ +include $(REP_DIR)/lib/import/import-qt5_qtquick2plugin.mk + +SHARED_LIB = yes + +include $(REP_DIR)/lib/mk/qt5_qtquick2plugin_generated.inc + +QT_DEFINES += -UQT_STATICPLUGIN + +include $(REP_DIR)/lib/mk/qt5.inc + +LIBS += qt5_qml + +# install the QtQuick QML plugin + +QTQUICK_INSTALL_DIR := $(BUILD_BASE_DIR)/bin/qt5_fs/qt5/qml/QtQuick.2 +QTQUICK_QMLDIR := $(QTQUICK_INSTALL_DIR)/qmldir +QTQUICK_PLUGIN_NAME := qt5_qtquick2plugin.lib.so +QTQUICK_PLUGIN := $(QTQUICK_INSTALL_DIR)/$(QTQUICK_PLUGIN_NAME) + +$(QTQUICK_INSTALL_DIR): + $(VERBOSE)mkdir -p $@ + +$(QTQUICK_QMLDIR): $(QTQUICK_INSTALL_DIR) + $(VERBOSE)cp $(REP_DIR)/contrib/$(QT5)/qtdeclarative/src/imports/qtquick2/qmldir $(QTQUICK_INSTALL_DIR) + +$(QTQUICK_PLUGIN): $(QTQUICK_INSTALL_DIR) + $(VERBOSE)ln -sf $(BUILD_BASE_DIR)/bin/$(QTQUICK_PLUGIN_NAME) $(QTQUICK_INSTALL_DIR)/$(QTQUICK_PLUGIN_NAME) + +all: $(QTQUICK_QMLDIR) $(QTQUICK_PLUGIN) + +# +# unfortunately, these clean rules don't trigger +# + +clean-qtquick_install_dir: + rm -rf $(QTQUICK_INSTALL_DIR) + +clean: clean-qtquick_install_dir + diff --git a/libports/lib/mk/qt5_qtquick2plugin_generated.inc b/libports/lib/mk/qt5_qtquick2plugin_generated.inc new file mode 100644 index 000000000..828baa974 --- /dev/null +++ b/libports/lib/mk/qt5_qtquick2plugin_generated.inc @@ -0,0 +1,38 @@ +QT_DEFINES += -DQT_NO_LIBUDEV -DQT_NO_XCB -DQT_NO_XKBCOMMON -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_PLUGIN -DQT_QUICK_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB + +QT_INCPATH += \ + qtbase/include \ + qtbase/include/QtCore \ + qtbase/include/QtGui \ + qtbase/include/QtNetwork \ + qtbase/mkspecs/genode-g++ \ + qtdeclarative/include \ + qtdeclarative/include/QtQml \ + qtdeclarative/include/QtQml/5.1.0 \ + qtdeclarative/include/QtQml/5.1.0/QtQml \ + qtdeclarative/include/QtQuick \ + qtdeclarative/include/QtQuick/5.1.0 \ + qtdeclarative/include/QtQuick/5.1.0/QtQuick \ + qtdeclarative/src/imports/qtquick2 \ + +QT_SOURCES += \ + plugin.cpp + +QT_VPATH += \ + qtdeclarative/src/imports/qtquick2 \ + +# some source files need to be generated by moc from other source/header files before +# they get #included again by the original source file in the compiling stage + +# source files generated from existing header files ('moc_%.cpp: %.h' rule in import-qt5.inc) +# extracted from 'compiler_moc_header_make_all' target + +COMPILER_MOC_HEADER_MAKE_ALL_FILES = \ + + +# source files generated from existing source files ('%.moc: %.cpp' rule in import-qt5.inc) +# extracted from 'compiler_moc_source_make_all' rule + +COMPILER_MOC_SOURCE_MAKE_ALL_FILES = \ + plugin.moc + diff --git a/libports/lib/mk/qt5_quick.mk b/libports/lib/mk/qt5_quick.mk new file mode 100644 index 000000000..ec180d95e --- /dev/null +++ b/libports/lib/mk/qt5_quick.mk @@ -0,0 +1,11 @@ +include $(REP_DIR)/lib/import/import-qt5_quick.mk + +SHARED_LIB = yes + +include $(REP_DIR)/lib/mk/qt5_quick_generated.inc + +QT_INCPATH += qtdeclarative/src/quick/items + +include $(REP_DIR)/lib/mk/qt5.inc + +LIBS += qt5_qml diff --git a/libports/lib/mk/qt5_quick_generated.inc b/libports/lib/mk/qt5_quick_generated.inc new file mode 100644 index 000000000..1f59c2c2f --- /dev/null +++ b/libports/lib/mk/qt5_quick_generated.inc @@ -0,0 +1,344 @@ +QT_DEFINES += -DQT_NO_LIBUDEV -DQT_NO_XCB -DQT_NO_XKBCOMMON -DQT_NO_URL_CAST_FROM_STRING -DQT_NO_INTEGER_EVENT_COORDINATES -DQT_BUILD_QUICK_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_V8_LIB -DV8_SHARED -DUSING_V8_SHARED + +QT_INCPATH += \ + qtbase/include \ + qtbase/include/QtCore \ + qtbase/include/QtCore/5.1.0 \ + qtbase/include/QtCore/5.1.0/QtCore \ + qtbase/include/QtGui \ + qtbase/include/QtGui/5.1.0 \ + qtbase/include/QtGui/5.1.0/QtGui \ + qtbase/include/QtNetwork \ + qtbase/mkspecs/genode-g++ \ + qtdeclarative/include \ + qtdeclarative/include/QtQml \ + qtdeclarative/include/QtQml/5.1.0 \ + qtdeclarative/include/QtQml/5.1.0/QtQml \ + qtdeclarative/include/QtQuick \ + qtdeclarative/include/QtQuick/5.1.0 \ + qtdeclarative/include/QtQuick/5.1.0/QtQuick \ + qtdeclarative/src/quick \ + qtjsbackend/include \ + qtjsbackend/include/QtV8 \ + qtjsbackend/include/QtV8/5.1.0 \ + qtjsbackend/include/QtV8/5.1.0/QtV8 \ + +QT_SOURCES += \ + qquickapplication.cpp \ + qquickutilmodule.cpp \ + qquickanimation.cpp \ + qquicksystempalette.cpp \ + qquickspringanimation.cpp \ + qquicksmoothedanimation.cpp \ + qquickanimationcontroller.cpp \ + qquickstate.cpp \ + qquicktransitionmanager.cpp \ + qquickstatechangescript.cpp \ + qquickpropertychanges.cpp \ + qquickstategroup.cpp \ + qquicktransition.cpp \ + qquicktimeline.cpp \ + qquickpixmapcache.cpp \ + qquickbehavior.cpp \ + qquickfontloader.cpp \ + qquickstyledtext.cpp \ + qquickpath.cpp \ + qquickpathinterpolator.cpp \ + qquickimageprovider.cpp \ + qquicksvgparser.cpp \ + qquickvaluetypes.cpp \ + qquickglobal.cpp \ + qsgdefaultrenderer.cpp \ + qsggeometry.cpp \ + qsgmaterial.cpp \ + qsgnode.cpp \ + qsgnodeupdater.cpp \ + qsgrenderer.cpp \ + qsgrendernode.cpp \ + qsgsimplematerial.cpp \ + qsgareaallocator.cpp \ + qsgdepthstencilbuffer.cpp \ + qsgflatcolormaterial.cpp \ + qsgsimplerectnode.cpp \ + qsgsimpletexturenode.cpp \ + qsgtexturematerial.cpp \ + qsgvertexcolormaterial.cpp \ + qsgtexture.cpp \ + qsgtextureprovider.cpp \ + qsgpainternode.cpp \ + qsgdistancefieldutil.cpp \ + qsgadaptationlayer.cpp \ + qsgcontext.cpp \ + qsgcontextplugin.cpp \ + qsgdefaultglyphnode.cpp \ + qsgdefaultglyphnode_p.cpp \ + qsgdefaultdistancefieldglyphcache.cpp \ + qsgdistancefieldglyphnode.cpp \ + qsgdistancefieldglyphnode_p.cpp \ + qsgdefaultimagenode.cpp \ + qsgdefaultrectanglenode.cpp \ + qsgflashnode.cpp \ + qsgshareddistancefieldglyphcache.cpp \ + qsgrenderloop.cpp \ + qsgthreadedrenderloop.cpp \ + qsgwindowsrenderloop.cpp \ + qquickevents.cpp \ + qquickanchors.cpp \ + qquickitem.cpp \ + qquickrectangle.cpp \ + qquickwindow.cpp \ + qquickfocusscope.cpp \ + qquickitemsmodule.cpp \ + qquickpainteditem.cpp \ + qquicktext.cpp \ + qquicktextnode.cpp \ + qquicktextnodeengine.cpp \ + qquicktextinput.cpp \ + qquicktextcontrol.cpp \ + qquicktextdocument.cpp \ + qquicktextedit.cpp \ + qquicktextutil.cpp \ + qquickimagebase.cpp \ + qquickimage.cpp \ + qquickborderimage.cpp \ + qquickscalegrid.cpp \ + qquickmousearea.cpp \ + qquickpincharea.cpp \ + qquickflickable.cpp \ + qquicklistview.cpp \ + qquickrepeater.cpp \ + qquickgridview.cpp \ + qquickpathview.cpp \ + qquickpositioners.cpp \ + qquickloader.cpp \ + qquickanimatedimage.cpp \ + qquickflipable.cpp \ + qquicktranslate.cpp \ + qquickclipnode.cpp \ + qquickview.cpp \ + qquickitemanimation.cpp \ + qquickstateoperations.cpp \ + qquickimplicitsizeitem.cpp \ + qquickspriteengine.cpp \ + qquicksprite.cpp \ + qquickspritesequence.cpp \ + qquickanimatedsprite.cpp \ + qquickaccessibleattached.cpp \ + qquickdrag.cpp \ + qquickdroparea.cpp \ + qquickmultipointtoucharea.cpp \ + qquickitemview.cpp \ + qquickitemviewtransition.cpp \ + qquickwindowmodule.cpp \ + qquickscreen.cpp \ + qquickshadereffect.cpp \ + qquickshadereffectmesh.cpp \ + qquickshadereffectnode.cpp \ + qquickshadereffectsource.cpp \ + qquickcanvasitem.cpp \ + qquickcanvascontext.cpp \ + qquickcontext2d.cpp \ + qquickcontext2dtile.cpp \ + qquickcontext2dtexture.cpp \ + qquickcontext2dcommandbuffer.cpp \ + designersupport.cpp \ + designerwindowmanager.cpp \ + qtquick2.cpp \ + moc_qquickapplication_p.cpp \ + moc_qquickanimation_p.cpp \ + moc_qquicksystempalette_p.cpp \ + moc_qquickspringanimation_p.cpp \ + moc_qquickanimationcontroller_p.cpp \ + moc_qquicksmoothedanimation_p.cpp \ + moc_qquicksmoothedanimation_p_p.cpp \ + moc_qquickstate_p.cpp \ + moc_qquickpropertychanges_p.cpp \ + moc_qquickstategroup_p.cpp \ + moc_qquicktransition_p.cpp \ + moc_qquicktimeline_p_p.cpp \ + moc_qquickpixmapcache_p.cpp \ + moc_qquickbehavior_p.cpp \ + moc_qquickfontloader_p.cpp \ + moc_qquickpath_p.cpp \ + moc_qquickpathinterpolator_p.cpp \ + moc_qquickvaluetypes_p.cpp \ + moc_qsgdefaultrenderer_p.cpp \ + moc_qsgrenderer_p.cpp \ + moc_qsgtexture.cpp \ + moc_qsgtexture_p.cpp \ + moc_qsgtextureprovider.cpp \ + moc_qsgcontext_p.cpp \ + moc_qsgcontextplugin_p.cpp \ + moc_qsgshareddistancefieldglyphcache_p.cpp \ + moc_qsgrenderloop_p.cpp \ + moc_qsgthreadedrenderloop_p.cpp \ + moc_qsgwindowsrenderloop_p.cpp \ + moc_qquickevents_p_p.cpp \ + moc_qquickaccessibleattached_p.cpp \ + moc_qquickitem_p.cpp \ + moc_qquickrectangle_p.cpp \ + moc_qquickwindow_p.cpp \ + moc_qquickfocusscope_p.cpp \ + moc_qquickpainteditem.cpp \ + moc_qquicktext_p.cpp \ + moc_qquicktext_p_p.cpp \ + moc_qquicktextinput_p.cpp \ + moc_qquicktextdocument.cpp \ + moc_qquicktextedit_p.cpp \ + moc_qquicktextutil_p.cpp \ + moc_qquickimagebase_p.cpp \ + moc_qquickimage_p.cpp \ + moc_qquickborderimage_p.cpp \ + moc_qquickscalegrid_p_p.cpp \ + moc_qquickmousearea_p.cpp \ + moc_qquickpincharea_p.cpp \ + moc_qquickflickable_p.cpp \ + moc_qquickflickable_p_p.cpp \ + moc_qquicklistview_p.cpp \ + moc_qquickrepeater_p.cpp \ + moc_qquickgridview_p.cpp \ + moc_qquickpathview_p.cpp \ + moc_qquickpositioners_p.cpp \ + moc_qquickanimatedimage_p.cpp \ + moc_qquickflipable_p.cpp \ + moc_qquicktranslate_p.cpp \ + moc_qquickview.cpp \ + moc_qquickitemanimation_p.cpp \ + moc_qquickimplicitsizeitem_p.cpp \ + moc_qquickspriteengine_p.cpp \ + moc_qquicksprite_p.cpp \ + moc_qquickspritesequence_p.cpp \ + moc_qquickanimatedsprite_p.cpp \ + moc_qquickdrag_p.cpp \ + moc_qquickdroparea_p.cpp \ + moc_qquickmultipointtoucharea_p.cpp \ + moc_qquickitemview_p.cpp \ + moc_qquickitemviewtransition_p.cpp \ + moc_qquickscreen_p.cpp \ + moc_qquickshadereffect_p.cpp \ + moc_qquickshadereffectmesh_p.cpp \ + moc_qquickshadereffectnode_p.cpp \ + moc_qquickshadereffectsource_p.cpp \ + moc_qquickcanvasitem_p.cpp \ + moc_qquickcanvascontext_p.cpp \ + moc_qquickcontext2dtexture_p.cpp \ + moc_designerwindowmanager_p.cpp + +QT_VPATH += \ + qtdeclarative/src/quick \ + qtdeclarative/src/quick/designer \ + qtdeclarative/src/quick/items \ + qtdeclarative/src/quick/items/context2d \ + qtdeclarative/src/quick/scenegraph \ + qtdeclarative/src/quick/scenegraph/coreapi \ + qtdeclarative/src/quick/scenegraph/util \ + qtdeclarative/src/quick/util \ + +# some source files need to be generated by moc from other source/header files before +# they get #included again by the original source file in the compiling stage + +# source files generated from existing header files ('moc_%.cpp: %.h' rule in import-qt5.inc) +# extracted from 'compiler_moc_header_make_all' target + +COMPILER_MOC_HEADER_MAKE_ALL_FILES = \ + moc_qquickapplication_p.cpp \ + moc_qquickanimation_p.cpp \ + moc_qquicksystempalette_p.cpp \ + moc_qquickspringanimation_p.cpp \ + moc_qquickanimationcontroller_p.cpp \ + moc_qquicksmoothedanimation_p.cpp \ + moc_qquicksmoothedanimation_p_p.cpp \ + moc_qquickstate_p.cpp \ + moc_qquickstatechangescript_p.cpp \ + moc_qquickpropertychanges_p.cpp \ + moc_qquickstategroup_p.cpp \ + moc_qquicktransition_p.cpp \ + moc_qquicktimeline_p_p.cpp \ + moc_qquickpixmapcache_p.cpp \ + moc_qquickbehavior_p.cpp \ + moc_qquickfontloader_p.cpp \ + moc_qquickpath_p.cpp \ + moc_qquickpathinterpolator_p.cpp \ + moc_qquickvaluetypes_p.cpp \ + moc_qsgdefaultrenderer_p.cpp \ + moc_qsgrenderer_p.cpp \ + moc_qsgtexture.cpp \ + moc_qsgtexture_p.cpp \ + moc_qsgtextureprovider.cpp \ + moc_qsgcontext_p.cpp \ + moc_qsgcontextplugin_p.cpp \ + moc_qsgshareddistancefieldglyphcache_p.cpp \ + moc_qsgrenderloop_p.cpp \ + moc_qsgthreadedrenderloop_p.cpp \ + moc_qsgwindowsrenderloop_p.cpp \ + moc_qquickevents_p_p.cpp \ + moc_qquickanchors_p.cpp \ + moc_qquickaccessibleattached_p.cpp \ + moc_qquickitem.cpp \ + moc_qquickitem_p.cpp \ + moc_qquickrectangle_p.cpp \ + moc_qquickwindow.cpp \ + moc_qquickwindow_p.cpp \ + moc_qquickfocusscope_p.cpp \ + moc_qquickpainteditem.cpp \ + moc_qquicktext_p.cpp \ + moc_qquicktext_p_p.cpp \ + moc_qquicktextinput_p.cpp \ + moc_qquicktextcontrol_p.cpp \ + moc_qquicktextdocument.cpp \ + moc_qquicktextedit_p.cpp \ + moc_qquicktextutil_p.cpp \ + moc_qquickimagebase_p.cpp \ + moc_qquickimage_p.cpp \ + moc_qquickborderimage_p.cpp \ + moc_qquickscalegrid_p_p.cpp \ + moc_qquickmousearea_p.cpp \ + moc_qquickpincharea_p.cpp \ + moc_qquickflickable_p.cpp \ + moc_qquickflickable_p_p.cpp \ + moc_qquicklistview_p.cpp \ + moc_qquickrepeater_p.cpp \ + moc_qquickgridview_p.cpp \ + moc_qquickpathview_p.cpp \ + moc_qquickpositioners_p.cpp \ + moc_qquickloader_p.cpp \ + moc_qquickanimatedimage_p.cpp \ + moc_qquickflipable_p.cpp \ + moc_qquicktranslate_p.cpp \ + moc_qquickview.cpp \ + moc_qquickitemanimation_p.cpp \ + moc_qquickstateoperations_p.cpp \ + moc_qquickimplicitsizeitem_p.cpp \ + moc_qquickspriteengine_p.cpp \ + moc_qquicksprite_p.cpp \ + moc_qquickspritesequence_p.cpp \ + moc_qquickanimatedsprite_p.cpp \ + moc_qquickdrag_p.cpp \ + moc_qquickdroparea_p.cpp \ + moc_qquickmultipointtoucharea_p.cpp \ + moc_qquickitemview_p.cpp \ + moc_qquickitemviewtransition_p.cpp \ + moc_qquickscreen_p.cpp \ + moc_qquickshadereffect_p.cpp \ + moc_qquickshadereffectmesh_p.cpp \ + moc_qquickshadereffectnode_p.cpp \ + moc_qquickshadereffectsource_p.cpp \ + moc_qquickcanvasitem_p.cpp \ + moc_qquickcanvascontext_p.cpp \ + moc_qquickcontext2dtexture_p.cpp \ + moc_designerwindowmanager_p.cpp + +# source files generated from existing source files ('%.moc: %.cpp' rule in import-qt5.inc) +# extracted from 'compiler_moc_source_make_all' rule + +COMPILER_MOC_SOURCE_MAKE_ALL_FILES = \ + qquickpixmapcache.moc \ + qquickfontloader.moc \ + qsgrenderloop.moc \ + qsgthreadedrenderloop.moc \ + qquickwindow.moc \ + qquickimage.moc \ + qquickflipable.moc \ + qquickwindowmodule.moc \ + qquickshadereffectsource.moc + diff --git a/libports/lib/mk/qt5_v8.mk b/libports/lib/mk/qt5_v8.mk new file mode 100644 index 000000000..67dc909d1 --- /dev/null +++ b/libports/lib/mk/qt5_v8.mk @@ -0,0 +1,83 @@ +include $(REP_DIR)/lib/import/import-qt5_v8.mk + +SHARED_LIB = yes + +include $(REP_DIR)/lib/mk/qt5_v8_generated.inc + +# +# Qt was configured for x86_64. +# If the Genode target architecture differs, the x86_64-files need to get removed first. +# +ifneq ($(filter-out $(SPECS),x86_64),) +QT_DEFINES += -UV8_TARGET_ARCH_X64 +QT_SOURCES_FILTER_OUT = \ + assembler-x64.cc \ + builtins-x64.cc \ + code-stubs-x64.cc \ + codegen-x64.cc \ + cpu-x64.cc \ + debug-x64.cc \ + deoptimizer-x64.cc \ + disasm-x64.cc \ + frames-x64.cc \ + full-codegen-x64.cc \ + ic-x64.cc \ + lithium-codegen-x64.cc \ + lithium-gap-resolver-x64.cc \ + lithium-x64.cc \ + macro-assembler-x64.cc \ + regexp-macro-assembler-x64.cc \ + stub-cache-x64.cc +ifeq ($(filter-out $(SPECS),x86_32),) +QT_DEFINES += -DV8_TARGET_ARCH_IA32 +QT_SOURCES += \ + assembler-ia32.cc \ + builtins-ia32.cc \ + code-stubs-ia32.cc \ + codegen-ia32.cc \ + cpu-ia32.cc \ + debug-ia32.cc \ + deoptimizer-ia32.cc \ + disasm-ia32.cc \ + frames-ia32.cc \ + full-codegen-ia32.cc \ + ic-ia32.cc \ + lithium-codegen-ia32.cc \ + lithium-gap-resolver-ia32.cc \ + lithium-ia32.cc \ + macro-assembler-ia32.cc \ + regexp-macro-assembler-ia32.cc \ + stub-cache-ia32.cc +QT_VPATH += qtjsbackend/src/3rdparty/v8/src/ia32 +else +ifeq ($(filter-out $(SPECS),arm),) +QT_DEFINES += -DV8_TARGET_ARCH_ARM +QT_SOURCES += \ + assembler-arm.cc \ + builtins-arm.cc \ + code-stubs-arm.cc \ + codegen-arm.cc \ + cpu-arm.cc \ + debug-arm.cc \ + deoptimizer-arm.cc \ + disasm-arm.cc \ + frames-arm.cc \ + full-codegen-arm.cc \ + ic-arm.cc \ + lithium-codegen-arm.cc \ + lithium-gap-resolver-arm.cc \ + lithium-arm.cc \ + macro-assembler-arm.cc \ + regexp-macro-assembler-arm.cc \ + stub-cache-arm.cc +QT_VPATH += qtjsbackend/src/3rdparty/v8/src/arm +endif +endif +endif + +QT_VPATH += qtjsbackend/generated + +include $(REP_DIR)/lib/mk/qt5.inc + +LIBS += qt5_network + diff --git a/libports/lib/mk/qt5_v8_generated.inc b/libports/lib/mk/qt5_v8_generated.inc new file mode 100644 index 000000000..14fdc5df2 --- /dev/null +++ b/libports/lib/mk/qt5_v8_generated.inc @@ -0,0 +1,161 @@ +QT_DEFINES += -DQT_NO_LIBUDEV -DQT_NO_XCB -DQT_NO_XKBCOMMON -DQT_BUILD_V8_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DV8_SHARED -DBUILDING_V8_SHARED -DENABLE_DEBUGGER_SUPPORT -DENABLE_VMSTATE_TRACKING -DENABLE_LOGGING_AND_PROFILING -DNDEBUG -DV8_TARGET_ARCH_X64 -DQT_NO_EXCEPTIONS -DQT_NO_DEBUG + +QT_INCPATH += \ + qtbase/mkspecs/genode-g++ \ + qtjsbackend/include \ + qtjsbackend/include/QtV8 \ + qtjsbackend/include/QtV8/5.1.0 \ + qtjsbackend/include/QtV8/5.1.0/QtV8 \ + qtjsbackend/src/3rdparty/v8/src \ + qtjsbackend/src/v8 \ + +QT_SOURCES += \ + accessors.cc \ + allocation.cc \ + api.cc \ + assembler.cc \ + ast.cc \ + atomicops_internals_x86_gcc.cc \ + bignum.cc \ + bignum-dtoa.cc \ + bootstrapper.cc \ + builtins.cc \ + cached-powers.cc \ + checks.cc \ + circular-queue.cc \ + code-stubs.cc \ + codegen.cc \ + compilation-cache.cc \ + compiler.cc \ + contexts.cc \ + conversions.cc \ + counters.cc \ + cpu-profiler.cc \ + data-flow.cc \ + date.cc \ + dateparser.cc \ + debug-agent.cc \ + debug.cc \ + deoptimizer.cc \ + disassembler.cc \ + diy-fp.cc \ + dtoa.cc \ + elements.cc \ + elements-kind.cc \ + execution.cc \ + factory.cc \ + flags.cc \ + frames.cc \ + full-codegen.cc \ + func-name-inferrer.cc \ + gdb-jit.cc \ + global-handles.cc \ + fast-dtoa.cc \ + fixed-dtoa.cc \ + handles.cc \ + heap-profiler.cc \ + heap.cc \ + hydrogen.cc \ + hydrogen-instructions.cc \ + ic.cc \ + incremental-marking.cc \ + inspector.cc \ + interface.cc \ + interpreter-irregexp.cc \ + isolate.cc \ + jsregexp.cc \ + lithium-allocator.cc \ + lithium.cc \ + liveedit.cc \ + liveobjectlist.cc \ + log-utils.cc \ + log.cc \ + mark-compact.cc \ + messages.cc \ + objects.cc \ + objects-printer.cc \ + objects-visiting.cc \ + once.cc \ + optimizing-compiler-thread.cc \ + parser.cc \ + preparser.cc \ + preparse-data.cc \ + profile-generator.cc \ + property.cc \ + regexp-macro-assembler-irregexp.cc \ + regexp-macro-assembler.cc \ + regexp-stack.cc \ + rewriter.cc \ + runtime.cc \ + runtime-profiler.cc \ + safepoint-table.cc \ + scanner.cc \ + scanner-character-streams.cc \ + scopeinfo.cc \ + scopes.cc \ + serialize.cc \ + snapshot-common.cc \ + spaces.cc \ + string-search.cc \ + string-stream.cc \ + strtod.cc \ + stub-cache.cc \ + token.cc \ + transitions.cc \ + type-info.cc \ + unicode.cc \ + utils.cc \ + v8-counters.cc \ + v8.cc \ + v8conversions.cc \ + v8threads.cc \ + v8utils.cc \ + variables.cc \ + version.cc \ + store-buffer.cc \ + zone.cc \ + externalize-string-extension.cc \ + gc-extension.cc \ + statistics-extension.cc \ + assembler-x64.cc \ + builtins-x64.cc \ + code-stubs-x64.cc \ + codegen-x64.cc \ + cpu-x64.cc \ + debug-x64.cc \ + deoptimizer-x64.cc \ + disasm-x64.cc \ + frames-x64.cc \ + full-codegen-x64.cc \ + ic-x64.cc \ + lithium-codegen-x64.cc \ + lithium-gap-resolver-x64.cc \ + lithium-x64.cc \ + macro-assembler-x64.cc \ + regexp-macro-assembler-x64.cc \ + stub-cache-x64.cc \ + platform-genode.cc \ + platform-posix.cc \ + objects-debug.cc \ + prettyprinter.cc \ + regexp-macro-assembler-tracer.cc \ + snapshot-empty.cc \ + libraries.cpp \ + experimental-libraries.cpp + +QT_VPATH += \ + qtjsbackend/src/3rdparty/v8/src \ + qtjsbackend/src/3rdparty/v8/src/extensions \ + qtjsbackend/src/3rdparty/v8/src/x64 \ + +# some source files need to be generated by moc from other source/header files before +# they get #included again by the original source file in the compiling stage + +# source files generated from existing header files ('moc_%.cpp: %.h' rule in import-qt5.inc) +# extracted from 'compiler_moc_header_make_all' target + + +# source files generated from existing source files ('%.moc: %.cpp' rule in import-qt5.inc) +# extracted from 'compiler_moc_source_make_all' rule + + diff --git a/libports/ports/qt5.mk b/libports/ports/qt5.mk index e9a894ce9..3d5dd4cff 100644 --- a/libports/ports/qt5.mk +++ b/libports/ports/qt5.mk @@ -25,6 +25,7 @@ PORTS += qt5 prepare-qt5: $(CONTRIB_DIR)/$(QT5) \ $(CONTRIB_DIR)/$(QTSCRIPTCLASSIC) \ tools \ + $(REP_DIR)/src/lib/qt5/qtjsbackend/generated/generated.tag \ $(REP_DIR)/src/lib/qt5/qtwebkit/Source/JavaScriptCore/generated/generated.tag \ $(REP_DIR)/src/lib/qt5/qtwebkit/Source/WebCore/generated/generated.tag @@ -74,6 +75,17 @@ $(CONTRIB_DIR)/$(QTSCRIPTCLASSIC): $(DOWNLOAD_DIR)/$(QTSCRIPTCLASSIC_TGZ).verifi # some of the following lines have been extracted from Makefiles (and modified afterwards), that's why they can be quite long # +V8_DIR = $(CONTRIB_DIR)/$(QT5)/qtjsbackend/src/v8/../3rdparty/v8 + +$(REP_DIR)/src/lib/qt5/qtjsbackend/generated/generated.tag: + + $(VERBOSE)mkdir -p $(dir $@) + + $(VERBOSE)python $(V8_DIR)/tools/js2c.py $(dir $@)/experimental-libraries.cpp EXPERIMENTAL off $(V8_DIR)/src/macros.py $(V8_DIR)/src/proxy.js + + $(VERBOSE)python $(V8_DIR)/tools/js2c.py $(dir $@)/libraries.cpp CORE off $(V8_DIR)/src/macros.py $(V8_DIR)/src/runtime.js $(V8_DIR)/src/v8natives.js $(V8_DIR)/src/array.js $(V8_DIR)/src/string.js $(V8_DIR)/src/uri.js $(V8_DIR)/src/math.js $(V8_DIR)/src/messages.js $(V8_DIR)/src/apinatives.js $(V8_DIR)/src/date.js $(V8_DIR)/src/regexp.js $(V8_DIR)/src/json.js $(V8_DIR)/src/liveedit-debugger.js $(V8_DIR)/src/mirror-debugger.js $(V8_DIR)/src/debug-debugger.js + + JAVASCRIPTCORE_DIR = $(CONTRIB_DIR)/$(QT5)/qtwebkit/Source/JavaScriptCore $(REP_DIR)/src/lib/qt5/qtwebkit/Source/JavaScriptCore/generated/generated.tag: diff --git a/libports/run/qt5_quicktest.run b/libports/run/qt5_quicktest.run new file mode 100644 index 000000000..c80204f9e --- /dev/null +++ b/libports/run/qt5_quicktest.run @@ -0,0 +1,158 @@ +# +# Build +# + +build { + core + init + drivers/input/ps2 + drivers/pci + drivers/framebuffer + drivers/timer + server/nitpicker + server/liquid_framebuffer + server/tar_fs + app/qt5/qt_quicktest + lib/qt5/qtdeclarative/src/imports/qtquick2 +} + +create_boot_directory + +# +# Create Qt tar archive +# + +exec tar chf bin/qt5_fs.tar -C bin/qt5_fs . + +# +# Generate config +# + +set config { + + + + + + + + + + + + + + + + + } + +append_if [have_spec sdl] config { + + + + + + + } + +append_if [have_spec pci] config { + + + + } + +append_if [have_spec framebuffer] config { + + + + } + +append_if [have_spec ps2] config { + + + + } + +append config { + + + + + + + + + + + + + + + + + + + + +} + +install_config $config + +# +# Boot modules +# + +# generic modules + +# The QtQuick plugin currently needs to be provided both in the file system +# (for Qt) and as ROM module (for 'dlopen()'). + +set boot_modules { + core + init + timer + nitpicker + liquid_fb + tar_fs + qt_quicktest + freetype.lib.so + gallium.lib.so + icu.lib.so + ld.lib.so + libc.lib.so + libc_fs.lib.so + libc_log.lib.so + libc_lock_pipe.lib.so + libcrypto.lib.so + libm.lib.so + libpng.lib.so + libssl.lib.so + jpeg.lib.so + pthread.lib.so + qt5_core.lib.so + qt5_dejavusans.lib.so + qt5_network.lib.so + qt5_qml.lib.so + qt5_gui.lib.so + qt5_quick.lib.so + qt5_v8.lib.so + qt5_widgets.lib.so + qt5_xml.lib.so + zlib.lib.so + stdcxx.lib.so + qt5_fs.tar + qt5_qtquick2plugin.lib.so +} + +# platform-specific modules +lappend_if [have_spec linux] boot_modules fb_sdl +lappend_if [have_spec pci] boot_modules pci_drv +lappend_if [have_spec framebuffer] boot_modules fb_drv +lappend_if [have_spec ps2] boot_modules ps2_drv + +build_boot_image $boot_modules + +append qemu_args " -m 256" + +run_genode_until forever diff --git a/libports/run/qt5_samegame.run b/libports/run/qt5_samegame.run new file mode 100644 index 000000000..ba4d3647e --- /dev/null +++ b/libports/run/qt5_samegame.run @@ -0,0 +1,158 @@ +# +# Build +# + +build { + core + init + drivers/input/ps2 + drivers/pci + drivers/framebuffer + drivers/timer + server/nitpicker + server/liquid_framebuffer + server/tar_fs + app/qt5/examples/samegame + lib/qt5/qtdeclarative/src/imports/qtquick2 +} + +create_boot_directory + +# +# Create Qt tar archive +# + +exec tar chf bin/qt5_fs.tar -C bin/qt5_fs . + +# +# Generate config +# + +set config { + + + + + + + + + + + + + + + + + } + +append_if [have_spec sdl] config { + + + + + + + } + +append_if [have_spec pci] config { + + + + } + +append_if [have_spec framebuffer] config { + + + + } + +append_if [have_spec ps2] config { + + + + } + +append config { + + + + + + + + + + + + + + + + + + + + +} + +install_config $config + +# +# Boot modules +# + +# generic modules + +# The QtQuick plugin currently needs to be provided both in the file system +# (for Qt) and as ROM module (for 'dlopen()'). + +set boot_modules { + core + init + timer + nitpicker + liquid_fb + tar_fs + samegame + freetype.lib.so + gallium.lib.so + icu.lib.so + ld.lib.so + libc.lib.so + libc_fs.lib.so + libc_log.lib.so + libc_lock_pipe.lib.so + libcrypto.lib.so + libm.lib.so + libpng.lib.so + libssl.lib.so + jpeg.lib.so + pthread.lib.so + qt5_core.lib.so + qt5_dejavusans.lib.so + qt5_network.lib.so + qt5_qml.lib.so + qt5_gui.lib.so + qt5_quick.lib.so + qt5_v8.lib.so + qt5_widgets.lib.so + qt5_xml.lib.so + zlib.lib.so + stdcxx.lib.so + qt5_fs.tar + qt5_qtquick2plugin.lib.so +} + +# platform-specific modules +lappend_if [have_spec linux] boot_modules fb_sdl +lappend_if [have_spec pci] boot_modules pci_drv +lappend_if [have_spec framebuffer] boot_modules fb_drv +lappend_if [have_spec ps2] boot_modules ps2_drv + +build_boot_image $boot_modules + +append qemu_args " -m 256" + +run_genode_until forever diff --git a/libports/src/app/qt5/examples/samegame/main.cpp b/libports/src/app/qt5/examples/samegame/main.cpp new file mode 100644 index 000000000..8ef3bdee8 --- /dev/null +++ b/libports/src/app/qt5/examples/samegame/main.cpp @@ -0,0 +1,19 @@ +/* + * \brief QtQuick 'samegame' example + * \author Christian Prochaska + * \date 2013-11-26 + */ + +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQuickView view; + view.setSource(QUrl("qrc:/samegame.qml")); + view.show(); + + return app.exec(); +} diff --git a/libports/src/app/qt5/examples/samegame/samegame.pro b/libports/src/app/qt5/examples/samegame/samegame.pro new file mode 100644 index 000000000..2fe8dfc33 --- /dev/null +++ b/libports/src/app/qt5/examples/samegame/samegame.pro @@ -0,0 +1,3 @@ +QT += quick +SOURCES += main.cpp +RESOURCES += samegame.qrc diff --git a/libports/src/app/qt5/examples/samegame/samegame.qrc b/libports/src/app/qt5/examples/samegame/samegame.qrc new file mode 100644 index 000000000..21db4aa74 --- /dev/null +++ b/libports/src/app/qt5/examples/samegame/samegame.qrc @@ -0,0 +1,17 @@ + + + +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/samegame3/samegame.qml +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/samegame3/Dialog.qml +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/samegame3/Button.qml +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/samegame3/Block.qml +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/samegame3/samegame.js + + +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/background.jpg +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/blueStone.png +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/greenStone.png +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/redStone.png +../../../../../contrib/qt-everywhere-opensource-src-5.1.0/qtdeclarative/examples/quick/tutorials/samegame/shared/pics/yellowStone.png + + diff --git a/libports/src/app/qt5/examples/samegame/target.mk b/libports/src/app/qt5/examples/samegame/target.mk new file mode 100644 index 000000000..ad944a423 --- /dev/null +++ b/libports/src/app/qt5/examples/samegame/target.mk @@ -0,0 +1,10 @@ +# identify the qt5 repository by searching for a file that is unique for qt5 +QT5_REP_DIR := $(call select_from_repositories,lib/import/import-qt5.inc) +QT5_REP_DIR := $(realpath $(dir $(QT5_REP_DIR))../..) + +include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc + +include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc + +LIBS += libc_fs + diff --git a/libports/src/app/qt5/qt_quicktest/main.cpp b/libports/src/app/qt5/qt_quicktest/main.cpp new file mode 100644 index 000000000..348cd20a7 --- /dev/null +++ b/libports/src/app/qt5/qt_quicktest/main.cpp @@ -0,0 +1,19 @@ +/* + * \brief QtQuick test + * \author Christian Prochaska + * \date 2013-11-26 + */ + +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQuickView view; + view.setSource(QUrl("qrc:/qt_quicktest.qml")); + view.show(); + + return app.exec(); +} diff --git a/libports/src/app/qt5/qt_quicktest/qt_quicktest.pro b/libports/src/app/qt5/qt_quicktest/qt_quicktest.pro new file mode 100644 index 000000000..558b7b13e --- /dev/null +++ b/libports/src/app/qt5/qt_quicktest/qt_quicktest.pro @@ -0,0 +1,5 @@ +TEMPLATE += app +QT += quick +SOURCES += main.cpp +RESOURCES += qt_quicktest.qrc +CONFIG += debug diff --git a/libports/src/app/qt5/qt_quicktest/qt_quicktest.qml b/libports/src/app/qt5/qt_quicktest/qt_quicktest.qml new file mode 100644 index 000000000..8ad179ad5 --- /dev/null +++ b/libports/src/app/qt5/qt_quicktest/qt_quicktest.qml @@ -0,0 +1,32 @@ +/* + * QML example from the Qt5 Quick Start Guide + * + * http://qt-project.org/doc/qt-5.0/qtquick/qtquick-quickstart-essentials.html + */ + +import QtQuick 2.0 + +Rectangle { + width: 200 + height: 100 + color: "red" + + Text { + anchors.centerIn: parent + text: "Hello, World!" + } + + MouseArea { + anchors.fill: parent + onClicked: parent.color = "blue" + } + + focus: true + Keys.onPressed: { + if (event.key == Qt.Key_Return) { + color = "green"; + event.accepted = true; + } + } +} + diff --git a/libports/src/app/qt5/qt_quicktest/qt_quicktest.qrc b/libports/src/app/qt5/qt_quicktest/qt_quicktest.qrc new file mode 100644 index 000000000..d5ed5e1cb --- /dev/null +++ b/libports/src/app/qt5/qt_quicktest/qt_quicktest.qrc @@ -0,0 +1,6 @@ + + + +qt_quicktest.qml + + diff --git a/libports/src/app/qt5/qt_quicktest/target.mk b/libports/src/app/qt5/qt_quicktest/target.mk new file mode 100644 index 000000000..ad944a423 --- /dev/null +++ b/libports/src/app/qt5/qt_quicktest/target.mk @@ -0,0 +1,10 @@ +# identify the qt5 repository by searching for a file that is unique for qt5 +QT5_REP_DIR := $(call select_from_repositories,lib/import/import-qt5.inc) +QT5_REP_DIR := $(realpath $(dir $(QT5_REP_DIR))../..) + +include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_defaults.inc + +include $(QT5_REP_DIR)/src/app/qt5/tmpl/target_final.inc + +LIBS += libc_fs + diff --git a/libports/src/app/qt5/tmpl/target_final.inc b/libports/src/app/qt5/tmpl/target_final.inc index 756efaf40..4c3a118b6 100644 --- a/libports/src/app/qt5/tmpl/target_final.inc +++ b/libports/src/app/qt5/tmpl/target_final.inc @@ -30,6 +30,11 @@ ifeq ($(findstring network, $(QT)), network) LIBS += qt5_network endif +# QtQuick +ifeq ($(findstring quick, $(QT)), quick) +LIBS += qt5_quick +endif + # QtScript ifeq ($(findstring scriptclassic, $(QT)), scriptclassic) LIBS += qt5_scriptclassic diff --git a/libports/src/lib/qt5/patches/qt5_configuration.patch b/libports/src/lib/qt5/patches/qt5_configuration.patch index 7fece002c..85ca3ab13 100644 --- a/libports/src/lib/qt5/patches/qt5_configuration.patch +++ b/libports/src/lib/qt5/patches/qt5_configuration.patch @@ -6,7 +6,7 @@ From: Christian Prochaska --- configure | 2 - qt.pro | 42 ++++++++++---------- - qtbase/configure | 6 +-- + qtbase/configure | 8 ++-- qtbase/mkspecs/genode-g++/qmake.conf | 1 qtbase/mkspecs/genode-g++/qplatformdefs.h | 1 qtbase/src/corelib/global/qconfig-genode.h | 1 @@ -15,7 +15,7 @@ From: Christian Prochaska qtdeclarative/tests/tests.pro | 4 +- qtquick1/examples/declarative/declarative.pro | 1 qtwebkit/Tools/qmake/mkspecs/features/features.prf | 6 +-- - 11 files changed, 39 insertions(+), 33 deletions(-) + 11 files changed, 40 insertions(+), 34 deletions(-) create mode 120000 qtbase/mkspecs/genode-g++/qmake.conf create mode 120000 qtbase/mkspecs/genode-g++/qplatformdefs.h create mode 120000 qtbase/src/corelib/global/qconfig-genode.h @@ -90,7 +90,7 @@ index 218701a..bb4c037 100644 +#addModule(qtdoc, qtdeclarative) +#addModule(qtqa, qtbase) diff --git a/qtbase/configure b/qtbase/configure -index d7c9674..f4198b8 100755 +index d7c9674..956c3e1 100755 --- a/qtbase/configure +++ b/qtbase/configure @@ -857,10 +857,10 @@ CFG_XINERAMA=runtime @@ -106,6 +106,15 @@ index d7c9674..f4198b8 100755 CFG_LIBJPEG=auto CFG_XCURSOR=runtime CFG_XRANDR=runtime +@@ -883,7 +883,7 @@ CFG_SKIP_MODULES="" + CFG_COMPILE_EXAMPLES=auto + CFG_RELEASE_QMAKE=no + CFG_AUDIO_BACKEND=auto +-CFG_V8SNAPSHOT=auto ++CFG_V8SNAPSHOT=no + CFG_QML_DEBUG=yes + CFG_JAVASCRIPTCORE_JIT=auto + CFG_PKGCONFIG=auto @@ -949,7 +949,7 @@ CFG_GETADDRINFO=auto CFG_IPV6IFNAME=auto CFG_GETIFADDRS=auto diff --git a/libports/src/lib/qt5/patches/qt5_qml.patch b/libports/src/lib/qt5/patches/qt5_qml.patch new file mode 100644 index 000000000..8da5cd646 --- /dev/null +++ b/libports/src/lib/qt5/patches/qt5_qml.patch @@ -0,0 +1,796 @@ +qt5_qml.patch + +From: Christian Prochaska + + +--- + qtdeclarative/src/qml/qml/qqmlimport.cpp | 9 + qtdeclarative/src/qml/qml/v8/qv8qobjectwrapper.cpp | 4 + qtdeclarative/src/qml/types/qqmldelegatemodel_p.h | 2 + qtjsbackend/src/3rdparty/v8/src/platform-genode.cc | 701 ++++++++++++++++++++ + qtjsbackend/src/v8/v8.pri | 2 + 5 files changed, 716 insertions(+), 2 deletions(-) + create mode 100644 qtjsbackend/src/3rdparty/v8/src/platform-genode.cc + +diff --git a/qtdeclarative/src/qml/qml/qqmlimport.cpp b/qtdeclarative/src/qml/qml/qqmlimport.cpp +index 2fbb614..5816e9a 100644 +--- a/qtdeclarative/src/qml/qml/qqmlimport.cpp ++++ b/qtdeclarative/src/qml/qml/qqmlimport.cpp +@@ -1463,6 +1463,14 @@ QString QQmlImportDatabase::resolvePlugin(QQmlTypeLoader *typeLoader, + const QString &qmldirPath, const QString &qmldirPluginPath, + const QString &baseName) + { ++#if defined(Q_OS_GENODE) ++ ++ return resolvePlugin(typeLoader, qmldirPath, qmldirPluginPath, baseName, ++ QStringList() << QLatin1String(".lib.so"), ++ QLatin1String("qt5_")); ++ ++#else ++ + #if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) + return resolvePlugin(typeLoader, qmldirPath, qmldirPluginPath, baseName, + QStringList() +@@ -1512,6 +1520,7 @@ QString QQmlImportDatabase::resolvePlugin(QQmlTypeLoader *typeLoader, + # endif + + #endif ++#endif + } + + /*! +diff --git a/qtdeclarative/src/qml/qml/v8/qv8qobjectwrapper.cpp b/qtdeclarative/src/qml/qml/v8/qv8qobjectwrapper.cpp +index 53f70ad..0b31aa6 100644 +--- a/qtdeclarative/src/qml/qml/v8/qv8qobjectwrapper.cpp ++++ b/qtdeclarative/src/qml/qml/v8/qv8qobjectwrapper.cpp +@@ -973,6 +973,8 @@ v8::Local QQmlPropertyCache::newQObject(QObject *object, QV8Engine * + if (checkForDuplicates) + uniqueHash.reserve(stringCache.count()); + ++/* disabling this code seems to avoid crashes on 32-bit Linux and NOVA */ ++#if 0 + // XXX TODO: Enables fast property accessors. These more than double the property access + // performance, but the cost of setting up this structure hasn't been measured so + // its not guaranteed that this is a win overall. We need to try and measure the cost. +@@ -1032,7 +1034,7 @@ v8::Local QQmlPropertyCache::newQObject(QObject *object, QV8Engine * + v8::External::New(property)); + } + } +- ++#endif + if (ft.IsEmpty()) { + constructor = qPersistentNew(engine->qobjectWrapper()->m_constructor); + } else { +diff --git a/qtdeclarative/src/qml/types/qqmldelegatemodel_p.h b/qtdeclarative/src/qml/types/qqmldelegatemodel_p.h +index 5702c59..3d616b5 100644 +--- a/qtdeclarative/src/qml/types/qqmldelegatemodel_p.h ++++ b/qtdeclarative/src/qml/types/qqmldelegatemodel_p.h +@@ -52,6 +52,8 @@ + #include + #include + ++#include ++ + Q_DECLARE_METATYPE(QModelIndex) + + QT_BEGIN_NAMESPACE +diff --git a/qtjsbackend/src/3rdparty/v8/src/platform-genode.cc b/qtjsbackend/src/3rdparty/v8/src/platform-genode.cc +new file mode 100644 +index 0000000..3a8cf90 +--- /dev/null ++++ b/qtjsbackend/src/3rdparty/v8/src/platform-genode.cc +@@ -0,0 +1,701 @@ ++// Copyright 2012 the V8 project authors. All rights reserved. ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following ++// disclaimer in the documentation and/or other materials provided ++// with the distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived ++// from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++// Platform specific code for Genode goes here ++ ++// Minimal include to get access to abort, fprintf and friends for bootstrapping ++// messages. ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "v8.h" ++ ++#include "platform-posix.h" ++#include "platform.h" ++#include "vm-state-inl.h" ++ ++ ++namespace v8 { ++namespace internal { ++ ++static const bool verbose = false; ++ ++static const pthread_t kNoThread = (pthread_t) 0; ++ ++#undef UNIMPLEMENTED ++#define UNIMPLEMENTED(...) PDBG("UNIMPLEMENTED") ++ ++ ++double ceiling(double x) { ++ return ceil(x); ++} ++ ++ ++// Initialize OS class early in the V8 startup. ++void OS::SetUp() { ++ // Seed the random number generator. ++ UNIMPLEMENTED(); ++} ++ ++ ++void OS::PostSetUp() { ++ POSIXPostSetUp(); ++} ++ ++ ++void OS::TearDown() { ++ UNIMPLEMENTED(); ++} ++ ++int OS::ActivationFrameAlignment() { ++#ifdef V8_TARGET_ARCH_ARM ++ // On EABI ARM targets this is required for fp correctness in the ++ // runtime system. ++ return 8; ++#elif V8_TARGET_ARCH_MIPS ++ return 8; ++#endif ++ // With gcc 4.4 the tree vectorization optimizer can generate code ++ // that requires 16 byte alignment such as movdqa on x86. ++ return 16; ++} ++ ++ ++void OS::ReleaseStore(volatile AtomicWord* ptr, AtomicWord value) { ++#if (defined(V8_TARGET_ARCH_ARM) && defined(__arm__)) || \ ++ (defined(V8_TARGET_ARCH_MIPS) && defined(__mips__)) ++ // Only use on ARM or MIPS hardware. ++ MemoryBarrier(); ++#else ++ __asm__ __volatile__("" : : : "memory"); ++ // An x86 store acts as a release barrier. ++#endif ++ *ptr = value; ++} ++ ++ ++// Returns a string identifying the current timezone taking into ++// account daylight saving. ++const char* OS::LocalTimezone(double time) { ++ UNIMPLEMENTED(); ++ return ""; ++} ++ ++ ++// Returns the local time offset in milliseconds east of UTC without ++// taking daylight savings time into account. ++double OS::LocalTimeOffset() { ++ UNIMPLEMENTED(); ++ return 0; ++} ++ ++ ++uint64_t OS::CpuFeaturesImpliedByPlatform() { ++ return 0; ++} ++ ++#if 0 ++CpuImplementer OS::GetCpuImplementer() { ++ UNIMPLEMENTED(); ++} ++ ++ ++bool OS::ArmCpuHasFeature(CpuFeature feature) { ++ UNIMPLEMENTED(); ++} ++ ++ ++bool OS::ArmUsingHardFloat() { ++ UNIMPLEMENTED(); ++} ++#endif ++ ++bool OS::IsOutsideAllocatedSpace(void* address) { ++ UNIMPLEMENTED(); ++ return false; ++} ++ ++#if 0 ++size_t OS::AllocateAlignment() { ++ UNIMPLEMENTED(); ++ return 0; ++} ++#endif ++ ++void* OS::Allocate(const size_t requested, ++ size_t* allocated, ++ bool executable) { ++ //UNIMPLEMENTED(); ++ *allocated = requested; ++ return malloc(requested); ++} ++ ++#if 0 ++void OS::Free(void* buf, const size_t length) { ++ // TODO(1240712): potential system call return value which is ignored here. ++ UNIMPLEMENTED(); ++} ++ ++ ++void OS::Guard(void* address, const size_t size) { ++ UNIMPLEMENTED(); ++} ++#endif ++ ++void OS::Sleep(int milliseconds) { ++ UNIMPLEMENTED(); ++} ++ ++ ++void OS::Abort() { ++ // Minimalistic implementation for bootstrapping. ++ abort(); ++} ++ ++#if 0 ++void OS::DebugBreak() { ++ UNIMPLEMENTED(); ++} ++#endif ++ ++OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) { ++ UNIMPLEMENTED(); ++ return NULL; ++} ++ ++#if 0 ++OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, int size, ++ void* initial) { ++ UNIMPLEMENTED(); ++ return NULL; ++} ++#endif ++ ++void OS::LogSharedLibraryAddresses() { ++ UNIMPLEMENTED(); ++} ++ ++ ++void OS::SignalCodeMovingGC() { ++ UNIMPLEMENTED(); ++} ++ ++#if 0 ++int OS::StackWalk(Vector frames) { ++ UNIMPLEMENTED(); ++ return 0; ++} ++#endif ++ ++/* --- */ ++ ++class Attached_rm_connection : public Genode::Rm_connection, ++ public Genode::Avl_node ++{ ++ ++ private: ++ ++ Genode::Dataspace_capability _ds_cap; ++ ++ size_t _size; ++ Genode::addr_t _base_addr; ++ ++ public: ++ ++ Attached_rm_connection(size_t size, size_t alignment = 0) ++ : Genode::Rm_connection(0, size), ++ _ds_cap(dataspace()), ++ _size(size) ++ { ++ if (alignment == 0) { ++ _base_addr = Genode::env()->rm_session()->attach(_ds_cap); ++ } else { ++ for (_base_addr = alignment; ++ _base_addr != 0; /* wrap-around */ ++ _base_addr += alignment) { ++ try { ++ Genode::env()->rm_session()->attach_at(_ds_cap, _base_addr); ++ return; ++ } catch (Genode::Rm_connection::Region_conflict) { ++ if (verbose) ++ PDBG("could not attach at address 0x%lx", _base_addr); ++ } ++ } ++ throw Rm_connection::Region_conflict(); ++ } ++ } ++ ++ ~Attached_rm_connection() ++ { ++ Genode::env()->rm_session()->detach(_base_addr); ++ } ++ ++ size_t size() const { return _size; } ++ ++ void *base_addr() const { return (void*)_base_addr; } ++ ++ void attach(Genode::Dataspace_capability ds_cap, Genode::addr_t addr, ++ bool executable) ++ { ++ Genode::Rm_connection::attach(ds_cap, 0, 0, true, ++ (void*)(addr - _base_addr), ++ executable); ++ } ++ ++ Attached_rm_connection *find_by_addr(Genode::addr_t addr) ++ { ++ if (verbose) ++ PDBG("addr = 0x%lx, _base_addr = 0x%lx, _end_addr = 0x%lx", ++ addr, _base_addr, _base_addr + _size); ++ if ((addr >= _base_addr) && (addr < _base_addr + _size)) ++ return this; ++ ++ Attached_rm_connection *next = child(addr > _base_addr); ++ return next ? next->find_by_addr(addr) : 0; ++ } ++ ++ /** ++ * Avl_node interface ++ */ ++ bool higher(Attached_rm_connection *other) ++ { ++ return ((Genode::addr_t)other->base_addr() > _base_addr); ++ } ++}; ++ ++ ++static Genode::Avl_tree &vm_registry() ++{ ++ static Genode::Avl_tree _vm_registry; ++ return _vm_registry; ++} ++ ++ ++static void *reserve_region(size_t size, size_t alignment = 0) ++{ ++ Attached_rm_connection *rm; ++ try { ++ rm = new Attached_rm_connection(size, alignment); ++ } catch (Attached_rm_connection::Region_conflict) { ++ PDBG("could not reserve region"); ++ return 0; ++ } ++ vm_registry().insert(rm); ++ if (verbose) ++ PDBG("base_addr = 0x%p", rm->base_addr()); ++ return rm->base_addr(); ++} ++ ++/* --- */ ++ ++VirtualMemory::VirtualMemory() : address_(NULL), size_(0) { } ++ ++ ++VirtualMemory::VirtualMemory(size_t size) { ++ if (verbose) ++ PDBG("size = 0x%zx", size); ++ address_ = ReserveRegion(size); ++ size_ = size; ++} ++ ++ ++VirtualMemory::VirtualMemory(size_t size, size_t alignment) { ++ if (verbose) ++ PDBG("size = 0x%zx, alignment = 0x%zx", size, alignment); ++ address_ = reserve_region(size, alignment); ++ size_ = size; ++} ++ ++ ++VirtualMemory::~VirtualMemory() { ++ if (IsReserved()) { ++ bool result = ReleaseRegion(address(), size()); ++ ASSERT(result); ++ USE(result); ++ } ++} ++ ++ ++bool VirtualMemory::IsReserved() { ++ return address_ != NULL; ++} ++ ++ ++void VirtualMemory::Reset() { ++ address_ = NULL; ++ size_ = 0; ++} ++ ++ ++bool VirtualMemory::Commit(void* address, size_t size, bool is_executable) { ++ return CommitRegion(address, size, is_executable); ++} ++ ++ ++ ++bool VirtualMemory::Uncommit(void* address, size_t size) { ++ return UncommitRegion(address, size); ++} ++ ++ ++bool VirtualMemory::Guard(void* address) { ++ UNIMPLEMENTED(); ++ return true; ++} ++ ++ ++void* VirtualMemory::ReserveRegion(size_t size) { ++ return reserve_region(size); ++} ++ ++ ++bool VirtualMemory::CommitRegion(void* base, size_t size, bool is_executable) { ++ if (verbose) ++ PDBG("base = 0x%p, size = 0x%zx", base, size); ++ Attached_rm_connection *rm = vm_registry().first(); ++ rm = rm->find_by_addr((Genode::addr_t)base); ++ if (!rm) { ++ if (verbose) ++ PDBG("could not find RM connection"); ++ return false; ++ } ++ ++ Genode::Ram_dataspace_capability ds_cap = ++ Genode::env()->ram_session()->alloc(size); ++ ++ try { ++ rm->attach(ds_cap, (Genode::addr_t)base, is_executable); ++ } catch (Genode::Rm_session::Region_conflict) { ++ return false; ++ } ++ ++ return true; ++} ++ ++ ++bool VirtualMemory::UncommitRegion(void* base, size_t size) { ++ UNIMPLEMENTED(); ++ if (verbose) ++ PDBG("base = 0x%p, size = 0x%zx", base, size); ++ return false; ++} ++ ++ ++bool VirtualMemory::ReleaseRegion(void* base, size_t size) { ++ ++ UNIMPLEMENTED(); ++ ++#if 0 ++ /* ++ * FIXME ++ * ++ * Unmapping of managed dataspaces is not supported on all platforms. ++ * To make it still work, all dataspaces attached to the sub RM session must ++ * be detached before detaching the sub RM session. ++ */ ++ ++ if (verbose) ++ PDBG("base = 0x%p, size = 0x%zx", base, size); ++ Attached_rm_connection *rm = vm_registry().first(); ++ /* XXX: also pass the size for checking? */ ++ rm = rm->find_by_addr((Genode::addr_t)base); ++ if (!rm) ++ return false; ++ ++ vm_registry().remove(rm); ++ ++ delete rm; ++#endif ++ ++ return true; ++} ++ ++ ++bool VirtualMemory::HasLazyCommits() { ++ // TODO(alph): implement for the platform. ++ return false; ++} ++ ++ ++class Thread::PlatformData : public Malloced { ++ public: ++ PlatformData() : thread_(kNoThread) {} ++ ++ pthread_t thread_; // Thread handle for pthread. ++}; ++ ++ ++Thread::Thread(const Options& options) ++ : data_(new PlatformData()), ++ stack_size_(options.stack_size()) { ++ set_name(options.name()); ++} ++ ++ ++Thread::~Thread() { ++ delete data_; ++} ++ ++ ++static void* ThreadEntry(void* arg) { ++ Thread* thread = reinterpret_cast(arg); ++ // This is also initialized by the first argument to pthread_create() but we ++ // don't know which thread will run first (the original thread or the new ++ // one) so we initialize it here too. ++#ifdef PR_SET_NAME ++ prctl(PR_SET_NAME, ++ reinterpret_cast(thread->name()), // NOLINT ++ 0, 0, 0); ++#endif ++ thread->data()->thread_ = pthread_self(); ++ ASSERT(thread->data()->thread_ != kNoThread); ++ thread->Run(); ++ return NULL; ++} ++ ++ ++void Thread::set_name(const char* name) { ++ strncpy(name_, name, sizeof(name_)); ++ name_[sizeof(name_) - 1] = '\0'; ++} ++ ++ ++void Thread::Start() { ++ pthread_attr_t* attr_ptr = NULL; ++ pthread_attr_t attr; ++ if (stack_size_ > 0) { ++ pthread_attr_init(&attr); ++ pthread_attr_setstacksize(&attr, static_cast(stack_size_)); ++ attr_ptr = &attr; ++ } ++ int result = pthread_create(&data_->thread_, attr_ptr, ThreadEntry, this); ++ CHECK_EQ(0, result); ++ ASSERT(data_->thread_ != kNoThread); ++} ++ ++ ++void Thread::Join() { ++ pthread_join(data_->thread_, NULL); ++} ++ ++ ++Thread::LocalStorageKey Thread::CreateThreadLocalKey() { ++ pthread_key_t key; ++ int result = pthread_key_create(&key, NULL); ++ USE(result); ++ ASSERT(result == 0); ++ return static_cast(key); ++} ++ ++ ++void Thread::DeleteThreadLocalKey(LocalStorageKey key) { ++ pthread_key_t pthread_key = static_cast(key); ++ int result = pthread_key_delete(pthread_key); ++ USE(result); ++ ASSERT(result == 0); ++} ++ ++ ++void* Thread::GetThreadLocal(LocalStorageKey key) { ++ pthread_key_t pthread_key = static_cast(key); ++ return pthread_getspecific(pthread_key); ++} ++ ++ ++void Thread::SetThreadLocal(LocalStorageKey key, void* value) { ++ pthread_key_t pthread_key = static_cast(key); ++ pthread_setspecific(pthread_key, value); ++} ++ ++ ++void Thread::YieldCPU() { ++ UNIMPLEMENTED(); ++} ++ ++ ++class GenodeMutex : public Mutex { ++ public: ++ GenodeMutex() { ++ pthread_mutexattr_t attrs; ++ int result = pthread_mutexattr_init(&attrs); ++ ASSERT(result == 0); ++ result = pthread_mutexattr_settype(&attrs, PTHREAD_MUTEX_RECURSIVE); ++ ASSERT(result == 0); ++ result = pthread_mutex_init(&mutex_, &attrs); ++ ASSERT(result == 0); ++ USE(result); ++ } ++ ++ virtual ~GenodeMutex() { pthread_mutex_destroy(&mutex_); } ++ ++ virtual int Lock() { ++ int result = pthread_mutex_lock(&mutex_); ++ return result; ++ } ++ ++ virtual int Unlock() { ++ int result = pthread_mutex_unlock(&mutex_); ++ return result; ++ } ++ ++ virtual bool TryLock() { ++ int result = pthread_mutex_trylock(&mutex_); ++ // Return false if the lock is busy and locking failed. ++ if (result == EBUSY) { ++ return false; ++ } ++ ASSERT(result == 0); // Verify no other errors. ++ return true; ++ } ++ ++ private: ++ pthread_mutex_t mutex_; // Pthread mutex for POSIX platforms. ++}; ++ ++ ++Mutex* OS::CreateMutex() { ++ return new GenodeMutex(); ++} ++ ++ ++class GenodeSemaphore : public Semaphore { ++ public: ++ explicit GenodeSemaphore(int count) { sem_init(&sem_, 0, count); } ++ virtual ~GenodeSemaphore() { sem_destroy(&sem_); } ++ ++ virtual void Wait(); ++ virtual bool Wait(int timeout); ++ virtual void Signal() { sem_post(&sem_); } ++ private: ++ sem_t sem_; ++}; ++ ++ ++void GenodeSemaphore::Wait() { ++ while (true) { ++ int result = sem_wait(&sem_); ++ if (result == 0) return; // Successfully got semaphore. ++ CHECK(result == -1 && errno == EINTR); // Signal caused spurious wakeup. ++ } ++} ++ ++ ++#ifndef TIMEVAL_TO_TIMESPEC ++#define TIMEVAL_TO_TIMESPEC(tv, ts) do { \ ++ (ts)->tv_sec = (tv)->tv_sec; \ ++ (ts)->tv_nsec = (tv)->tv_usec * 1000; \ ++} while (false) ++#endif ++ ++ ++bool GenodeSemaphore::Wait(int timeout) { ++ const long kOneSecondMicros = 1000000; // NOLINT ++ ++ // Split timeout into second and nanosecond parts. ++ struct timeval delta; ++ delta.tv_usec = timeout % kOneSecondMicros; ++ delta.tv_sec = timeout / kOneSecondMicros; ++ ++ struct timeval current_time; ++ // Get the current time. ++ if (gettimeofday(¤t_time, NULL) == -1) { ++ return false; ++ } ++ ++ // Calculate time for end of timeout. ++ struct timeval end_time; ++ timeradd(¤t_time, &delta, &end_time); ++ ++ struct timespec ts; ++ TIMEVAL_TO_TIMESPEC(&end_time, &ts); ++ // Wait for semaphore signalled or timeout. ++ while (true) { ++ int result = sem_timedwait(&sem_, &ts); ++ if (result == 0) return true; // Successfully got semaphore. ++ if (result > 0) { ++ // For glibc prior to 2.3.4 sem_timedwait returns the error instead of -1. ++ errno = result; ++ result = -1; ++ } ++ if (result == -1 && errno == ETIMEDOUT) return false; // Timeout. ++ CHECK(result == -1 && errno == EINTR); // Signal caused spurious wakeup. ++ } ++} ++ ++ ++Semaphore* OS::CreateSemaphore(int count) { ++ return new GenodeSemaphore(count); ++} ++ ++ ++class Sampler::PlatformData : public Malloced { ++ public: ++ PlatformData() { ++ UNIMPLEMENTED(); ++ } ++}; ++ ++ ++Sampler::Sampler(Isolate *isolate, int interval) ++ : isolate_(isolate), ++ interval_(interval), ++ profiling_(false), ++ active_(false), ++ samples_taken_(0) { ++ UNIMPLEMENTED(); ++ // Shared setup follows. ++ data_ = new PlatformData; ++} ++ ++ ++Sampler::~Sampler() { ++ UNIMPLEMENTED(); ++ // Shared tear down follows. ++ delete data_; ++} ++ ++ ++void Sampler::Start() { ++ UNIMPLEMENTED(); ++} ++ ++ ++void Sampler::Stop() { ++ UNIMPLEMENTED(); ++} ++ ++ ++} } // namespace v8::internal +diff --git a/qtjsbackend/src/v8/v8.pri b/qtjsbackend/src/v8/v8.pri +index 3a563ff..6a83034 100644 +--- a/qtjsbackend/src/v8/v8.pri ++++ b/qtjsbackend/src/v8/v8.pri +@@ -265,7 +265,7 @@ SOURCES += \ + LIBS += -lexecinfo + } else:unix:!qnx { + SOURCES += \ +- $$V8SRC/platform-linux.cc \ ++ $$V8SRC/platform-genode.cc \ + $$V8SRC/platform-posix.cc + } + diff --git a/libports/src/lib/qt5/patches/series b/libports/src/lib/qt5/patches/series index 9f4c00f48..57ac76227 100644 --- a/libports/src/lib/qt5/patches/series +++ b/libports/src/lib/qt5/patches/series @@ -12,4 +12,5 @@ qt5_qtnetwork.patch qt5_qtwebkit.patch qt5_textedit_example.patch qt5_openglwindow_example.patch +qt5_qml.patch qt5_tools.patch diff --git a/libports/src/lib/qt5/qtbase/src/corelib/global/qconfig.cpp b/libports/src/lib/qt5/qtbase/src/corelib/global/qconfig.cpp index 89d4e0fd5..f977d58c9 100644 --- a/libports/src/lib/qt5/qtbase/src/corelib/global/qconfig.cpp +++ b/libports/src/lib/qt5/qtbase/src/corelib/global/qconfig.cpp @@ -15,7 +15,7 @@ static const char qt_configure_prefix_path_strs[][256 + 12] = { "qt_binspath=:/qt/bin", "qt_plugpath=:/qt/plugins", "qt_impspath=:/qt/imports", - "qt_qml2path=:/qt/qml", + "qt_qml2path=/qt5/qml", "qt_adatpath=:/qt", "qt_datapath=:/qt", "qt_trnspath=:/qt/translations", diff --git a/libports/src/lib/qt5/qtdeclarative/src/imports/qtquick2/target.mk b/libports/src/lib/qt5/qtdeclarative/src/imports/qtquick2/target.mk new file mode 100644 index 000000000..f6c0485d4 --- /dev/null +++ b/libports/src/lib/qt5/qtdeclarative/src/imports/qtquick2/target.mk @@ -0,0 +1,3 @@ +# the plugin gets loaded via 'dlopen()', therefore it is built separately + +LIBS = qt5_qtquick2plugin diff --git a/libports/tool/qt5/lib_mk_file_generator/create_generated_incs b/libports/tool/qt5/lib_mk_file_generator/create_generated_incs index 07b74af2c..0d84de5d8 100755 --- a/libports/tool/qt5/lib_mk_file_generator/create_generated_incs +++ b/libports/tool/qt5/lib_mk_file_generator/create_generated_incs @@ -16,6 +16,12 @@ cd qtscript/src/script && ../../../create_generated_inc qt cd qttools/src/designer/src/uitools && ../../../../../create_generated_inc qt5_ui_tools && cp qt5_ui_tools_generated.inc ../../../../.. && cd ../../../../.. +cd qtjsbackend/src/v8 && ../../../create_generated_inc qt5_v8 && cp qt5_v8_generated.inc ../../.. && cd ../../.. + +cd qtdeclarative/src/qml && ../../../create_generated_inc qt5_qml && cp qt5_qml_generated.inc ../../.. && cd ../../.. +cd qtdeclarative/src/quick && ../../../create_generated_inc qt5_quick && cp qt5_quick_generated.inc ../../.. && cd ../../.. +cd qtdeclarative/src/imports/qtquick2 && ../../../../create_generated_inc qt5_qtquick2plugin && cp qt5_qtquick2plugin_generated.inc ../../../.. && cd ../../../.. + # qtwebkit make -C qtbase/src/tools/bootstrap