From 39f0685368f5a03a7e79757a7aa6c67e91e4924e Mon Sep 17 00:00:00 2001 From: Tadej Novak Date: Sat, 14 Oct 2023 14:20:12 +0200 Subject: [PATCH] [qt] Make WASM build run without crashes with latest Qt (#1709) --- .github/workflows/qt-ci.yml | 3 +- platform/qt/qt.cmake | 66 ++++++++++++++++----------- platform/qt/src/mbgl/http_request.cpp | 3 ++ vendor/csscolorparser.cmake | 2 +- vendor/icu.cmake | 10 +++- vendor/nunicode.cmake | 2 +- vendor/parsedate.cmake | 2 +- vendor/sqlite.cmake | 14 +++++- 8 files changed, 68 insertions(+), 34 deletions(-) diff --git a/.github/workflows/qt-ci.yml b/.github/workflows/qt-ci.yml index 9c6fdba91..5fb7f93b6 100644 --- a/.github/workflows/qt-ci.yml +++ b/.github/workflows/qt-ci.yml @@ -269,7 +269,8 @@ jobs: -DCMAKE_INSTALL_PREFIX="../install" \ -DMLN_WITH_QT=ON \ -DMLN_QT_DEPLOYMENT=ON \ - -DMLN_QT_WITH_INTERNAL_ICU=ON + -DMLN_QT_WITH_INTERNAL_ICU=ON \ + -DMLN_QT_WITH_INTERNAL_SQLITE=ON ninja ninja install diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake index 7a4dd4894..f90b5428c 100644 --- a/platform/qt/qt.cmake +++ b/platform/qt/qt.cmake @@ -136,17 +136,42 @@ endif() target_link_libraries( mbgl-core + PUBLIC + $ + $ + $ + $<$,$>>:z> + $,$,Qt${QT_VERSION_MAJOR}::Sql> PRIVATE $<$:${CMAKE_THREAD_LIBS_INIT}> - $<$,$>>:z> Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Network - $,mbgl-vendor-sqlite,Qt${QT_VERSION_MAJOR}::Sql> - $<$:$,mbgl-vendor-icu,ICU::uc>> - mbgl-vendor-nunicode ) +# Interface library for object linking +add_library(mbgl-core-interface INTERFACE) +target_link_libraries( + mbgl-core-interface + INTERFACE + $ $ + $ $ + $ $ + $ $ + $<$:$> + $<$:$> +) +export(TARGETS mbgl-core-interface FILE MapboxCoreTargets.cmake APPEND) + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + if (MLN_QT_WITH_INTERNAL_ICU) + target_link_libraries(mbgl-core PUBLIC $) + target_link_libraries(mbgl-core-interface INTERFACE $ $) + else() + target_link_libraries(mbgl-core PUBLIC ICU::uc) + endif() +endif() + set(qmaplibregl_headers ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/QMapLibreGL ${PROJECT_SOURCE_DIR}/platform/qt/include/QMapLibreGL/export.hpp @@ -279,20 +304,8 @@ target_link_libraries( Qt${QT_VERSION_MAJOR}::Network PRIVATE $ - $ - $ - $ - $ + $ ) -# Do not use generator expressions for cleaner output -if (MLN_QT_STATIC AND NOT MLN_QT_INSIDE_PLUGIN) - target_link_libraries( - qmaplibregl - PUBLIC - $<$>:Qt${QT_VERSION_MAJOR}::Sql> - $<$,$>>:z> - ) -endif() if (MLN_QT_STATIC OR MLN_QT_INSIDE_PLUGIN) # Don't add import/export into public header because we don't build shared library. @@ -317,16 +330,16 @@ install(TARGETS qmaplibregl ) if(NOT MLN_QT_LIBRARY_ONLY) - add_executable( - mbgl-qt + set(mbglqt_sources ${PROJECT_SOURCE_DIR}/platform/qt/app/main.cpp ${PROJECT_SOURCE_DIR}/platform/qt/app/mapwindow.cpp ${PROJECT_SOURCE_DIR}/platform/qt/app/mapwindow.hpp ${PROJECT_SOURCE_DIR}/platform/qt/resources/common.qrc ) - - if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - set(CMAKE_EXECUTABLE_SUFFIX ".html") + if (COMMAND qt_add_executable) + qt_add_executable(mbgl-qt ${mbglqt_sources}) + else() + add_executable(mbgl-qt ${mbglqt_sources}) endif() # Qt public API should keep compatibility with old compilers for legacy systems @@ -347,7 +360,10 @@ if(NOT MLN_QT_LIBRARY_ONLY) mbgl-qt PRIVATE ${PROJECT_SOURCE_DIR}/platform/qt/include ) +endif() +# tests +if(NOT MLN_QT_LIBRARY_ONLY AND NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") add_executable( mbgl-test-runner ${PROJECT_SOURCE_DIR}/platform/qt/test/main.cpp @@ -383,6 +399,8 @@ if(NOT MLN_QT_LIBRARY_ONLY) PRIVATE -Wl,--whole-archive mbgl-test -Wl,--no-whole-archive ) endif() + + add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) endif() find_program(MLN_QDOC NAMES qdoc) @@ -399,7 +417,3 @@ if(MLN_QDOC) ${CMAKE_BINARY_DIR}/docs ) endif() - -if(NOT MLN_QT_LIBRARY_ONLY) - add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) -endif() diff --git a/platform/qt/src/mbgl/http_request.cpp b/platform/qt/src/mbgl/http_request.cpp index 1a7e052b0..0fb199314 100644 --- a/platform/qt/src/mbgl/http_request.cpp +++ b/platform/qt/src/mbgl/http_request.cpp @@ -34,6 +34,8 @@ QNetworkRequest HTTPRequest::networkRequest() const { QNetworkRequest req = QNetworkRequest(requestUrl()); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + // User-Agent can not be set on WASM +#ifndef Q_OS_WASM static const QByteArray agent = !m_context->getClientOptions().name().empty() ? QString("%1/%2 (%3) MapLibreGL/%4 (Qt %5)") @@ -45,6 +47,7 @@ QNetworkRequest HTTPRequest::networkRequest() const { .toLatin1() : QString("MapLibreGL/%1 (Qt %2)").arg(version::revision).arg(QT_VERSION_STR).toLatin1(); req.setRawHeader("User-Agent", agent); +#endif if (m_resource.priorEtag) { const auto etag = m_resource.priorEtag; diff --git a/vendor/csscolorparser.cmake b/vendor/csscolorparser.cmake index c2c954fc4..0c570655e 100644 --- a/vendor/csscolorparser.cmake +++ b/vendor/csscolorparser.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-csscolorparser) return() endif() -if(MLN_WITH_QT AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") +if(MLN_WITH_QT) add_library(mbgl-vendor-csscolorparser OBJECT) else() add_library(mbgl-vendor-csscolorparser STATIC) diff --git a/vendor/icu.cmake b/vendor/icu.cmake index 7eb048e97..e43dc5ad0 100644 --- a/vendor/icu.cmake +++ b/vendor/icu.cmake @@ -2,8 +2,14 @@ if(TARGET mbgl-vendor-icu) return() endif() -add_library( - mbgl-vendor-icu STATIC +if(MLN_WITH_QT) + add_library(mbgl-vendor-icu OBJECT) +else() + add_library(mbgl-vendor-icu STATIC) +endif() + +target_sources( + mbgl-vendor-icu PRIVATE ${CMAKE_CURRENT_LIST_DIR}/icu/src/cmemory.cpp ${CMAKE_CURRENT_LIST_DIR}/icu/src/cstring.cpp ${CMAKE_CURRENT_LIST_DIR}/icu/src/ubidi.cpp diff --git a/vendor/nunicode.cmake b/vendor/nunicode.cmake index 60f63c188..640539bb1 100644 --- a/vendor/nunicode.cmake +++ b/vendor/nunicode.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-nunicode) return() endif() -if(MLN_WITH_QT AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") +if(MLN_WITH_QT) add_library(mbgl-vendor-nunicode OBJECT) else() add_library(mbgl-vendor-nunicode STATIC) diff --git a/vendor/parsedate.cmake b/vendor/parsedate.cmake index d5565a415..dfb8c8cf0 100644 --- a/vendor/parsedate.cmake +++ b/vendor/parsedate.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-parsedate) return() endif() -if(MLN_WITH_QT AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") +if(MLN_WITH_QT) add_library(mbgl-vendor-parsedate OBJECT) else() add_library(mbgl-vendor-parsedate STATIC) diff --git a/vendor/sqlite.cmake b/vendor/sqlite.cmake index 716b767e5..f0efcf2a4 100644 --- a/vendor/sqlite.cmake +++ b/vendor/sqlite.cmake @@ -2,8 +2,14 @@ if(TARGET mbgl-vendor-sqlite) return() endif() -add_library( - mbgl-vendor-sqlite STATIC +if(MLN_WITH_QT) + add_library(mbgl-vendor-sqlite OBJECT) +else() + add_library(mbgl-vendor-sqlite STATIC) +endif() + +target_sources( + mbgl-vendor-sqlite PRIVATE ${CMAKE_CURRENT_LIST_DIR}/sqlite/src/sqlite3.c ) @@ -32,3 +38,7 @@ export(TARGETS mbgl-vendor-sqlite APPEND FILE MapboxCoreTargets.cmake ) + +if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + set_target_properties(mbgl-vendor-sqlite PROPERTIES COMPILE_FLAGS "-pthread") +endif()