diff options
Diffstat (limited to 'src/entrypoint')
-rw-r--r-- | src/entrypoint/CMakeLists.txt | 51 | ||||
-rw-r--r-- | src/entrypoint/EntryPointMinGW32Target.cmake.in | 7 | ||||
-rw-r--r-- | src/entrypoint/qtentrypoint_win.cpp | 65 |
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(); +} |