summaryrefslogtreecommitdiffstats
path: root/src/entrypoint
diff options
context:
space:
mode:
Diffstat (limited to 'src/entrypoint')
-rw-r--r--src/entrypoint/CMakeLists.txt51
-rw-r--r--src/entrypoint/EntryPointMinGW32Target.cmake.in7
-rw-r--r--src/entrypoint/qtentrypoint_win.cpp65
3 files changed, 60 insertions, 63 deletions
diff --git a/src/entrypoint/CMakeLists.txt b/src/entrypoint/CMakeLists.txt
index c173870e92..ba8342e41a 100644
--- a/src/entrypoint/CMakeLists.txt
+++ b/src/entrypoint/CMakeLists.txt
@@ -1,6 +1,7 @@
-# special case begin
-# special case skip regeneration
-if (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS")
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if (NOT (WIN32 OR UIKIT))
return()
endif()
@@ -10,6 +11,35 @@ endif()
# dependencies that need to go _before_ the static library, to work around
# CMake's lack of whole archive.
+# ---- Set up an intermediate imported library for libmingw32.a ----
+
+set(export_name_prefix "${INSTALL_CMAKE_NAMESPACE}EntryPointPrivate")
+qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${export_name_prefix})
+
+set(extra_cmake_includes_arg)
+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. In order to
+ # achieve that reliably, we create an imported library EntryPointMinGW32 that represents
+ # libmingw32.a and add a link dependency to EntryPointImplementation. The resulting dependency
+ # chain looks like this: EntryPointPrivate -> EntryPointMinGW32 -> EntryPointImplementation
+
+ set(mingw32target_config_file "${INSTALL_CMAKE_NAMESPACE}EntryPointMinGW32Target.cmake")
+ configure_file("EntryPointMinGW32Target.cmake.in" "${mingw32target_config_file}" @ONLY)
+ qt_copy_or_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${mingw32target_config_file}"
+ DESTINATION "${config_install_dir}")
+ # In prefix builds we also need to copy the file into the build config directory, so that the
+ # build-dir Qt6Config.cmake finds the files when building other repos in a top-level build.
+ if(QT_WILL_INSTALL)
+ get_filename_component(absolute_config_install_dir "${config_install_dir}" ABSOLUTE
+ BASE_DIR "${QT_BUILD_DIR}")
+ file(COPY "${CMAKE_CURRENT_BINARY_DIR}/${mingw32target_config_file}"
+ DESTINATION "${absolute_config_install_dir}")
+ endif()
+ include("${CMAKE_CURRENT_BINARY_DIR}/${mingw32target_config_file}")
+ set(extra_cmake_includes_arg EXTRA_CMAKE_INCLUDES "${mingw32target_config_file}")
+endif()
+
# ---- The header-only target produces the actual module ----
qt_internal_add_module(EntryPointPrivate
HEADER_MODULE
@@ -18,6 +48,7 @@ qt_internal_add_module(EntryPointPrivate
NO_MODULE_HEADERS
NO_PRIVATE_MODULE
NO_ADDITIONAL_TARGET_INFO
+ ${extra_cmake_includes_arg}
)
set(export_targets EntryPointPrivate)
@@ -67,10 +98,8 @@ if(WIN32)
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(EntryPointPrivate INTERFACE mingw32)
+ # Link against EntryPointImplementation via EntryPointMinGW32
+ target_link_libraries(EntryPointPrivate INTERFACE EntryPointMinGW32)
set_property(TARGET EntryPointPrivate
APPEND PROPERTY INTERFACE_QT_MODULE_LDFLAGS "-lmingw32"
)
@@ -78,9 +107,11 @@ if(WIN32)
target_compile_definitions(EntryPointPrivate INTERFACE QT_NEEDS_QMAIN)
qt_internal_extend_target(EntryPointImplementation DEFINES QT_NEEDS_QMAIN)
endif()
+
+ qt_internal_add_sync_header_dependencies(EntryPointImplementation Core)
endif()
-if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
+if(UIKIT)
set_target_properties(EntryPointPrivate PROPERTIES
INTERFACE_LINK_OPTIONS "-Wl,-e,_qt_main_wrapper"
)
@@ -113,11 +144,7 @@ QT.entrypoint_implementation.module_config = staticlib v2 internal_module
qt_generate_prl_file(EntryPointImplementation "${INSTALL_LIBDIR}")
endif()
-set(export_name_prefix "${INSTALL_CMAKE_NAMESPACE}EntryPointPrivate")
-qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${export_name_prefix})
qt_internal_export_additional_targets_file(
TARGETS ${export_targets}
EXPORT_NAME_PREFIX ${export_name_prefix}
CONFIG_INSTALL_DIR "${config_install_dir}")
-
-# special case end
diff --git a/src/entrypoint/EntryPointMinGW32Target.cmake.in b/src/entrypoint/EntryPointMinGW32Target.cmake.in
new file mode 100644
index 0000000000..81ee970d6c
--- /dev/null
+++ b/src/entrypoint/EntryPointMinGW32Target.cmake.in
@@ -0,0 +1,7 @@
+# Add EntryPointMinGW32, an imported library that ensures that -lmingw32 comes before
+# EntryPointImplementation on the linker command line.
+include_guard()
+add_library(EntryPointMinGW32 INTERFACE IMPORTED)
+set_property(TARGET EntryPointMinGW32 PROPERTY IMPORTED_LIBNAME mingw32)
+target_link_libraries(EntryPointMinGW32
+ INTERFACE @INSTALL_CMAKE_NAMESPACE@::EntryPointImplementation)
diff --git a/src/entrypoint/qtentrypoint_win.cpp b/src/entrypoint/qtentrypoint_win.cpp
index 200eb5379d..f0cf46ba3d 100644
--- a/src/entrypoint/qtentrypoint_win.cpp
+++ b/src/entrypoint/qtentrypoint_win.cpp
@@ -1,54 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Windows main function of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#include <windows.h>
+#include <qt_windows.h>
#include <shellapi.h>
/*
@@ -83,7 +36,7 @@ static inline char *wideToMulti(unsigned int codePage, const wchar_t *aw)
return result;
}
-extern "C" int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR /*cmdParamarg*/, int /* cmdShow */)
+static inline int qtEntryPoint()
{
int argc = 0;
wchar_t **argvW = CommandLineToArgvW(GetCommandLineW(), &argc);
@@ -100,3 +53,13 @@ extern "C" int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR /*cmdParamarg*/, int
delete [] argv;
return exitCode;
}
+
+extern "C" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
+{
+ return qtEntryPoint();
+}
+
+extern "C" int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
+{
+ return qtEntryPoint();
+}