summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-11-09 15:42:05 +0100
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-11-10 16:53:31 +0100
commit4b063c8467071e1c2d40f5fc493b7e3ec5a08520 (patch)
tree1b5f214ae39c7786e285cc78ab637e124eb8635b /src
parent6e9a0f6688bd8554321f8eff10af2c9d9db564a0 (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.cmake3
-rw-r--r--src/entrypoint/CMakeLists.txt72
-rw-r--r--src/entrypoint/entrypoint.pro7
-rw-r--r--src/entrypoint/entrypoint_module.pro38
-rw-r--r--src/src.pro2
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