summaryrefslogtreecommitdiffstats
path: root/src/entrypoint/CMakeLists.txt
blob: 1a145746acd0815d31ea151b925f15f010d940b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# special case begin
# special case skip regeneration
if (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS")
    return()
endif()

# The EntryPoint package consists of two targets: one for CMake consumption,
# and one internal that produces the static library. Together these form the
# entrypoint module in qmake terms. This split allows us to inject library
# dependencies that need to go _before_ the static library, to work around
# CMake's lack of whole archive.

# ---- The header-only target produces the actual module ----
qt_internal_add_module(EntryPoint
    HEADER_MODULE
    INTERNAL_MODULE
    NO_SYNC_QT
    NO_MODULE_HEADERS
    NO_PRIVATE_MODULE
    NO_ADDITIONAL_TARGET_INFO
)

# We don't need any include paths or default module defines
set_target_properties(EntryPoint PROPERTIES
    INTERFACE_INCLUDE_DIRECTORIES ""
    INTERFACE_COMPILE_DEFINITIONS ""
)

if(WIN32)
    # Not all platforms require the static library
    set(using_entrypoint_library "yes")
endif()

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_handle_multi_config_output_dirs(EntryPointImplementation)
    qt_internal_add_target_aliases(EntryPointImplementation)
    qt_set_common_target_properties(EntryPointImplementation)
endif()

# ---- Now we're ready to set up the platform specifics ----

if(WIN32)
    qt_internal_extend_target(EntryPointImplementation
        SOURCES qtentrypoint_win.cpp
        LIBRARIES shell32
    )

    if(MSVC)
        # Store debug information inside the static lib
        qt_internal_replace_compiler_flags(
            "/Zi" "/Z7"
            CONFIGS DEBUG RELWITHDEBINFO
            IN_CURRENT_SCOPE)
    endif()

    if(MINGW)
        # The mingw32 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.
        target_link_libraries(EntryPoint INTERFACE mingw32)
        set_property(TARGET EntryPoint APPEND PROPERTY INTERFACE_QT_MODULE_LDFLAGS "-lmingw32")

        target_compile_definitions(EntryPoint INTERFACE QT_NEEDS_QMAIN)
        qt_internal_extend_target(EntryPointImplementation DEFINES QT_NEEDS_QMAIN)
    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 -----

if(using_entrypoint_library)
    target_link_libraries(EntryPoint INTERFACE Qt6::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_prefix "${INSTALL_CMAKE_NAMESPACE}EntryPoint")
    qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${export_name_prefix})
    qt_internal_export_additional_targets_file(
        TARGETS EntryPoint EntryPointImplementation
        EXPORT_NAME_PREFIX ${export_name_prefix}
        CONFIG_INSTALL_DIR "${config_install_dir}")
endif()

# special case end