diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-11-09 15:42:05 +0100 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-11-10 16:53:31 +0100 |
commit | 4b063c8467071e1c2d40f5fc493b7e3ec5a08520 (patch) | |
tree | 1b5f214ae39c7786e285cc78ab637e124eb8635b /src | |
parent | 6e9a0f6688bd8554321f8eff10af2c9d9db564a0 (diff) |
Move iOS entrypoint logic to entrypoint library
Change-Id: Ie0fc8368953a59d06a31847ed417bc3c35f29b90
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/Qt6CoreMacros.cmake | 3 | ||||
-rw-r--r-- | src/entrypoint/CMakeLists.txt | 72 | ||||
-rw-r--r-- | src/entrypoint/entrypoint.pro | 7 | ||||
-rw-r--r-- | src/entrypoint/entrypoint_module.pro | 38 | ||||
-rw-r--r-- | src/src.pro | 2 |
5 files changed, 75 insertions, 47 deletions
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 "$<$<AND:${isExe},${isNotExcluded}>:${flag}>") + set(finalGenex "$<$<AND:${isExe},${isNotExcluded}>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 - $<TARGET_PROPERTY:Qt::Core,INTERFACE_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 + $<TARGET_PROPERTY:Qt::Core,INTERFACE_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) 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 |