From 4b063c8467071e1c2d40f5fc493b7e3ec5a08520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 9 Nov 2020 15:42:05 +0100 Subject: Move iOS entrypoint logic to entrypoint library Change-Id: Ie0fc8368953a59d06a31847ed417bc3c35f29b90 Reviewed-by: Alexandru Croitor --- src/entrypoint/CMakeLists.txt | 72 +++++++++++++++++++++--------------- src/entrypoint/entrypoint.pro | 7 ++-- src/entrypoint/entrypoint_module.pro | 38 +++++++++++++------ 3 files changed, 73 insertions(+), 44 deletions(-) (limited to 'src/entrypoint') 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 + $ + ) + + 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) + 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() -# ---- Finally, make sure the static library can be consumed by clients ----- - -target_link_libraries(EntryPoint INTERFACE EntryPointImplementation) +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() -qt_internal_get_target_property(entrypoint_implementation_ldflags - EntryPointImplementation QT_MODULE_LDFLAGS) +# ---- Finally, make sure the static library can be consumed by clients ----- -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" -) +if(using_entrypoint_library) + target_link_libraries(EntryPoint INTERFACE EntryPointImplementation) + + 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(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 + } +} + +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 } -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" +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) -- cgit v1.2.3