diff --git a/cmake/QtStartupHelpers.cmake b/cmake/QtStartupHelpers.cmake index 0ec431cbf4..15d49e3271 100644 --- a/cmake/QtStartupHelpers.cmake +++ b/cmake/QtStartupHelpers.cmake @@ -8,9 +8,9 @@ function(qt_internal_setup_startup_target) set(dependent_target "Core") - # On windows, find_package(Qt6Core) should call find_package(Qt6EntryPoint) so that Startup can - # link against EntryPoint. - if(WIN32) + # On platforms that have a Qt entry-point, find_package(Qt6Core) should call + # find_package(Qt6EntryPoint) so that we can link against EntryPoint. + if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "iOS") qt_record_extra_qt_package_dependency("${dependent_target}" EntryPoint "${PROJECT_VERSION}") endif() endfunction() diff --git a/mkspecs/features/entrypoint.prf b/mkspecs/features/entrypoint.prf index fbe637326e..98c41161a0 100644 --- a/mkspecs/features/entrypoint.prf +++ b/mkspecs/features/entrypoint.prf @@ -1,2 +1,10 @@ -qt:!console:contains(TEMPLATE, ".*app"): \ - QT_PRIVATE += entrypoint_private +!qt: return() + +win32 { + !console:contains(TEMPLATE, ".*app"): \ + QT_PRIVATE += entrypoint_private +} else:uikit { + qt_depends = $$resolve_depends(QT, "QT.") + !watchos:equals(TEMPLATE, app):contains(qt_depends, gui(-private)?): \ + QT_PRIVATE += entrypoint_private +} diff --git a/mkspecs/features/uikit/default_pre.prf b/mkspecs/features/uikit/default_pre.prf index ea6882fbc8..bc72936520 100644 --- a/mkspecs/features/uikit/default_pre.prf +++ b/mkspecs/features/uikit/default_pre.prf @@ -16,6 +16,8 @@ $$sim_and_dev { DEFINES += QT_COMPILER_SUPPORTS_SSE2 } +CONFIG += entrypoint + unset(sim_and_dev) load(default_pre) diff --git a/mkspecs/features/uikit/qt.prf b/mkspecs/features/uikit/qt.prf deleted file mode 100644 index a1720c1535..0000000000 --- a/mkspecs/features/uikit/qt.prf +++ /dev/null @@ -1,14 +0,0 @@ - -qt_depends = $$resolve_depends(QT, "QT.") -!watchos:equals(TEMPLATE, app):contains(qt_depends, gui(-private)?) { - !no_main_wrapper { - # The LC_MAIN load command available in iOS 6.0 and above allows dyld to - # directly call the entrypoint instead of going through _start in crt.o. - # Passing -e to the linker changes the entrypoint from _main to our custom - # wrapper that calls UIApplicationMain and dispatches back to main() once - # the application has started up and is ready to initialize QApplication. - QMAKE_LFLAGS += -Wl,-e,_qt_main_wrapper - } -} - -load(qt) diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index 36382445cd..d6132d5db6 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -1415,8 +1415,7 @@ function(_qt_internal_setup_startup_target) # error out when called multiple times from different scopes. set_target_properties("${target}" PROPERTIES INTERFACE_LINK_LIBRARIES "${finalGenex}") elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") - set(flag "-Wl,-e,_qt_main_wrapper") - set(finalGenex "$<$:${flag}>") + set(finalGenex "$<$Qt::EntryPoint>") set_target_properties("${target}" PROPERTIES INTERFACE_LINK_OPTIONS "${finalGenex}") endif() diff --git a/src/entrypoint/CMakeLists.txt b/src/entrypoint/CMakeLists.txt index 4045416dbf..4445f29940 100644 --- a/src/entrypoint/CMakeLists.txt +++ b/src/entrypoint/CMakeLists.txt @@ -1,6 +1,6 @@ # special case begin # special case skip regeneration -if (NOT WIN32) +if (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS") return() endif() @@ -25,18 +25,25 @@ set_target_properties(EntryPoint PROPERTIES INTERFACE_COMPILE_DEFINITIONS "" ) -# ---- While the static library target does the work ---- -qt_internal_add_cmake_library(EntryPointImplementation STATIC - INCLUDE_DIRECTORIES - $ -) +if(WIN32) + # Not all platforms require the static library + set(using_entrypoint_library "yes") +endif() -set_target_properties(EntryPointImplementation PROPERTIES - OUTPUT_NAME "${INSTALL_CMAKE_NAMESPACE}EntryPoint${QT_LIBINFIX}" - ARCHIVE_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_LIBDIR}" -) +if(using_entrypoint_library) + # ---- While the static library target does the work ---- + qt_internal_add_cmake_library(EntryPointImplementation STATIC + INCLUDE_DIRECTORIES + $ + ) -qt_internal_add_target_aliases(EntryPointImplementation) + set_target_properties(EntryPointImplementation PROPERTIES + OUTPUT_NAME "${INSTALL_CMAKE_NAMESPACE}EntryPoint${QT_LIBINFIX}" + ARCHIVE_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_LIBDIR}" + ) + + qt_internal_add_target_aliases(EntryPointImplementation) +endif() # ---- Now we're ready to set up the platform specifics ---- @@ -66,26 +73,33 @@ if(WIN32) endif() endif() +if(CMAKE_SYSTEM_NAME STREQUAL "iOS") + set_target_properties(EntryPoint PROPERTIES INTERFACE_LINK_OPTIONS "-Wl,-e,_qt_main_wrapper") + set_property(TARGET EntryPoint APPEND PROPERTY INTERFACE_QT_MODULE_LDFLAGS "-Wl,-e,_qt_main_wrapper") +endif() + # ---- Finally, make sure the static library can be consumed by clients ----- -target_link_libraries(EntryPoint INTERFACE EntryPointImplementation) +if(using_entrypoint_library) + target_link_libraries(EntryPoint INTERFACE EntryPointImplementation) -qt_internal_get_target_property(entrypoint_implementation_ldflags - EntryPointImplementation QT_MODULE_LDFLAGS) + qt_internal_get_target_property(entrypoint_implementation_ldflags + EntryPointImplementation QT_MODULE_LDFLAGS) -set_target_properties(EntryPoint PROPERTIES - INTERFACE_QT_MODULE_PRI_EXTRA_CONTENT " -QT.entrypoint_implementation.name = QtEntryPointImplementation -QT.entrypoint_implementation.module = Qt6EntryPoint -QT.entrypoint_implementation.ldflags = ${entrypoint_implementation_ldflags} -QT.entrypoint_implementation.libs = $$QT_MODULE_LIB_BASE -QT.entrypoint_implementation.module_config = staticlib v2 internal_module -" - INTERFACE_QT_MODULE_DEPENDS "entrypoint_implementation" -) + set_target_properties(EntryPoint PROPERTIES + INTERFACE_QT_MODULE_PRI_EXTRA_CONTENT " + QT.entrypoint_implementation.name = QtEntryPointImplementation + QT.entrypoint_implementation.module = Qt6EntryPoint + QT.entrypoint_implementation.ldflags = ${entrypoint_implementation_ldflags} + QT.entrypoint_implementation.libs = $$QT_MODULE_LIB_BASE + QT.entrypoint_implementation.module_config = staticlib v2 internal_module + " + INTERFACE_QT_MODULE_DEPENDS "entrypoint_implementation" + ) -set(export_name "${INSTALL_CMAKE_NAMESPACE}EntryPointTargets") -qt_install(TARGETS EntryPointImplementation EXPORT ${export_name}) -qt_generate_prl_file(EntryPointImplementation "${INSTALL_LIBDIR}") + set(export_name "${INSTALL_CMAKE_NAMESPACE}EntryPointTargets") + qt_install(TARGETS EntryPointImplementation EXPORT ${export_name}) + qt_generate_prl_file(EntryPointImplementation "${INSTALL_LIBDIR}") +endif() # special case end diff --git a/src/entrypoint/entrypoint.pro b/src/entrypoint/entrypoint.pro index 261b3e68b3..f3ba106720 100644 --- a/src/entrypoint/entrypoint.pro +++ b/src/entrypoint/entrypoint.pro @@ -1,8 +1,9 @@ -# Additional Qt project file for QtEntryPoint lib -!win32:error("$$_FILE_ is intended only for Windows!") TEMPLATE = subdirs CONFIG += ordered SUBDIRS += entrypoint_module.pro -SUBDIRS += entrypoint_implementation.pro + +win32 { + SUBDIRS += entrypoint_implementation.pro +} diff --git a/src/entrypoint/entrypoint_module.pro b/src/entrypoint/entrypoint_module.pro index 9d3188c69a..dbf87fbfc5 100644 --- a/src/entrypoint/entrypoint_module.pro +++ b/src/entrypoint/entrypoint_module.pro @@ -4,22 +4,36 @@ MODULE = entrypoint CONFIG += header_module no_module_headers internal_module -MODULE_DEPENDS = entrypoint_implementation QT = -mingw { - MODULE_DEFINES += QT_NEEDS_QMAIN +win32 { + MODULE_DEPENDS = entrypoint_implementation - # This library needs to come before the entry-point library in the - # linker line, so that the static linker will pick up the WinMain - # symbol from the entry-point library. - MODULE_LDFLAGS += -lmingw32 + mingw { + MODULE_DEFINES += QT_NEEDS_QMAIN + + # This library needs to come before the entry-point library in the + # linker line, so that the static linker will pick up the WinMain + # symbol from the entry-point library. + MODULE_LDFLAGS += -lmingw32 + } } -MODULE_PRI_EXTRA_CONTENT = \ - "QT.entrypoint_implementation.name = QtEntryPointImplementation" \ - "QT.entrypoint_implementation.module = Qt6EntryPoint" \ - "QT.entrypoint_implementation.libs = \$\$QT_MODULE_LIB_BASE" \ - "QT.entrypoint_implementation.module_config = staticlib v2 internal_module" +uikit { + # The LC_MAIN load command available in iOS 6.0 and above allows dyld to + # directly call the entrypoint instead of going through _start in crt.o. + # Passing -e to the linker changes the entrypoint from _main to our custom + # wrapper that calls UIApplicationMain and dispatches back to main() once + # the application has started up and is ready to initialize QApplication. + MODULE_LDFLAGS += -Wl,-e,_qt_main_wrapper +} + +contains(MODULE_DEPENDS, entrypoint_implementation) { + MODULE_PRI_EXTRA_CONTENT = \ + "QT.entrypoint_implementation.name = QtEntryPointImplementation" \ + "QT.entrypoint_implementation.module = Qt6EntryPoint" \ + "QT.entrypoint_implementation.libs = \$\$QT_MODULE_LIB_BASE" \ + "QT.entrypoint_implementation.module_config = staticlib v2 internal_module" +} load(qt_module) diff --git a/src/src.pro b/src/src.pro index 34fbd9d0f3..8efa4e679d 100644 --- a/src/src.pro +++ b/src/src.pro @@ -158,7 +158,7 @@ qtConfig(regularexpression):!qtConfig(system-pcre2):pcre2 { TOOLS = src_tools_moc src_tools_rcc src_tools_tracegen src_tools_qlalr SUBDIRS += src_corelib src_tools_qlalr -win32:SUBDIRS += src_entrypoint +uikit|win32:SUBDIRS += src_entrypoint qtConfig(network) { SUBDIRS += src_network