Skip to content

Commit

Permalink
Move iOS entrypoint logic to entrypoint library
Browse files Browse the repository at this point in the history
Change-Id: Ie0fc8368953a59d06a31847ed417bc3c35f29b90
Reviewed-by: Alexandru Croitor <[email protected]>
  • Loading branch information
torarnv committed Nov 10, 2020
1 parent 6e9a0f6 commit 4b063c8
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 66 deletions.
6 changes: 3 additions & 3 deletions cmake/QtStartupHelpers.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()
12 changes: 10 additions & 2 deletions mkspecs/features/entrypoint.prf
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 2 additions & 0 deletions mkspecs/features/uikit/default_pre.prf
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ $$sim_and_dev {
DEFINES += QT_COMPILER_SUPPORTS_SSE2
}

CONFIG += entrypoint

unset(sim_and_dev)

load(default_pre)
Expand Down
14 changes: 0 additions & 14 deletions mkspecs/features/uikit/qt.prf

This file was deleted.

3 changes: 1 addition & 2 deletions src/corelib/Qt6CoreMacros.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
72 changes: 43 additions & 29 deletions src/entrypoint/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()

Expand All @@ -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 ----

Expand Down Expand Up @@ -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
7 changes: 4 additions & 3 deletions src/entrypoint/entrypoint.pro
Original file line number Diff line number Diff line change
@@ -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
}
38 changes: 26 additions & 12 deletions src/entrypoint/entrypoint_module.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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)
2 changes: 1 addition & 1 deletion src/src.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 4b063c8

Please sign in to comment.