Move iOS entrypoint logic to entrypoint library

Change-Id: Ie0fc8368953a59d06a31847ed417bc3c35f29b90
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Tor Arne Vestbø 2020-11-09 15:42:05 +01:00
parent 6e9a0f6688
commit 4b063c8467
9 changed files with 88 additions and 64 deletions

View File

@ -8,9 +8,9 @@
function(qt_internal_setup_startup_target) function(qt_internal_setup_startup_target)
set(dependent_target "Core") set(dependent_target "Core")
# On windows, find_package(Qt6Core) should call find_package(Qt6EntryPoint) so that Startup can # On platforms that have a Qt entry-point, find_package(Qt6Core) should call
# link against EntryPoint. # find_package(Qt6EntryPoint) so that we can link against EntryPoint.
if(WIN32) if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
qt_record_extra_qt_package_dependency("${dependent_target}" EntryPoint "${PROJECT_VERSION}") qt_record_extra_qt_package_dependency("${dependent_target}" EntryPoint "${PROJECT_VERSION}")
endif() endif()
endfunction() endfunction()

View File

@ -1,2 +1,10 @@
qt:!console:contains(TEMPLATE, ".*app"): \ !qt: return()
QT_PRIVATE += entrypoint_private
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
}

View File

@ -16,6 +16,8 @@ $$sim_and_dev {
DEFINES += QT_COMPILER_SUPPORTS_SSE2 DEFINES += QT_COMPILER_SUPPORTS_SSE2
} }
CONFIG += entrypoint
unset(sim_and_dev) unset(sim_and_dev)
load(default_pre) load(default_pre)

View File

@ -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)

View File

@ -1415,8 +1415,7 @@ function(_qt_internal_setup_startup_target)
# error out when called multiple times from different scopes. # error out when called multiple times from different scopes.
set_target_properties("${target}" PROPERTIES INTERFACE_LINK_LIBRARIES "${finalGenex}") set_target_properties("${target}" PROPERTIES INTERFACE_LINK_LIBRARIES "${finalGenex}")
elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
set(flag "-Wl,-e,_qt_main_wrapper") set(finalGenex "$<$<AND:${isExe},${isNotExcluded}>Qt::EntryPoint>")
set(finalGenex "$<$<AND:${isExe},${isNotExcluded}>:${flag}>")
set_target_properties("${target}" PROPERTIES INTERFACE_LINK_OPTIONS "${finalGenex}") set_target_properties("${target}" PROPERTIES INTERFACE_LINK_OPTIONS "${finalGenex}")
endif() endif()

View File

@ -1,6 +1,6 @@
# special case begin # special case begin
# special case skip regeneration # special case skip regeneration
if (NOT WIN32) if (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS")
return() return()
endif() endif()
@ -25,18 +25,25 @@ set_target_properties(EntryPoint PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "" INTERFACE_COMPILE_DEFINITIONS ""
) )
# ---- While the static library target does the work ---- if(WIN32)
qt_internal_add_cmake_library(EntryPointImplementation STATIC # Not all platforms require the static library
INCLUDE_DIRECTORIES set(using_entrypoint_library "yes")
$<TARGET_PROPERTY:Qt::Core,INTERFACE_INCLUDE_DIRECTORIES> endif()
)
set_target_properties(EntryPointImplementation PROPERTIES if(using_entrypoint_library)
OUTPUT_NAME "${INSTALL_CMAKE_NAMESPACE}EntryPoint${QT_LIBINFIX}" # ---- While the static library target does the work ----
ARCHIVE_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_LIBDIR}" qt_internal_add_cmake_library(EntryPointImplementation STATIC
) INCLUDE_DIRECTORIES
$<TARGET_PROPERTY:Qt::Core,INTERFACE_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 ---- # ---- Now we're ready to set up the platform specifics ----
@ -66,26 +73,33 @@ if(WIN32)
endif() endif()
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 ----- # ---- 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 qt_internal_get_target_property(entrypoint_implementation_ldflags
EntryPointImplementation QT_MODULE_LDFLAGS) EntryPointImplementation QT_MODULE_LDFLAGS)
set_target_properties(EntryPoint PROPERTIES set_target_properties(EntryPoint PROPERTIES
INTERFACE_QT_MODULE_PRI_EXTRA_CONTENT " INTERFACE_QT_MODULE_PRI_EXTRA_CONTENT "
QT.entrypoint_implementation.name = QtEntryPointImplementation QT.entrypoint_implementation.name = QtEntryPointImplementation
QT.entrypoint_implementation.module = Qt6EntryPoint QT.entrypoint_implementation.module = Qt6EntryPoint
QT.entrypoint_implementation.ldflags = ${entrypoint_implementation_ldflags} QT.entrypoint_implementation.ldflags = ${entrypoint_implementation_ldflags}
QT.entrypoint_implementation.libs = $$QT_MODULE_LIB_BASE QT.entrypoint_implementation.libs = $$QT_MODULE_LIB_BASE
QT.entrypoint_implementation.module_config = staticlib v2 internal_module QT.entrypoint_implementation.module_config = staticlib v2 internal_module
" "
INTERFACE_QT_MODULE_DEPENDS "entrypoint_implementation" INTERFACE_QT_MODULE_DEPENDS "entrypoint_implementation"
) )
set(export_name "${INSTALL_CMAKE_NAMESPACE}EntryPointTargets") set(export_name "${INSTALL_CMAKE_NAMESPACE}EntryPointTargets")
qt_install(TARGETS EntryPointImplementation EXPORT ${export_name}) qt_install(TARGETS EntryPointImplementation EXPORT ${export_name})
qt_generate_prl_file(EntryPointImplementation "${INSTALL_LIBDIR}") qt_generate_prl_file(EntryPointImplementation "${INSTALL_LIBDIR}")
endif()
# special case end # special case end

View File

@ -1,8 +1,9 @@
# Additional Qt project file for QtEntryPoint lib
!win32:error("$$_FILE_ is intended only for Windows!")
TEMPLATE = subdirs TEMPLATE = subdirs
CONFIG += ordered CONFIG += ordered
SUBDIRS += entrypoint_module.pro SUBDIRS += entrypoint_module.pro
SUBDIRS += entrypoint_implementation.pro
win32 {
SUBDIRS += entrypoint_implementation.pro
}

View File

@ -4,22 +4,36 @@ MODULE = entrypoint
CONFIG += header_module no_module_headers internal_module CONFIG += header_module no_module_headers internal_module
MODULE_DEPENDS = entrypoint_implementation
QT = QT =
mingw { win32 {
MODULE_DEFINES += QT_NEEDS_QMAIN MODULE_DEPENDS = entrypoint_implementation
# This library needs to come before the entry-point library in the mingw {
# linker line, so that the static linker will pick up the WinMain MODULE_DEFINES += QT_NEEDS_QMAIN
# symbol from the entry-point library.
MODULE_LDFLAGS += -lmingw32 # 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 = \ uikit {
"QT.entrypoint_implementation.name = QtEntryPointImplementation" \ # The LC_MAIN load command available in iOS 6.0 and above allows dyld to
"QT.entrypoint_implementation.module = Qt6EntryPoint" \ # directly call the entrypoint instead of going through _start in crt.o.
"QT.entrypoint_implementation.libs = \$\$QT_MODULE_LIB_BASE" \ # Passing -e to the linker changes the entrypoint from _main to our custom
"QT.entrypoint_implementation.module_config = staticlib v2 internal_module" # 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) load(qt_module)

View File

@ -158,7 +158,7 @@ qtConfig(regularexpression):!qtConfig(system-pcre2):pcre2 {
TOOLS = src_tools_moc src_tools_rcc src_tools_tracegen src_tools_qlalr TOOLS = src_tools_moc src_tools_rcc src_tools_tracegen src_tools_qlalr
SUBDIRS += src_corelib src_tools_qlalr SUBDIRS += src_corelib src_tools_qlalr
win32:SUBDIRS += src_entrypoint uikit|win32:SUBDIRS += src_entrypoint
qtConfig(network) { qtConfig(network) {
SUBDIRS += src_network SUBDIRS += src_network