Build for WebAssembly including building everything statically etc.

Resolves #372
This commit is contained in:
Peter Hartmann 2024-01-19 09:05:43 +01:00
parent 4fdfbf0f43
commit 63cb58ef4a
6 changed files with 53 additions and 22 deletions

View File

@ -47,10 +47,16 @@ function(qsk_add_plugin target TYPE CLASS_NAME)
# So for the moment better don't do:
# qt6_add_plugin(${target} SHARED ${CLASS_NAME} )
if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
qt6_add_library(${target} SHARED )
if(BUILD_QSKDLL)
set(library_type SHARED)
else()
add_library(${target} SHARED )
set(library_type STATIC)
endif()
if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
qt6_add_library(${target} ${library_type})
else()
add_library(${target} ${library_type})
endif()
set_target_properties(${target} PROPERTIES
@ -118,4 +124,10 @@ function(qsk_add_shaders target)
qt6_add_shaders( ${target} "qskshaders" BATCHABLE PRECOMPILE QUIET
PREFIX "/qskinny/shaders" ${ARGV} OUTPUTS ${outfiles} )
# pass on OUTPUT_TARGETS to the caller of this function
cmake_parse_arguments(PARSE_ARGV 1 arg "" "OUTPUT_TARGETS" "")
if (arg_OUTPUT_TARGETS)
set(${arg_OUTPUT_TARGETS} ${${arg_OUTPUT_TARGETS}} PARENT_SCOPE)
endif()
endfunction()

View File

@ -17,7 +17,12 @@ set(SOURCES
QskQml.cpp)
set(target qskqmlexport)
qsk_add_library(${target} SHARED ${SOURCES} ${HEADERS})
if(BUILD_QSKDLL)
qsk_add_library(${target} SHARED ${SOURCES} ${HEADERS})
else()
qsk_add_library(${target} STATIC ${SOURCES} ${HEADERS})
endif()
target_link_libraries(${target} PRIVATE qskinny)
target_include_directories(${target} PUBLIC

View File

@ -482,17 +482,14 @@ set(target qskinny)
if(BUILD_QSKDLL)
qsk_add_library(${target} SHARED ${SOURCES} ${HEADERS} ${PRIVATE_HEADERS})
target_compile_definitions(${target} PUBLIC QSK_DLL )
set_target_properties(${target} PROPERTIES DEFINE_SYMBOL QSK_MAKEDLL)
else()
qsk_add_library(${target} STATIC ${SOURCES} ${HEADERS} ${PRIVATE_HEADERS})
endif()
if(BUILD_QSKDLL)
target_compile_definitions(${target} PUBLIC QSK_DLL )
set_target_properties(${target} PROPERTIES DEFINE_SYMBOL QSK_MAKEDLL)
endif()
if (QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
qsk_add_shaders( ${target} FILES ${SHADERS} )
qsk_add_shaders( ${target} FILES ${SHADERS} OUTPUT_TARGETS shader_target)
endif()
target_include_directories(${target} PUBLIC
@ -542,8 +539,14 @@ set_target_properties(${target} PROPERTIES
# packaging
set(PACKAGE_NAME ${PROJECT_NAME})
set(exported_targets ${target})
if(NOT BUILD_QSKDLL)
list(APPEND exported_targets ${shader_target})
endif()
# setup destination file paths for qskinny target
install(TARGETS ${target} EXPORT ${PACKAGE_NAME}Targets
install(TARGETS ${exported_targets} EXPORT ${PACKAGE_NAME}Targets
LIBRARY DESTINATION ${QSK_INSTALL_LIBS}
ARCHIVE DESTINATION ${QSK_INSTALL_LIBS}
RUNTIME DESTINATION ${QSK_INSTALL_LIBS}

View File

@ -7,7 +7,9 @@
#include <qcoreapplication.h>
#include <qobject.h>
#if QT_CONFIG(thread)
#include <qsemaphore.h>
#endif
#include <qthread.h>
QSK_QT_PRIVATE_BEGIN
@ -188,6 +190,8 @@ void QskMetaFunction::invoke( QObject* object,
? Qt::QueuedConnection : Qt::DirectConnection;
}
const auto argc = parameterCount() + 1; // return value + arguments
switch ( invokeType )
{
case Qt::DirectConnection:
@ -206,10 +210,13 @@ void QskMetaFunction::invoke( QObject* object,
#if QT_CONFIG(thread)
QSemaphore semaphore;
#endif
auto event = new QMetaCallEvent(
m_functionCall, nullptr, 0, argv, &semaphore );
#else
auto event = new QMetaCallEvent(
m_functionCall, nullptr, 0, argc );
#endif
QCoreApplication::postEvent( receiver, event );
@ -224,8 +231,6 @@ void QskMetaFunction::invoke( QObject* object,
if ( receiver.isNull() )
return;
const auto argc = parameterCount() + 1; // return value + arguments
auto event = new QMetaCallEvent( m_functionCall, nullptr, 0, argc );
auto types = event->types();

View File

@ -9,7 +9,9 @@
#include <qmetaobject.h>
#include <qobject.h>
#include <qcoreapplication.h>
#if QT_CONFIG(thread)
#include <qsemaphore.h>
#endif
#include <qthread.h>
QSK_QT_PRIVATE_BEGIN
@ -163,6 +165,12 @@ static void qskInvokeMetaCall(
? Qt::QueuedConnection : Qt::DirectConnection;
}
#if 1
// should be doable without QMetaMethod. TODO ...
const auto method = metaObject->method( offset + index );
#endif
const int argc = method.parameterCount() + 1;
switch ( invokeType )
{
case Qt::DirectConnection:
@ -194,11 +202,15 @@ static void qskInvokeMetaCall(
#if QT_CONFIG(thread)
QSemaphore semaphore;
#endif
auto event = new MetaCallEvent( call, metaObject,
offset, index, args, &semaphore );
#else
auto event = new MetaCallEvent( call, metaObject,
offset, index, argc );
#endif
QCoreApplication::postEvent( receiver, event );
#if QT_CONFIG(thread)
@ -216,12 +228,6 @@ static void qskInvokeMetaCall(
if ( call == QMetaObject::InvokeMetaMethod )
{
#if 1
// should be doable without QMetaMethod. TODO ...
const auto method = metaObject->method( offset + index );
#endif
const int argc = method.parameterCount() + 1;
event = new MetaCallEvent( call, metaObject, offset, index, argc );
/*

View File

@ -5,7 +5,7 @@
#include "QskTreeNode.h"
static constexpr auto extraFlag =
static const auto extraFlag =
static_cast< QSGNode::Flag >( QSGNode::IsVisitableNode << 1 );
static inline QSGNode* qskCheckedNode( const QSGNode* node, QSGNode::NodeType type )