diff options
Diffstat (limited to 'mkspecs')
47 files changed, 944 insertions, 122 deletions
diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf index 975d43779d..8569c08348 100644 --- a/mkspecs/android-clang/qmake.conf +++ b/mkspecs/android-clang/qmake.conf @@ -24,10 +24,6 @@ else: equals(ANDROID_TARGET_ARCH, x86): \ QMAKE_CFLAGS += -target i686-none-linux-android -mstackrealign else: equals(ANDROID_TARGET_ARCH, x86_64): \ QMAKE_CFLAGS += -target x86_64-none-linux-android -else: equals(ANDROID_TARGET_ARCH, mips): \ - QMAKE_CFLAGS += -target mipsel-none-linux-android -else: equals(ANDROID_TARGET_ARCH, mips64): \ - QMAKE_CFLAGS += -target mips64el-none-linux-android QMAKE_CFLAGS += -gcc-toolchain $$NDK_TOOLCHAIN_PATH -fno-limit-debug-info @@ -51,6 +47,4 @@ exists($$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so): \ else: \ ANDROID_CXX_STL_LIBS = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so.$$replace(ANDROID_PLATFORM, "android-", "") -QMAKE_CFLAGS_OPTIMIZE_SIZE = -Oz - include(../common/android-base-tail.conf) diff --git a/mkspecs/common/android-base-head.conf b/mkspecs/common/android-base-head.conf index a43fc7f23e..ba90ad5f17 100644 --- a/mkspecs/common/android-base-head.conf +++ b/mkspecs/common/android-base-head.conf @@ -19,8 +19,6 @@ NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX) isEmpty(NDK_TOOLCHAIN_PREFIX) { equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86 else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64 - else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android - else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLCHAIN_PREFIX = mips64el-linux-android else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi } @@ -29,8 +27,6 @@ NDK_TOOLS_PREFIX = $$(ANDROID_NDK_TOOLS_PREFIX) isEmpty(NDK_TOOLS_PREFIX) { equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLS_PREFIX = i686-linux-android else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLS_PREFIX = x86_64-linux-android - else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLS_PREFIX = mipsel-linux-android - else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLS_PREFIX = mips64el-linux-android else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLS_PREFIX = aarch64-linux-android else: NDK_TOOLS_PREFIX = arm-linux-androideabi } @@ -40,8 +36,6 @@ isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TO equals(ANDROID_TARGET_ARCH, x86): ANDROID_ARCHITECTURE = x86 else: equals(ANDROID_TARGET_ARCH, x86_64): ANDROID_ARCHITECTURE = x86_64 -else: equals(ANDROID_TARGET_ARCH, mips): ANDROID_ARCHITECTURE = mips -else: equals(ANDROID_TARGET_ARCH, mips64): ANDROID_ARCHITECTURE = mips64 else: equals(ANDROID_TARGET_ARCH, arm64-v8a): ANDROID_ARCHITECTURE = arm64 else: ANDROID_ARCHITECTURE = arm diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf index 5800aaa5b4..aead581478 100644 --- a/mkspecs/common/clang.conf +++ b/mkspecs/common/clang.conf @@ -16,10 +16,13 @@ QMAKE_LINK_SHLIB = $$QMAKE_CXX CONFIG += clang_pch_style QMAKE_PCH_OUTPUT_EXT = .pch +QMAKE_CFLAGS_OPTIMIZE_SIZE = -Oz + QMAKE_CFLAGS_ISYSTEM = -isystem QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CFLAGS_USE_PRECOMPILE = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT} -QMAKE_CFLAGS_LTCG = -flto +QMAKE_CFLAGS_LTCG = -flto=thin +QMAKE_CFLAGS_LTCG_FATOBJECTS = -flto QMAKE_CFLAGS_DISABLE_LTCG = -fno-lto QMAKE_CFLAGS_GNUC99 = -std=gnu99 QMAKE_CFLAGS_GNUC11 = -std=gnu11 @@ -27,13 +30,16 @@ QMAKE_CFLAGS_GNUC11 = -std=gnu11 QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG +QMAKE_CXXFLAGS_LTCG_FATOBJECTS = $$QMAKE_CFLAGS_LTCG_FATOBJECTS QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG QMAKE_CXXFLAGS_CXX11 = -std=c++11 QMAKE_CXXFLAGS_CXX14 = -std=c++1y QMAKE_CXXFLAGS_CXX1Z = -std=c++1z +QMAKE_CXXFLAGS_CXX2A = -std=c++2a QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z +QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX14 = @@ -44,3 +50,7 @@ QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG QMAKE_AR_LTCG = llvm-ar cqs QMAKE_NM_LTCG = llvm-nm -P QMAKE_RANLIB_LTCG = true # No need to run, since llvm-ar has "s" + +QMAKE_CFLAGS_COVERAGE_TRACE_PC_GUARD = -fsanitize-coverage=trace-pc-guard +QMAKE_CXXFLAGS_COVERAGE_TRACE_PC_GUARD = -fsanitize-coverage=trace-pc-guard +QMAKE_LFLAGS_COVERAGE_TRACE_PC_GUARD = -fsanitize-coverage=trace-pc-guard diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf index fa0f0c391d..8053feb876 100644 --- a/mkspecs/common/g++-base.conf +++ b/mkspecs/common/g++-base.conf @@ -32,9 +32,11 @@ QMAKE_CFLAGS_GNUC11 = -std=gnu11 QMAKE_CXXFLAGS_CXX11 = -std=c++11 QMAKE_CXXFLAGS_CXX14 = -std=c++1y QMAKE_CXXFLAGS_CXX1Z = -std=c++1z +QMAKE_CXXFLAGS_CXX2A = -std=c++2a QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z +QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a QMAKE_LFLAGS_CXX11 = QMAKE_LFLAGS_CXX14 = QMAKE_LFLAGS_CXX1Z = diff --git a/mkspecs/common/g++-win32.conf b/mkspecs/common/g++-win32.conf index f0df324b64..c3a1f3a373 100644 --- a/mkspecs/common/g++-win32.conf +++ b/mkspecs/common/g++-win32.conf @@ -31,8 +31,6 @@ QMAKE_YACCFLAGS = -d QMAKE_CFLAGS_SSE2 += -mstackrealign -QMAKE_CXXFLAGS_RTTI_ON = -frtti -QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads QMAKE_INCDIR = diff --git a/mkspecs/common/gcc-base-unix.conf b/mkspecs/common/gcc-base-unix.conf index 700f228c36..a456c8f3eb 100644 --- a/mkspecs/common/gcc-base-unix.conf +++ b/mkspecs/common/gcc-base-unix.conf @@ -20,7 +20,9 @@ QMAKE_LFLAGS_RPATH = -Wl,-rpath, QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link, QMAKE_LFLAGS_NEW_DTAGS = -Wl,--enable-new-dtags QMAKE_LFLAGS_GDB_INDEX = -Wl,--gdb-index +QMAKE_LFLAGS_USE_BFD = -fuse-ld=bfd QMAKE_LFLAGS_USE_GOLD = -fuse-ld=gold +QMAKE_LFLAGS_USE_LLD = -fuse-ld=lld # -Bsymbolic-functions (ld) support QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf index c2669e4833..4d82321cba 100644 --- a/mkspecs/common/gcc-base.conf +++ b/mkspecs/common/gcc-base.conf @@ -38,7 +38,7 @@ QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os !equals(QMAKE_HOST.os, Windows): QMAKE_CFLAGS += -pipe QMAKE_CFLAGS_DEPS += -M -QMAKE_CFLAGS_WARN_ON += -Wall -W +QMAKE_CFLAGS_WARN_ON += -Wall -Wextra QMAKE_CFLAGS_WARN_OFF += -w QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g @@ -68,6 +68,8 @@ QMAKE_CXXFLAGS_APP += $$QMAKE_CFLAGS_APP QMAKE_CXXFLAGS_YACC += $$QMAKE_CFLAGS_YACC QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden QMAKE_CXXFLAGS_EXCEPTIONS_OFF += $$QMAKE_CFLAGS_EXCEPTIONS_OFF +QMAKE_CXXFLAGS_RTTI_ON = -frtti +QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti QMAKE_CXXFLAGS_SPLIT_SECTIONS += $$QMAKE_CFLAGS_SPLIT_SECTIONS QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG QMAKE_CXXFLAGS_LTCG_FATOBJECTS = $$QMAKE_CFLAGS_LTCG_FATOBJECTS diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf index c0d4bd2acc..0b94e5a3f5 100644 --- a/mkspecs/common/msvc-desktop.conf +++ b/mkspecs/common/msvc-desktop.conf @@ -115,4 +115,5 @@ VCSOLUTION_EXTENSION = .sln VCPROJ_KEYWORD = Qt4VSv1.0 include(angle.conf) +include(windows-desktop.conf) include(windows-vulkan.conf) diff --git a/mkspecs/common/msvc-version.conf b/mkspecs/common/msvc-version.conf index 06af6abf13..af33132077 100644 --- a/mkspecs/common/msvc-version.conf +++ b/mkspecs/common/msvc-version.conf @@ -116,6 +116,8 @@ greaterThan(QMAKE_MSC_VER, 1910) { greaterThan(QMAKE_MSC_VER, 1919) { # Visual Studio 2019 (16.0) / Visual C++ 19.20 and up MSVC_VER = 16.0 + QMAKE_CXXFLAGS_CXX2A = -std:c++latest + } !isEmpty(COMPAT_MKSPEC):!$$COMPAT_MKSPEC: CONFIG += $$COMPAT_MKSPEC diff --git a/mkspecs/common/rtems-base.conf b/mkspecs/common/rtems-base.conf new file mode 100644 index 0000000000..0a015c3173 --- /dev/null +++ b/mkspecs/common/rtems-base.conf @@ -0,0 +1,73 @@ +# +# Base qmake configuration for GCC on RTEMS +# +# +# +MAKEFILE_GENERATOR = UNIX + +QMAKE_PLATFORM = rtems + +include(unix.conf) +include(gcc-base-unix.conf) +include(g++-unix.conf) + +rtems_bsp = $$(RTEMS_BSP) +isEmpty(rtems_bsp) { + error("This qmakespec requires $RTEMS_BSP to be set") +} + +rtems_compiler = $$(RTEMS_COMPILER) +isEmpty(rtems_compiler) { + error("This qmakespec requires $RTEMS_COMPILER to be set") +} + +isEmpty(RTEMS_CPU_FLAGS) { + error("The qmakespec is expected to set \$\$RTEMS_CPU_FLAGS") +} + +RTEMS_FLAGS = \ + -B$$rtems_bsp \ + -specs bsp_specs \ + -qrtems \ + $$RTEMS_CPU_FLAGS + +QMAKE_CFLAGS_OPTIMIZE_FULL = $$QMAKE_CFLAGS_OPTIMIZE +QMAKE_CFLAGS_OPTIMIZE_DEBUG = -O0 -g + +QMAKE_CFLAGS_DEBUG = $$QMAKE_CFLAGS_OPTIMIZE_DEBUG +QMAKE_CFLAGS_WARN_ON = -Wall +QMAKE_CFLAGS_PIC = +QMAKE_CFLAGS_SHLIB = +QMAKE_CFLAGS_STATIC_LIB = +QMAKE_CFLAGS_APP = +QMAKE_CFLAGS += $$RTEMS_FLAGS + +QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG +QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON +QMAKE_CXXFLAGS_SHLIB = +QMAKE_CXXFLAGS_STATIC_LIB = +QMAKE_CXXFLAGS_APP = +QMAKE_CXXFLAGS += $$RTEMS_FLAGS + +QMAKE_CXXFLAGS_CXX11 = +QMAKE_CXXFLAGS_CXX14 = +QMAKE_CXXFLAGS_CXX1Z = + +QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sections +QMAKE_LFLAGS += $$RTEMS_FLAGS $$QMAKE_LFLAGS_GCSECTIONS + +QMAKE_CC = $${rtems_compiler}-gcc +QMAKE_CXX = $${rtems_compiler}-g++ +QMAKE_AR = $${rtems_compiler}-ar cqs +QMAKE_OBJCOPY = $${rtems_compiler}-objcopy +QMAKE_NM = $${rtems_compiler}-nm -P +QMAKE_RANLIB = $${rtems_compiler}-ranlib +QMAKE_STRIP = $${rtems_compiler}-strip + +QMAKE_LINK_C = $$QMAKE_CC +QMAKE_LINK_C_SHLIB = + +QMAKE_LINK = $$QMAKE_CXX +QMAKE_LINK_SHLIB = + +load(qt_config) diff --git a/mkspecs/common/rtems/qplatformdefs.h b/mkspecs/common/rtems/qplatformdefs.h new file mode 100644 index 0000000000..1baa7c7d74 --- /dev/null +++ b/mkspecs/common/rtems/qplatformdefs.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef Q_RTEMS_PLATFORMDEFS_H +#define Q_RTEMS_PLATFORMDEFS_H + +// Get Qt defines/settings + +#include "qglobal.h" + +#include <pthread.h> +#include <dirent.h> +#include <fcntl.h> +#include <signal.h> +#include <sys/select.h> + +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/time.h> + +#include <pwd.h> +#include <grp.h> + +#include "../posix/qplatformdefs.h" + + +#ifdef __STRICT_ANSI__ +#undef __STRICT_ANSI__ +#endif + +#undef QT_OPEN_LARGEFILE +#define QT_OPEN_LARGEFILE 0 + +#endif // Q_RTEMS_PLATFORMDEFS_H diff --git a/mkspecs/common/windows-desktop.conf b/mkspecs/common/windows-desktop.conf new file mode 100644 index 0000000000..c1f2955e1b --- /dev/null +++ b/mkspecs/common/windows-desktop.conf @@ -0,0 +1,5 @@ +# This file contains initializations for Windows Desktop platforms (non-UWP) + +WINDOWS_TARGET_PLATFORM_VERSION = $$(WindowsSDKVersion) +# The version number might have a trailing backslash due to a VS bug. +WINDOWS_TARGET_PLATFORM_VERSION ~= s/\\\\$// diff --git a/mkspecs/common/winrt_winphone/qmake.conf b/mkspecs/common/winrt_winphone/qmake.conf index 375e084127..03fb96f2c5 100644 --- a/mkspecs/common/winrt_winphone/qmake.conf +++ b/mkspecs/common/winrt_winphone/qmake.conf @@ -97,6 +97,8 @@ WINRT_ASSETS_PATH = $$PWD/assets WINRT_MANIFEST.capabilities = defaults WINRT_MANIFEST.capabilities_device = defaults +WINDOWS_TARGET_PLATFORM_VERSION = $$(UCRTVERSION) + include(../angle.conf) load(qt_config) diff --git a/mkspecs/features/android/android.prf b/mkspecs/features/android/android.prf index 1dc8f87313..0e6f4a4592 100644 --- a/mkspecs/features/android/android.prf +++ b/mkspecs/features/android/android.prf @@ -1,3 +1,21 @@ +APK_PATH = $$shell_path($$OUT_PWD/android-build/$${TARGET}.apk) +!contains(TEMPLATE, subdirs): { + apk_install_target.target = apk_install_target + apk_install_target.depends = first + apk_install_target.commands = $(MAKE) -f $(MAKEFILE) INSTALL_ROOT=$$OUT_PWD/android-build install + + apk.target = apk + apk.depends = apk_install_target + qtPrepareTool(ANDROIDDEPLOYQT, androiddeployqt) + isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json + contains(QMAKE_HOST.os, Windows): extension = .exe + apk.commands = $$ANDROIDDEPLOYQT --input $$ANDROID_DEPLOYMENT_SETTINGS_FILE --output $$OUT_PWD/android-build --apk $$APK_PATH +} else { + prepareRecursiveTarget(apk) + prepareRecursiveTarget(apk_install_target) +} +QMAKE_EXTRA_TARGETS *= apk apk_install_target + contains(TEMPLATE, ".*app") { !android_app { !contains(TARGET, ".so"): TARGET = lib$${TARGET}.so diff --git a/mkspecs/features/android/android_deployment_settings.prf b/mkspecs/features/android/android_deployment_settings.prf index ad826bdad3..48943fa0f4 100644 --- a/mkspecs/features/android/android_deployment_settings.prf +++ b/mkspecs/features/android/android_deployment_settings.prf @@ -25,8 +25,6 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded { isEmpty(NDK_TOOLCHAIN_PREFIX) { equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86 else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64 - else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android - else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLCHAIN_PREFIX = mips64el-linux-android else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi } diff --git a/mkspecs/features/android/sdk.prf b/mkspecs/features/android/sdk.prf index eee7ac2d5d..fe7b9a27bd 100644 --- a/mkspecs/features/android/sdk.prf +++ b/mkspecs/features/android/sdk.prf @@ -1,6 +1,6 @@ API_VERSION_TO_USE = $$(ANDROID_API_VERSION) isEmpty(API_VERSION_TO_USE): API_VERSION_TO_USE = $$API_VERSION -isEmpty(API_VERSION_TO_USE): API_VERSION_TO_USE = android-16 +isEmpty(API_VERSION_TO_USE): API_VERSION_TO_USE = android-21 ANDROID_JAR_FILE = $$ANDROID_SDK_ROOT/platforms/$$API_VERSION_TO_USE/android.jar !exists($$ANDROID_JAR_FILE) { diff --git a/mkspecs/features/coverage.prf b/mkspecs/features/coverage.prf new file mode 100644 index 0000000000..b8b37e1b80 --- /dev/null +++ b/mkspecs/features/coverage.prf @@ -0,0 +1,7 @@ +# Coverage flags + +coverage_trace_pc_guard { + QMAKE_CFLAGS += $$QMAKE_CFLAGS_COVERAGE_TRACE_PC_GUARD + QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_COVERAGE_TRACE_PC_GUARD + QMAKE_LFLAGS += $$QMAKE_LFLAGS_COVERAGE_TRACE_PC_GUARD +} diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in index c729892889..1c4994c30f 100644 --- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in @@ -48,6 +48,69 @@ but not all the files it references. endif() endmacro() +!!IF !isEmpty(CMAKE_STATIC_TYPE) +function(_qt5_$${CMAKE_MODULE_NAME}_process_prl_file prl_file_location Configuration lib_deps link_flags) + set(_lib_deps) + set(_link_flags) + + get_filename_component(_qt5_install_libs \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/lib\" ABSOLUTE) + + if(EXISTS \"${prl_file_location}\") + file(STRINGS \"${prl_file_location}\" _prl_strings REGEX \"QMAKE_PRL_LIBS[ \\t]*=\") + string(REGEX REPLACE \"QMAKE_PRL_LIBS[ \\t]*=[ \\t]*([^\\n]*)\" \"\\\\1\" _static_depends ${_prl_strings}) + string(REGEX REPLACE \"[ \\t]+\" \";\" _static_depends ${_static_depends}) + string(REGEX REPLACE \"[ \\t]+\" \";\" _standard_libraries ${CMAKE_CXX_STANDARD_LIBRARIES}) + set(_search_paths) + string(REPLACE \"\\$\\$[QT_INSTALL_LIBS]\" \"${_qt5_install_libs}\" _static_depends \"${_static_depends}\") + foreach(_flag ${_static_depends}) + string(REPLACE \"\\\"\" \"\" _flag ${_flag}) + if(_flag MATCHES \"^-l(.*)$\") + # Handle normal libraries passed as -lfoo + set(_lib \"${CMAKE_MATCH_1}\") + foreach(_standard_library ${_standard_libraries}) + if(_standard_library MATCHES \"^${_lib}(\\.lib)?$\") + set(_lib_is_default_linked TRUE) + break() + endif() + endforeach() + if (_lib_is_default_linked) + unset(_lib_is_default_linked) + elseif(_lib MATCHES \"^pthread$\") + find_package(Threads REQUIRED) + list(APPEND _lib_deps Threads::Threads) + else() + if(_search_paths) + find_library(_Qt5$${CMAKE_MODULE_NAME}_${Configuration}_${_lib}_PATH ${_lib} HINTS ${_search_paths} NO_DEFAULT_PATH) + endif() + find_library(_Qt5$${CMAKE_MODULE_NAME}_${Configuration}_${_lib}_PATH ${_lib}) + mark_as_advanced(_Qt5$${CMAKE_MODULE_NAME}_${Configuration}_${_lib}_PATH) + if(_Qt5$${CMAKE_MODULE_NAME}_${Configuration}_${_lib}_PATH) + list(APPEND _lib_deps + ${_Qt5$${CMAKE_MODULE_NAME}_${Configuration}_${_lib}_PATH} + ) + else() + message(FATAL_ERROR \"Library not found: ${_lib}\") + endif() + endif() + elseif(EXISTS \"${_flag}\") + # The flag is an absolute path to an existing library + list(APPEND _lib_deps \"${_flag}\") + elseif(_flag MATCHES \"^-L(.*)$\") + # Handle -Lfoo flags by putting their paths in the search path used by find_library above + list(APPEND _search_paths \"${CMAKE_MATCH_1}\") + else() + # Handle all remaining flags by simply passing them to the linker + list(APPEND _link_flags ${_flag}) + endif() + endforeach() + endif() + + string(REPLACE \";\" \" \" _link_flags \"${_link_flags}\") + set(${lib_deps} ${_lib_deps} PARENT_SCOPE) + set(${link_flags} \"SHELL:${_link_flags}\" PARENT_SCOPE) +endfunction() +!!ENDIF + !!IF !equals(TEMPLATE, aux) macro(_populate_$${CMAKE_MODULE_NAME}_target_properties Configuration LIB_LOCATION IMPLIB_LOCATION) set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${Configuration}) @@ -58,15 +121,29 @@ macro(_populate_$${CMAKE_MODULE_NAME}_target_properties Configuration LIB_LOCATI set(imported_location \"$${CMAKE_DLL_DIR}${LIB_LOCATION}\") !!ENDIF _qt5_$${CMAKE_MODULE_NAME}_check_file_exists(${imported_location}) + set(_deps + ${_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES} +!!IF !isEmpty(CMAKE_STATIC_TYPE) + ${_Qt5$${CMAKE_MODULE_NAME}_STATIC_${Configuration}_LIB_DEPENDENCIES} +!!ENDIF + ) set_target_properties(Qt5::$${CMAKE_MODULE_NAME} PROPERTIES - \"INTERFACE_LINK_LIBRARIES\" \"${_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES}\" + \"INTERFACE_LINK_LIBRARIES\" \"${_deps}\" \"IMPORTED_LOCATION_${Configuration}\" ${imported_location} !!IF !isEmpty(CMAKE_LIB_SONAME) \"IMPORTED_SONAME_${Configuration}\" \"$${CMAKE_LIB_SONAME}\" !!ENDIF # For backward compatibility with CMake < 2.8.12 - \"IMPORTED_LINK_INTERFACE_LIBRARIES_${Configuration}\" \"${_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES}\" + \"IMPORTED_LINK_INTERFACE_LIBRARIES_${Configuration}\" \"${_deps}\" ) +!!IF !isEmpty(CMAKE_STATIC_TYPE) + + if(NOT CMAKE_VERSION VERSION_LESS \"3.13\") + set_target_properties(Qt5::$${CMAKE_MODULE_NAME} PROPERTIES + \"INTERFACE_LINK_OPTIONS\" \"${_Qt5$${CMAKE_MODULE_NAME}_STATIC_${Configuration}_LINK_FLAGS}\" + ) + endif() +!!ENDIF !!IF !isEmpty(CMAKE_WINDOWS_BUILD) !!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE) @@ -215,6 +292,40 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) !!ENDIF !!IF !isEmpty(CMAKE_STATIC_TYPE) + if(NOT Qt5_EXCLUDE_STATIC_DEPENDENCIES) +!!IF !isEmpty(CMAKE_DEBUG_TYPE) +!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE) + _qt5_$${CMAKE_MODULE_NAME}_process_prl_file( + \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_LIB_DIR}$${CMAKE_PRL_FILE_LOCATION_DEBUG}\" DEBUG + _Qt5$${CMAKE_MODULE_NAME}_STATIC_DEBUG_LIB_DEPENDENCIES + _Qt5$${CMAKE_MODULE_NAME}_STATIC_DEBUG_LINK_FLAGS + ) +!!ELSE + _qt5_$${CMAKE_MODULE_NAME}_process_prl_file( + \"$${CMAKE_LIB_DIR}$${CMAKE_PRL_FILE_LOCATION_DEBUG}\" DEBUG + _Qt5$${CMAKE_MODULE_NAME}_STATIC_DEBUG_LIB_DEPENDENCIES + _Qt5$${CMAKE_MODULE_NAME}_STATIC_DEBUG_LINK_FLAGS + ) +!!ENDIF +!!ENDIF + +!!IF !isEmpty(CMAKE_RELEASE_TYPE) +!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE) + _qt5_$${CMAKE_MODULE_NAME}_process_prl_file( + \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_LIB_DIR}$${CMAKE_PRL_FILE_LOCATION_RELEASE}\" RELEASE + _Qt5$${CMAKE_MODULE_NAME}_STATIC_RELEASE_LIB_DEPENDENCIES + _Qt5$${CMAKE_MODULE_NAME}_STATIC_RELEASE_LINK_FLAGS + ) +!!ELSE + _qt5_$${CMAKE_MODULE_NAME}_process_prl_file( + \"$${CMAKE_LIB_DIR}$${CMAKE_PRL_FILE_LOCATION_RELEASE}\" RELEASE + _Qt5$${CMAKE_MODULE_NAME}_STATIC_RELEASE_LIB_DEPENDENCIES + _Qt5$${CMAKE_MODULE_NAME}_STATIC_RELEASE_LINK_FLAGS + ) +!!ENDIF +!!ENDIF + endif() + add_library(Qt5::$${CMAKE_MODULE_NAME} STATIC IMPORTED) set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY IMPORTED_LINK_INTERFACE_LANGUAGES "CXX") !!ELSE diff --git a/mkspecs/features/data/testserver/Dockerfile b/mkspecs/features/data/testserver/Dockerfile new file mode 100644 index 0000000000..8fb664a1d2 --- /dev/null +++ b/mkspecs/features/data/testserver/Dockerfile @@ -0,0 +1,27 @@ +# This Dockerfile is used to provision the shared scripts (e.g. startup.sh) and configurations. It +# relies on the arguments passed by docker-compose file to build additional images for each service. +# To lean more how it works, please check the topic "Use multi-stage builds". +# https://docs.docker.com/develop/develop-images/multistage-build/ + +ARG provisioningImage +FROM $provisioningImage as testserver_tier2 + +# Add and merge the testdata into service folder +ARG serviceDir +ARG shareDir=$serviceDir +COPY $serviceDir $shareDir service/ + +# create the shared script of testserver +RUN echo "#!/usr/bin/env bash\n" \ + "set -ex\n" \ + "for RUN_CMD; do \$RUN_CMD; done\n" \ + "service dbus restart\n" \ + "service avahi-daemon restart\n" \ + "sleep infinity\n" > startup.sh +RUN chmod +x startup.sh + +# rewrite the default configurations of avahi-daemon +ARG test_domain +RUN sed -i -e "s,#domain-name=local,domain-name=${test_domain:-test-net.qt.local}," \ + -e "s,#publish-aaaa-on-ipv4=yes,publish-aaaa-on-ipv4=no," \ + /etc/avahi/avahi-daemon.conf diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf index fbf1f3b8df..0e41b825ec 100644 --- a/mkspecs/features/default_post.prf +++ b/mkspecs/features/default_post.prf @@ -78,7 +78,9 @@ stack_protector_strong { # disable special linker flags for host builds (no proper test for host support yet) !host_build|!cross_compile { + use_bfd_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_BFD use_gold_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_GOLD + use_lld_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_LLD enable_new_dtags: QMAKE_LFLAGS += $$QMAKE_LFLAGS_NEW_DTAGS enable_gdb_index: QMAKE_LFLAGS += $$QMAKE_LFLAGS_GDB_INDEX } @@ -90,6 +92,10 @@ staticlib:unix { QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_STATIC_LIB } +defined(WINDOWS_TARGET_PLATFORM_VERSION, var):isEmpty(WINDOWS_TARGET_PLATFORM_MIN_VERSION) { + WINDOWS_TARGET_PLATFORM_MIN_VERSION = $$WINDOWS_TARGET_PLATFORM_VERSION +} + incredibuild_xge { CONFIG -= incredibuild_xge CONFIG = incredibuild_xge $$CONFIG @@ -114,16 +120,18 @@ breakpad { } c++17: CONFIG += c++1z +c++latest: CONFIG *= c++2a c++1z c++14 c++11 -!c++11:!c++14:!c++1z { +!c++11:!c++14:!c++1z:!c++2a { # Qt requires C++11 since 5.7, check if we need to force a compiler option QT_COMPILER_STDCXX_no_L = $$replace(QT_COMPILER_STDCXX, "L$", "") !greaterThan(QT_COMPILER_STDCXX_no_L, 199711): CONFIG += c++11 } -c++11|c++14|c++1z { +c++11|c++14|c++1z|c++2a { # Disable special compiler flags for host builds !host_build|!cross_compile { - c++1z: cxxstd = CXX1Z + c++2a: cxxstd = CXX2A + else: c++1z: cxxstd = CXX1Z else: c++14: cxxstd = CXX14 else: cxxstd = CXX11 } else { diff --git a/mkspecs/features/exclusive_builds.prf b/mkspecs/features/exclusive_builds.prf index 1ff9a04d42..b28e74146a 100644 --- a/mkspecs/features/exclusive_builds.prf +++ b/mkspecs/features/exclusive_builds.prf @@ -38,5 +38,5 @@ defineTest(addExclusiveBuilds) { } # Default directories to process -QMAKE_DIR_REPLACE = OBJECTS_DIR MOC_DIR RCC_DIR PRECOMPILED_DIR QGLTF_DIR DESTDIR TRACEGEN_DIR QMLCACHE_DIR LRELEASE_DIR -QMAKE_DIR_REPLACE_SANE += QGLTF_DIR TRACEGEN_DIR QMLCACHE_DIR LRELEASE_DIR +QMAKE_DIR_REPLACE_SANE += QGLTF_DIR TRACEGEN_DIR QMLCACHE_DIR LRELEASE_DIR LEX_DIR YACC_DIR +QMAKE_DIR_REPLACE = OBJECTS_DIR MOC_DIR RCC_DIR PRECOMPILED_DIR DESTDIR $$QMAKE_DIR_REPLACE_SANE diff --git a/mkspecs/features/lex.prf b/mkspecs/features/lex.prf index 7d8325bedb..ee06215103 100644 --- a/mkspecs/features/lex.prf +++ b/mkspecs/features/lex.prf @@ -2,37 +2,49 @@ # Lex extra-compiler for handling files specified in the LEXSOURCES variable # -{ - lex.name = Lex ${QMAKE_FILE_IN} - lex.input = LEXSOURCES - lex.dependency_type = TYPE_C - lex_included { - lex.CONFIG += no_link - } else { - lex.variable_out = GENERATED_SOURCES - } +isEmpty(LEX_DIR): LEX_DIR = . - isEmpty(QMAKE_LEXFLAGS_MANGLE):QMAKE_LEXFLAGS_MANGLE = -P${QMAKE_FILE_BASE} +defineReplace(lexCommands) { + input = $$relative_path($$absolute_path($$1, $$OUT_PWD), $$OUT_PWD/$$LEX_DIR) + output = $$basename(2) + input_base = $$basename(1) + input_base ~= s/\.[^.]*$// + + isEmpty(QMAKE_LEXFLAGS_MANGLE): QMAKE_LEXFLAGS_MANGLE = -P$${input_base} QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS - !yacc_no_name_mangle:QMAKE_LEXEXTRAFLAGS += $$QMAKE_LEXFLAGS_MANGLE + !yacc_no_name_mangle: QMAKE_LEXEXTRAFLAGS += $$QMAKE_LEXFLAGS_MANGLE contains(QMAKE_LEX, .*flex) { # GNU flex, we can use -o outfile - lex.commands = $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS --nounistd -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} + commands = $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS --nounistd -o $$output $$input } else { # stupid POSIX lex, it only generates a file called lex.yy.c # or lex.prefix.c if the -P<prefix> option is active intermediate_file = lex.yy.c QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS $$QMAKE_LEXFLAGS_MANGLE - lex.commands = \ - -$(DEL_FILE) ${QMAKE_FILE_OUT}$$escape_expand(\\n\\t) \ - $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \ - $(MOVE) $$intermediate_file ${QMAKE_FILE_OUT} $$escape_expand(\\n\\t) - unset(intermediate_file) + commands = \ + -$(DEL_FILE) $${output}$$escape_expand(\\n\\t) \ + $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS $${input}$$escape_expand(\\n\\t) \ + $(MOVE) $$intermediate_file $$output $$escape_expand(\\n\\t) + } + !equals(LEX_DIR, .): \ + commands = cd $$LEX_DIR && $$commands + silent: commands = @echo Lex $$1 && $$commands + return($$commands) +} + +{ + lex.name = Lex ${QMAKE_FILE_IN} + lex.input = LEXSOURCES + lex.dependency_type = TYPE_C + lex_included { + lex.CONFIG += no_link + } else { + lex.variable_out = GENERATED_SOURCES } - lex.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_LEX}$${first(QMAKE_EXT_CPP)} - silent:lex.commands = @echo Lex ${QMAKE_FILE_IN} && $$lex.commands + lex.commands = ${QMAKE_FUNC_lexCommands} + lex.output = $$LEX_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_LEX}$${first(QMAKE_EXT_CPP)} QMAKE_EXTRA_COMPILERS += lex } diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf index f2dbc6fa9e..43ba482954 100644 --- a/mkspecs/features/ltcg.prf +++ b/mkspecs/features/ltcg.prf @@ -2,7 +2,7 @@ CONFIG(release, debug|release) { # We need fat object files when creating static libraries on some platforms # so the linker will know to load a particular object from the library # in the first place. On others, we have special ar and nm to create the symbol - # tables so the linker will know better. For other compilers, we disable LTCG + # tables so the linker will know better. For other compilers, we disable LTCG # for static libraries. msvc { # Nothing to do diff --git a/mkspecs/features/qml_plugin.prf b/mkspecs/features/qml_plugin.prf index ad8ecdf5f1..02068ae766 100644 --- a/mkspecs/features/qml_plugin.prf +++ b/mkspecs/features/qml_plugin.prf @@ -94,7 +94,7 @@ load(qt_common) } load(resolve_target) - TARGETPATHBASE = $$replace(TARGETPATH, \\.\\d+\$, ) + isEmpty(IMPORT_NAME): IMPORT_NAME = $$replace(TARGETPATH, \\.\\d+\$, ) !qml1_target { isEmpty(QMAKE_PLUGINDUMP_DEPENDENCIES_FILE):exists($$_PRO_FILE_PWD_/dependencies.json): \ @@ -104,7 +104,7 @@ load(qt_common) } qmltypes.target = qmltypes - qmltypes.commands = $$QMLPLUGINDUMP -nonrelocatable $$QMAKE_QMLPLUGINDUMP_FLAGS $$replace(TARGETPATHBASE, /, .) $$IMPORT_VERSION > $$QMLTYPEFILE + qmltypes.commands = $$QMLPLUGINDUMP -nonrelocatable $$QMAKE_QMLPLUGINDUMP_FLAGS $$replace(IMPORT_NAME, /, .) $$IMPORT_VERSION > $$QMLTYPEFILE qmltypes.depends = $$QMAKE_RESOLVED_TARGET } else { qmltypes.CONFIG += recursive diff --git a/mkspecs/features/qmltestcase.prf b/mkspecs/features/qmltestcase.prf index b4b1224781..ae4ebef513 100644 --- a/mkspecs/features/qmltestcase.prf +++ b/mkspecs/features/qmltestcase.prf @@ -1,8 +1,14 @@ !isEmpty(SOURCES) { QT += qml qmltest load(testcase) - contains(TEMPLATE, vc.*): DEFINES += QUICK_TEST_SOURCE_DIR=\"$$_PRO_FILE_PWD_\" - else: DEFINES += QUICK_TEST_SOURCE_DIR=$$shell_quote(\"$$_PRO_FILE_PWD_\") + !android { + contains(TEMPLATE, vc.*): DEFINES += QUICK_TEST_SOURCE_DIR=\"$$_PRO_FILE_PWD_\" + else: DEFINES += QUICK_TEST_SOURCE_DIR=$$shell_quote(\"$$_PRO_FILE_PWD_\") + } else { + !isEmpty(RESOURCES): warning("The RESOURCES qmake variable is empty, the test will probably fail to run") + DEFINES += QUICK_TEST_SOURCE_DIR=\":/\" + } + } else { # Allow a project to run tests without a CPP stub TEMPLATE = aux diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index 89f4946c50..3a71376029 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -2,7 +2,7 @@ # due to required Qt modules being missing. !isEmpty(QMAKE_FAILED_REQUIREMENTS): return() -CONFIG *= thread +qtConfig(thread): CONFIG *= thread #handle defines win32 { diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf index caecb68a84..c24f2c6062 100644 --- a/mkspecs/features/qt_common.prf +++ b/mkspecs/features/qt_common.prf @@ -17,6 +17,7 @@ DEFINES *= QT_NO_NARROWING_CONVERSIONS_IN_CONNECT qtConfig(c++11): CONFIG += c++11 strict_c++ qtConfig(c++14): CONFIG += c++14 qtConfig(c++1z): CONFIG += c++1z +qtConfig(c++2a): CONFIG += c++2a qtConfig(c99): CONFIG += c99 qtConfig(c11): CONFIG += c11 qtConfig(stack-protector-strong): CONFIG += stack_protector_strong @@ -99,14 +100,8 @@ clang { greaterThan(QT_GCC_MAJOR_VERSION, 5): QMAKE_CXXFLAGS_WARN_ON += -Wshift-overflow=2 -Wduplicated-cond # GCC 7 has a lot of false positives relating to this, so disable completely greaterThan(QT_GCC_MAJOR_VERSION, 6): QMAKE_CXXFLAGS_WARN_ON += -Wno-stringop-overflow - # GCC 9 has a lot of false positives relating to this, so disable completely - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-deprecated-copy - # GCC 9 introduced this - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-redundant-move - # GCC 9 introduced this + # GCC 9 introduced -Wformat-overflow in -Wall, but it is buggy: greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-format-overflow - # GCC 9 introduced this - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-init-list-lifetime } warnings_are_errors:warning_clean { @@ -115,10 +110,10 @@ warnings_are_errors:warning_clean { # compiler. clang { # Apple clang 4.0-4.2,5.0-5.1,6.0-6.4,7.0-7.3,8.0-8.3,9.0-9.2 - # Regular clang 3.x-6.0 + # Regular clang 3.x-7.0 apple_ver = $${QT_APPLE_CLANG_MAJOR_VERSION}.$${QT_APPLE_CLANG_MINOR_VERSION} reg_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION} - contains(apple_ver, "4\\.[012]|5\\.[01]|6\\.[01234]|7\\.[0123]|8\\.[0123]|9\\.[012]")|contains(reg_ver, "[345]\\.|6\\.0") { + contains(apple_ver, "4\\.[012]|5\\.[01]|6\\.[01234]|7\\.[0123]|8\\.[0123]|9\\.[012]")|contains(reg_ver, "[345]\\.|[67]\\.0") { QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=\\$${LITERAL_HASH}warnings -Wno-error=deprecated-declarations $$WERROR } } else:intel_icc:linux { @@ -146,20 +141,19 @@ warnings_are_errors:warning_clean { # GCC 7 includes -Wimplicit-fallthrough in -Wextra, but Qt is not yet free of implicit fallthroughs. greaterThan(QT_GCC_MAJOR_VERSION, 6): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=implicit-fallthrough - # GCC 9 has a lot of false positives relating to this, so disable completely - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-deprecated-copy + # GCC 9 introduced -Wdeprecated-copy in -Wextra, but we are not clean for it. + greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=deprecated-copy # GCC 9 introduced this - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-redundant-move + greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=redundant-move # GCC 9 introduced this - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-format-overflow - # GCC 9 introduced this - greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-init-list-lifetime + greaterThan(QT_GCC_MAJOR_VERSION, 8): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=init-list-lifetime + # Work-around for bug https://code.google.com/p/android/issues/detail?id=58135 android: QMAKE_CXXFLAGS_WARN_ON += -Wno-error=literal-suffix } } else:msvc:!intel_icl { - # enable for MSVC 2012, MSVC 2013, MSVC 2015 - contains(MSVC_VER, "1[124].0"): QMAKE_CXXFLAGS_WARN_ON += -WX + # enable for MSVC 2015, MSVC 2017 + contains(MSVC_VER, "1[45].0"): QMAKE_CXXFLAGS_WARN_ON += -WX } unset(ver) } diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 242544d41b..2ac9de266f 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -61,6 +61,13 @@ defineTest(qtConfCommandlineSetInput) { val = $${2} !isEmpty($${currentConfig}.commandline.options.$${arg}.name): \ arg = $$eval($${currentConfig}.commandline.options.$${arg}.name) + !isEmpty(config.input.$$arg) { + oldval = $$eval(config.input.$$arg) + equals(oldval, $$val): \ + qtConfAddNote("Option '$$arg' with value '$$val' was specified twice") + else: \ + qtConfAddNote("Overriding option '$$arg' with '$$val' (was: '$$oldval')") + } config.input.$$arg = $$val export(config.input.$$arg) @@ -380,8 +387,12 @@ defineTest(qtConfTest_compilerSupportsFlag) { defineTest(qtConfTest_linkerSupportsFlag) { flag = $$eval($${1}.flag) + use_bfd_linker: \ + LFLAGS = -fuse-ld=bfd use_gold_linker: \ LFLAGS = -fuse-ld=gold + use_lld_linker: \ + LFLAGS = -fuse-ld=lld return($$qtConfToolchainSupportsFlag($$LFLAGS "-Wl,$$flag")) } @@ -1262,8 +1273,12 @@ defineTest(qtConfTest_compile) { else: \ qmake_configs = "static" + use_bfd_linker: \ + qmake_configs += "use_bfd_linker" use_gold_linker: \ qmake_configs += "use_gold_linker" + use_lld_linker: \ + qmake_configs += "use_lld_linker" # disable warnings from the builds, since they're just noise at this point. qmake_configs += "warn_off" diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 18060cd490..cb3707cf8c 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -269,7 +269,7 @@ load(qt_installs) load(qt_targets) # this builds on top of qt_common -!internal_module:if(unix|mingw) { +!internal_module:if(unix|mingw):!if(darwin:debug_and_release:CONFIG(debug, debug|release)) { CONFIG += create_pc QMAKE_PKGCONFIG_DESTDIR = pkgconfig host_build: \ @@ -282,11 +282,13 @@ load(qt_targets) } else { QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw] QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE -I${includedir}/$$MODULE_INCNAME + for(inc, MODULE_AUX_INCLUDES): \ + QMAKE_PKGCONFIG_CFLAGS += -I${includedir}/$$section(inc, /, 1, 1) } QMAKE_PKGCONFIG_NAME = $$replace(TARGET, ^Qt, "Qt$$QT_MAJOR_VERSION ") - QMAKE_PKGCONFIG_FILE = $$replace(TARGET, ^Qt, Qt$$QT_MAJOR_VERSION) + QMAKE_PKGCONFIG_FILE = $$replace(TARGET, ^Qt, Qt$$QT_MAJOR_VERSION)$$qtPlatformTargetSuffix() for(i, MODULE_DEPENDS): \ - QMAKE_PKGCONFIG_REQUIRES += $$replace(QT.$${i}.name, ^Qt, Qt$$section(QT.$${i}.VERSION, ., 0, 0)) + QMAKE_PKGCONFIG_REQUIRES += $$replace(QT.$${i}.name, ^Qt, Qt$$section(QT.$${i}.VERSION, ., 0, 0))$$qtPlatformTargetSuffix() isEmpty(QMAKE_PKGCONFIG_DESCRIPTION): \ QMAKE_PKGCONFIG_DESCRIPTION = $$replace(TARGET, ^Qt, "Qt ") module pclib_replace.match = $$lib_replace.match @@ -322,5 +324,6 @@ win32 { # On other platforms, Qt's own compilation goes needs to compile the Qt 5.0 API DEFINES *= QT_DISABLE_DEPRECATED_BEFORE=0x050000 } +DEFINES *= QT_DEPRECATED_WARNINGS_SINCE=0x060000 TARGET = $$qt5LibraryTarget($$TARGET$$QT_LIBINFIX) # Do this towards the end diff --git a/mkspecs/features/qt_plugin.prf b/mkspecs/features/qt_plugin.prf index 40528a65e2..6e7388c352 100644 --- a/mkspecs/features/qt_plugin.prf +++ b/mkspecs/features/qt_plugin.prf @@ -91,6 +91,7 @@ CONFIG(static, static|shared)|prefix_build { target.path = $$[QT_INSTALL_PLUGINS]/$$PLUGIN_TYPE INSTALLS += target +qt_libinfix_plugins: TARGET = $$TARGET$$QT_LIBINFIX TARGET = $$qt5LibraryTarget($$TARGET) CONFIG += create_cmake diff --git a/mkspecs/features/win32/rtti.prf b/mkspecs/features/rtti.prf index 6d720d2438..6d720d2438 100644 --- a/mkspecs/features/win32/rtti.prf +++ b/mkspecs/features/rtti.prf diff --git a/mkspecs/features/win32/rtti_off.prf b/mkspecs/features/rtti_off.prf index b520bfa8b7..b520bfa8b7 100644 --- a/mkspecs/features/win32/rtti_off.prf +++ b/mkspecs/features/rtti_off.prf diff --git a/mkspecs/features/sanitizer.prf b/mkspecs/features/sanitizer.prf index 9e7ff0218a..c7d72aec80 100644 --- a/mkspecs/features/sanitizer.prf +++ b/mkspecs/features/sanitizer.prf @@ -1,10 +1,33 @@ # Sanitizer flags - sanitize_address { QMAKE_CFLAGS += $$QMAKE_SANITIZE_ADDRESS_CFLAGS QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_ADDRESS_CXXFLAGS QMAKE_LFLAGS += $$QMAKE_SANITIZE_ADDRESS_LFLAGS + android { + # ARM 32 (armeabi-v7a & arm5) are not supported because Qt must be rebuilt with -marm + equals(ANDROID_TARGET_ARCH, arm64-v8a): ANDROID_LIBCLANG_RT_FILE = "libclang_rt.asan-aarch64-android.so" + else: equals(ANDROID_TARGET_ARCH, x86): ANDROID_LIBCLANG_RT_FILE = "libclang_rt.asan-i686-android.so" + else: equals(ANDROID_TARGET_ARCH, x86_64): ANDROID_LIBCLANG_RT_FILE = "libclang_rt.asan-x86_64-android.so" + else: error("ASAN: Unsupported platform $${ANDROID_TARGET_ARCH}") + + ANDROID_LIBCLANG_RT_PATH = $${NDK_LLVM_PATH}/lib64/clang + ANDROID_CLANG_RT_VERSIONS = $$files($$ANDROID_LIBCLANG_RT_PATH/*) + for (VERSION, ANDROID_CLANG_RT_VERSIONS) { + greaterThan(VERSION, $$ANDROID_LIBCLANG_RT_PATH): ANDROID_LIBCLANG_RT_PATH = $$VERSION + } + ANDROID_LIBCLANG_RT_PATH = "$${ANDROID_LIBCLANG_RT_PATH}/lib/linux/" + ANDROID_WRAP_SH_CONTENT = "$$LITERAL_HASH!/system/bin/sh" + ANDROID_WRAP_SH_CONTENT += "HERE=\"$(cd \"$(dirname \"$0\")\" && pwd)\"" + isEmpty(ANDROID_ASAN_OPTIONS): ANDROID_ASAN_OPTIONS = "log_to_syslog=false,allow_user_segv_handler=1" + ANDROID_WRAP_SH_CONTENT += "export ASAN_OPTIONS=$${ANDROID_ASAN_OPTIONS}" + ANDROID_WRAP_SH_CONTENT += "export LD_PRELOAD=$HERE/$${ANDROID_LIBCLANG_RT_FILE}" + ANDROID_WRAP_SH_CONTENT += "exec \"$@\"" + write_file($$OUT_PWD/android-build/resources/lib/$${ANDROID_TARGET_ARCH}/wrap.sh, ANDROID_WRAP_SH_CONTENT) | error() + libclang_rt.path = /libs/$$ANDROID_TARGET_ARCH/ + libclang_rt.files = "$${ANDROID_LIBCLANG_RT_PATH}/$${ANDROID_LIBCLANG_RT_FILE}" + INSTALLS += libclang_rt + } } sanitize_memory { diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf index b8102c26b5..d4f08835f1 100644 --- a/mkspecs/features/testcase.prf +++ b/mkspecs/features/testcase.prf @@ -52,14 +52,26 @@ debug_and_release:debug_and_release_target { } # Allow for a custom test runner script -$${type}.commands += $(TESTRUNNER) + +android: isEmpty($(TESTRUNNER)) { + APK_PATH = $$shell_path($$OUT_PWD/android-build/$${TARGET}.apk) + qtPrepareTool(ANDROIDTESTRUNNER, androidtestrunner) + qtPrepareTool(ANDROIDDEPLOYQT, androiddeployqt) + isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json + contains(QMAKE_HOST.os, Windows): extension = .exe + $${type}.commands = $$ANDROIDTESTRUNNER --androiddeployqt \"$$ANDROIDDEPLOYQT --input $$ANDROID_DEPLOYMENT_SETTINGS_FILE\" + $${type}.commands += --path \"$$OUT_PWD/android-build\" + $${type}.commands += --adb \"$$shell_path($${ANDROID_SDK_ROOT}$${QMAKE_DIR_SEP}platform-tools$${QMAKE_DIR_SEP}adb$${extension})\" + $${type}.commands += --make \"$(MAKE) -f $(MAKEFILE)\" + $${type}.commands += --apk $$APK_PATH +} else: $${type}.commands += $(TESTRUNNER) unix { isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = . app_bundle: \ $${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET).app/Contents/MacOS/$(QMAKE_TARGET) - else: \ + else: !android: \ $${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET) } else { # Windows diff --git a/mkspecs/features/unsupported/testserver.prf b/mkspecs/features/unsupported/testserver.prf new file mode 100644 index 0000000000..6507a360c5 --- /dev/null +++ b/mkspecs/features/unsupported/testserver.prf @@ -0,0 +1,221 @@ +# Integrating docker-based test servers into Qt Test framework +# +# This file adds support for docker-based test servers built by testcase +# projects that need them. To enable this feature, any automated test can +# include testserver.pri in its project file. This instructs qmake to insert +# additional targets into the generated Makefile. The 'check' target then brings +# up test servers before running the testcase, and shuts them down afterwards. +# +# TESTSERVER_COMPOSE_FILE +# - Contains the path of docker-compose file +# This configuration file defines the services used for autotests. It tells the +# docker engine how to build up the docker images and containers. In qtbase, a +# shared docker-compose file is located in the tests folder. +# Example: TESTSERVER_COMPOSE_FILE = \ +# $$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose.yml +# +# The user must run the provisioning scripts in advance before attempting to +# build the test servers. The docker_testserver.sh script is used to build up +# the docker images into the docker-cache. It handles the immutable parts of the +# server installation that rarely need adjustment, such as downloading packages. +# Example: qt5/coin/provisioning/.../testserver/docker_testserver.sh +# +# QT_TEST_SERVER_LIST +# - A list of test servers to bring up for this testcase +# These test servers should be defined in $$TESTSERVER_COMPOSE_FILE. Each +# testcase can define the test servers it depends on. +# Example: QT_TEST_SERVER_LIST = apache2 squid vsftpd ftp-proxy danted +# +# Pre-processor defines needed for the application: +# QT_TEST_SERVER +# - A preprocessor macro used for testcase to change testing parameters at +# compile time +# This macro is predefined for docker-based test servers and is passed as a +# compiler option (-DQT_TEST_SERVER). The testcase can then check whether +# docker-based servers are in use and change the testing parameters, such as +# host name or port number, at compile time. An example can be found in +# network-settings.h. +# +# Example: +# #if defined(QT_TEST_SERVER) +# Change the testing parameters at compile time +# #endif +# +# QT_TEST_SERVER_DOMAIN +# - A preprocessor macro that holds the server domain name +# Provided for the helper functions in network-settings.h. Use function +# serverDomainName() in your application instead. +# +# Additional make targets: +# 1. check_network - A renamed target from the check target of testcase feature. +# 2. testserver_clean - Clean up server containers/images and tidy away related +# files. + +# The docker test server should only be integrated in the leaf Makefile. +# If debug_and_release option is in use, skip the meta-Makefile except for +# Makefile.Debug and Makefile.Release. +debug_and_release:!build_pass: return() + +DOCKER_ENABLED = 1 + +equals(QMAKE_HOST.os, Darwin) | equals(QMAKE_HOST.os, Windows) { + DOCKER_ENABLED = 0 + message("Not using docker network test server on macOS and Windows, see QTQAINFRA-2717 and QTQAINFRA-2750") +} + +TESTSERVER_VERSION = "" + +equals(DOCKER_ENABLED, 1) { + TESTSERVER_VERSION = $$system(docker-compose --version) +} + +isEmpty(TESTSERVER_VERSION) { + # Make check with server "qt-test-server.qt-test-net" as a fallback +} else { + # Make check with docker test servers + equals(QMAKE_HOST.os, Linux) { + # For the platform supporting docker bridge network, each container is + # assigned a unique hostname and connected to the same network domain + # to communicate with the others. + DEFINES += QT_TEST_SERVER_NAME + DNSDOMAIN = test-net.qt.local + } else { + # For the others, the containers are deployed into a virtual machine + # using the host network. All the containers share the same hostname of + # the virtual machine, and they are connected to the same network domain. + # NOTE: In Windows, Apple Bonjour only works within a single local domain. + DNSDOMAIN = local + } + + equals(QMAKE_HOST.os, Darwin) { + # There is no docker bridge on macOS. It is impossible to ping a container. + # Docker docs recommends using port mapping to connect to a container; + # but it causes a port conflict if the user is running a service that + # binds the same port on the host. An alternative solution is to deploy + # the docker environment into VirtualBox using docker-machine. + isEmpty(TESTSERVER_COMPOSE_FILE): TESTSERVER_COMPOSE_FILE = \ + $$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose-for-macOS.yml + + # The connection configuration for the target machine + MACHINE_CONFIG = $(shell docker-machine config qt-test-server) + + # The environment variables passed to the docker-compose file + TEST_ENV = 'MACHINE_IP=$(shell docker-machine ip qt-test-server)' + TEST_ENV += 'TEST_DOMAIN=$$DNSDOMAIN' + TEST_ENV += 'SHARED_DATA=$$PWD/../data/testserver' + TEST_CMD = env + } else:equals(QMAKE_HOST.os, Windows) { + # There is no docker bridge on Windows. It is impossible to ping a container. + # Use docker-machine to deploy the docker environment into VirtualBox. + isEmpty(TESTSERVER_COMPOSE_FILE): TESTSERVER_COMPOSE_FILE = \ + $$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose-for-windows.yml + + # The connection configuration for the target machine + MACHINE_CONFIG = (docker-machine config qt-test-server) + + # The environment variables passed to the docker-compose file + TEST_ENV = '\$\$env:MACHINE_IP = docker-machine ip qt-test-server;' + TEST_ENV += '\$\$env:TEST_DOMAIN = $$shell_quote(\"$$DNSDOMAIN\");' + TEST_ENV += '\$\$env:SHARED_DATA = $$shell_quote(\"$$PWD/../data/testserver\");' + + # Docker-compose CLI environment variables: + # Enable path conversion from Windows-style to Unix-style in volume definitions. + TEST_ENV += '\$\$env:COMPOSE_CONVERT_WINDOWS_PATHS = $$shell_quote(\"true\");' + + TEST_CMD = 'PowerShell -noprofile' + CONFIG += PowerShell + } else { + isEmpty(TESTSERVER_COMPOSE_FILE): TESTSERVER_COMPOSE_FILE = \ + $$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose.yml + # The environment variables passed to the docker-compose file + TEST_ENV = 'TEST_DOMAIN=$$DNSDOMAIN' + TEST_ENV += 'SHARED_DATA=$$PWD/../data/testserver' + TEST_CMD = env + } + !exists($$TESTSERVER_COMPOSE_FILE): error("Invalid TESTSERVER_COMPOSE_FILE specified") + + + # The domain name is relevant to https keycert (qnetworkreply/crts/qt-test-net-cacert.pem). + DEFINES += QT_TEST_SERVER QT_TEST_SERVER_DOMAIN=$$shell_quote(\"$${DNSDOMAIN}\") + + # Ensure that the docker-compose file is provided. It is a configuration + # file which is mandatory for all docker-compose commands. You can get more + # detail from the description of TESTSERVER_COMPOSE_FILE above. There is + # also an example showing how to configure it manually. + FILE_PRETEST_MSG = "Project variable 'TESTSERVER_COMPOSE_FILE' is not set" + PowerShell { + testserver_pretest.commands = echo $$TESTSERVER_VERSION && + testserver_pretest.commands += \ + $$TEST_CMD if ([String]::IsNullOrEmpty($$shell_quote(\"$$TESTSERVER_COMPOSE_FILE\"))) \ + {Write-Error $$shell_quote(\"$$FILE_PRETEST_MSG\")} && + } else { + testserver_pretest.commands = $(info "testserver:" $$TESTSERVER_VERSION) + testserver_pretest.commands += $(if $$TESTSERVER_COMPOSE_FILE,,$(error $$FILE_PRETEST_MSG)) + } + + # Make sure docker-machine is both created and running. The docker_machine + # script is used to deploy the docker environment into VirtualBox. + # Example: qt5/coin/provisioning/common/shared/testserver/docker_machine.sh + !isEmpty(MACHINE_CONFIG) { + MACHINE_LIST_CMD = docker-machine ls -q --filter "Name=^qt-test-server\$\$" + MACHINE_LIST_MSG = "Docker machine qt-test-server not found" + PowerShell { + testserver_pretest.commands += $$TEST_CMD if (!($$MACHINE_LIST_CMD)) \ + {Write-Error $$shell_quote(\"$$MACHINE_LIST_MSG\")} && + } else { + testserver_pretest.commands += \ + $(if $(shell $$MACHINE_LIST_CMD),,$(error $$MACHINE_LIST_MSG)) + } + + MACHINE_STATE_CMD = \ + docker-machine ls -q --filter "State=Running" --filter "Name=^qt-test-server\$\$" + MACHINE_START_CMD = docker-machine start qt-test-server + MACHINE_RECERT = docker-machine regenerate-certs -f qt-test-server + PowerShell { + testserver_pretest.commands += \ + $$TEST_CMD if (!($$MACHINE_STATE_CMD)) {$$MACHINE_START_CMD; $$MACHINE_RECERT} && + } else { + testserver_pretest.commands += \ + $(if $(shell $$MACHINE_STATE_CMD),,\ + $(shell $$MACHINE_START_CMD > /dev/null && $$MACHINE_RECERT > /dev/null)) + } + } + + # Before starting the test servers, it requires the user to run the setup + # script (coin/provisioning/.../testserver/docker_testserver.sh) in advance. + IMAGE_PRETEST_CMD = docker $$MACHINE_CONFIG images -aq "qt-test-server-*" + IMAGE_PRETEST_MSG = "Docker image qt-test-server-* not found" + PowerShell { + testserver_pretest.commands += $$TEST_CMD if (!($$IMAGE_PRETEST_CMD)) \ + {Write-Error $$shell_quote(\"$$IMAGE_PRETEST_MSG\")} + } else { + testserver_pretest.commands += \ + $(if $(shell $$IMAGE_PRETEST_CMD),,$(error $$IMAGE_PRETEST_MSG)) + } + + # Rename the check target of testcase feature + check.target = check_network + testserver_test.target = check + + # Pretesting test servers environment + testserver_test.depends = testserver_pretest + + # Bring up test servers and make sure the services are ready. + !isEmpty(TEST_CMD): testserver_test.commands = $$TEST_CMD $$TEST_ENV + testserver_test.commands += docker-compose $$MACHINE_CONFIG -f $$TESTSERVER_COMPOSE_FILE up \ + --build -d --force-recreate --timeout 1 $${QT_TEST_SERVER_LIST} && + + # Check test cases with docker-based test servers. + testserver_test.commands += $(MAKE) -f $(MAKEFILE) check_network && + + # Stop and remove test servers after testing. + !isEmpty(TEST_CMD): testserver_test.commands += $$TEST_CMD $$TEST_ENV + testserver_test.commands += docker-compose $$MACHINE_CONFIG -f $$TESTSERVER_COMPOSE_FILE down \ + --timeout 1 + + # Destroy test servers and tidy away related files. + testserver_clean.commands = docker-compose $$MACHINE_CONFIG -f $$TESTSERVER_COMPOSE_FILE down \ + --rmi all + + QMAKE_EXTRA_TARGETS += testserver_pretest testserver_test testserver_clean +} diff --git a/mkspecs/features/wasm/wasm.prf b/mkspecs/features/wasm/wasm.prf index 13ac43443d..54d351bfd5 100644 --- a/mkspecs/features/wasm/wasm.prf +++ b/mkspecs/features/wasm/wasm.prf @@ -2,6 +2,39 @@ # DESTDIR will be empty if not set in the app .pro file; make sure it has a value isEmpty(DESTDIR): DESTDIR = $$OUT_PWD +exists($$QMAKE_QT_CONFIG) { + qtConfig(thread) { + + EMCC_THREAD_LFLAGS += -s USE_PTHREADS=1 + # Hardcode wasm memory size. Emscripten does not currently support memory growth + # (ALLOW_MEMORY_GROWTH) in pthreads mode, and requires specifying the memory size + # at build time. Further, browsers limit the maximum initial memory size to 1GB. + TOTAL_MEMORY = 1GB + !isEmpty(QMAKE_WASM_TOTAL_MEMORY) { + TOTAL_MEMORY = $$QMAKE_WASM_TOTAL_MEMORY + } + + message("Setting TOTAL_MEMORY to" $$TOTAL_MEMORY) + EMCC_THREAD_LFLAGS += -s TOTAL_MEMORY=$$TOTAL_MEMORY + + # Create worker threads at startup. This is supposed to be an optimization, + # however exceeding the pool size has been obesverved to hang the application. + POOL_SIZE = 4 + !isEmpty(QMAKE_WASM_PTHREAD_POOL_SIZE) { + POOL_SIZE = $$QMAKE_WASM_PTHREAD_POOL_SIZE + } + + message("Setting PTHREAD_POOL_SIZE to" $$POOL_SIZE) + EMCC_THREAD_LFLAGS += -s PTHREAD_POOL_SIZE=$$POOL_SIZE + } else { + EMCC_THREAD_LFLAGS += -s ALLOW_MEMORY_GROWTH=1 + } + QMAKE_LFLAGS += $$EMCC_THREAD_LFLAGS + QMAKE_LFLAGS_DEBUG += $$EMCC_THREAD_LFLAGS + QMAKE_CFLAGS += $$EMCC_THREAD_LFLAGS + QMAKE_CXXFLAGS += $$EMCC_THREAD_LFLAGS +} + # Create js and wasm files for applications contains(TEMPLATE, .*app) { TARGET_BASE = $${TARGET} @@ -34,7 +67,7 @@ contains(TEMPLATE, .*app) { # replacing the app name placeholder with the actual app name. apphtml.name = application main html file apphtml.output = $$DESTDIR/$$TARGET_HTML - apphtml.commands = sed -e s/APPNAME/$$TARGET_BASE/g $$WASM_PLUGIN_PATH/wasm_shell.html > $$DESTDIR/$$TARGET_HTML + apphtml.commands = sed -e s/@APPNAME@/$$TARGET_BASE/g $$WASM_PLUGIN_PATH/wasm_shell.html > $$DESTDIR/$$TARGET_HTML apphtml.input = $$WASM_PLUGIN_PATH/wasm_shell.html apphtml.depends = $$apphtml.input QMAKE_EXTRA_COMPILERS += apphtml @@ -72,6 +105,13 @@ contains(TEMPLATE, .*app) { } } +# Pass --source-map-base on the linker line. This informs the +# browser where to find the source files when debugging. +WASM_SOURCE_MAP_BASE = http://localhost:8000/ +!isEmpty(QMAKE_WASM_SOURCE_MAP_BASE):\ + WASM_SOURCE_MAP_BASE = $$QMAKE_WASM_SOURCE_MAP_BASE +CONFIG(debug): QMAKE_LFLAGS += --source-map-base $$WASM_SOURCE_MAP_BASE + # Creates the stand-alone version of the library from bitcode !static:contains(TEMPLATE, .*lib): { load(resolve_target) diff --git a/mkspecs/features/wayland-scanner.prf b/mkspecs/features/wayland-scanner.prf index 2360917a3b..79bf02f25b 100644 --- a/mkspecs/features/wayland-scanner.prf +++ b/mkspecs/features/wayland-scanner.prf @@ -22,7 +22,7 @@ wayland_server_header.name = wayland ${QMAKE_FILE_BASE} wayland_server_header.input = WAYLANDSERVERSOURCES WAYLANDSERVERSOURCES_SYSTEM wayland_server_header.variable_out = HEADERS wayland_server_header.output = wayland-${QMAKE_FILE_BASE}-server-protocol$${first(QMAKE_EXT_H)} -wayland_server_header.commands = $$QMAKE_WAYLAND_SCANNER server-header < ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} +wayland_server_header.commands = $$QMAKE_WAYLAND_SCANNER --include-core-only server-header < ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} silent:wayland_server_header.commands = @echo Wayland server header ${QMAKE_FILE_IN} && $$wayland_server_header.commands QMAKE_EXTRA_COMPILERS += wayland_server_header @@ -30,7 +30,7 @@ wayland_client_header.name = wayland ${QMAKE_FILE_BASE} wayland_client_header.input = WAYLANDCLIENTSOURCES WAYLANDCLIENTSOURCES_SYSTEM wayland_client_header.variable_out = HEADERS wayland_client_header.output = wayland-${QMAKE_FILE_BASE}-client-protocol$${first(QMAKE_EXT_H)} -wayland_client_header.commands = $$QMAKE_WAYLAND_SCANNER client-header < ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} +wayland_client_header.commands = $$QMAKE_WAYLAND_SCANNER --include-core-only client-header < ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} silent:wayland_client_header.commands = @echo Wayland client header ${QMAKE_FILE_IN} && $$wayland_client_header.commands QMAKE_EXTRA_COMPILERS += wayland_client_header @@ -38,7 +38,7 @@ wayland_code.name = wayland ${QMAKE_FILE_BASE} wayland_code.input = WAYLANDCLIENTSOURCES WAYLANDSERVERSOURCES wayland_code.variable_out = SOURCES wayland_code.output = wayland-${QMAKE_FILE_BASE}-protocol.c -wayland_code.commands = $$QMAKE_WAYLAND_SCANNER code < ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} +wayland_code.commands = $$QMAKE_WAYLAND_SCANNER --include-core-only code < ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT} silent:wayland_code.commands = @echo Wayland code header ${QMAKE_FILE_IN} && $$wayland_code.commands QMAKE_EXTRA_COMPILERS += wayland_code diff --git a/mkspecs/features/winrt/package_manifest.prf b/mkspecs/features/winrt/package_manifest.prf index 143b884dbf..969343cfd7 100644 --- a/mkspecs/features/winrt/package_manifest.prf +++ b/mkspecs/features/winrt/package_manifest.prf @@ -69,9 +69,10 @@ isEmpty(WINRT_MANIFEST.foreground): WINRT_MANIFEST.foreground = light isEmpty(WINRT_MANIFEST.default_language): WINRT_MANIFEST.default_language = en *-msvc2015|*-msvc2017 { - isEmpty(WINRT_MANIFEST.minVersion): WINRT_MANIFEST.minVersion = $$(UCRTVersion) - isEmpty(WINRT_MANIFEST.minVersion): error("No UCRTVersion found in environment.")) - isEmpty(WINRT_MANIFEST.maxVersionTested): WINRT_MANIFEST.maxVersionTested = $$WINRT_MANIFEST.minVersion + isEmpty(WINRT_MANIFEST.minVersion): \ + WINRT_MANIFEST.minVersion = $$WINDOWS_TARGET_PLATFORM_VERSION + isEmpty(WINRT_MANIFEST.maxVersionTested): \ + WINRT_MANIFEST.maxVersionTested = $$WINDOWS_TARGET_PLATFORM_MIN_VERSION } INDENT = "$$escape_expand(\\r\\n) " diff --git a/mkspecs/features/yacc.prf b/mkspecs/features/yacc.prf index 618f0668c2..0c7ff7321e 100644 --- a/mkspecs/features/yacc.prf +++ b/mkspecs/features/yacc.prf @@ -2,32 +2,49 @@ # Yacc extra-compiler for handling files specified in the YACCSOURCES variable # -{ - yacc_decl.name = Yacc header - yacc_decl.input = YACCSOURCES - yacc_decl.variable_out = GENERATED_FILES +isEmpty(YACC_DIR): YACC_DIR = . +defineReplace(yaccCommands) { + input = $$relative_path($$absolute_path($$1, $$OUT_PWD), $$OUT_PWD/$$YACC_DIR) + input_base = $$basename(1) + input_base ~= s/\.[^.]*$// + hpp_output = $$2 + cpp_output = $$hpp_output + cpp_output ~= s/$$re_escape($$first(QMAKE_EXT_H))$/$$first(QMAKE_EXT_CPP)/ isEmpty(QMAKE_YACCFLAGS_MANGLE) { - QMAKE_YACCFLAGS_MANGLE = -p ${QMAKE_FILE_BASE} -b ${QMAKE_FILE_BASE} - QMAKE_YACC_HEADER = ${QMAKE_FILE_BASE}.tab.h - QMAKE_YACC_SOURCE = ${QMAKE_FILE_BASE}.tab.c + QMAKE_YACCFLAGS_MANGLE = -p $${input_base} -b $${input_base} + QMAKE_YACC_HEADER = $${input_base}.tab.h + QMAKE_YACC_SOURCE = $${input_base}.tab.c } else { - QMAKE_YACCFLAGS_MANGLE ~= s/\\$base/${QMAKE_FILE_BASE}/g #backwards compat - QMAKE_YACC_HEADER ~= s/\\$base/${QMAKE_FILE_BASE}/g - QMAKE_YACC_SOURCE ~= s/\\$base/${QMAKE_FILE_BASE}/g + QMAKE_YACCFLAGS_MANGLE ~= s/\\$base/$${input_base}/g #backwards compat + QMAKE_YACC_HEADER ~= s/\\$base/$${input_base}/g + QMAKE_YACC_SOURCE ~= s/\\$base/$${input_base}/g } QMAKE_YACCDECLFLAGS = $$QMAKE_YACCFLAGS - !yacc_no_name_mangle:QMAKE_YACCDECLFLAGS += $$QMAKE_YACCFLAGS_MANGLE + !yacc_no_name_mangle: QMAKE_YACCDECLFLAGS += $$QMAKE_YACCFLAGS_MANGLE - yacc_decl.commands = \ - -$(DEL_FILE) $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \ - $$QMAKE_YACC $$QMAKE_YACCDECLFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \ - $(MOVE) $${QMAKE_YACC_HEADER} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)}$$escape_expand(\\n\\t) \ - $(MOVE) $${QMAKE_YACC_SOURCE} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) - yacc_decl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} + !equals(YACC_DIR, .): yacc_call = cd $$YACC_DIR && + yacc_call += $$QMAKE_YACC $$QMAKE_YACCDECLFLAGS $${input} + + commands = \ + -$(DEL_FILE) $${hpp_output} $${cpp_output}$$escape_expand(\\n\\t) \ + $${yacc_call}$$escape_expand(\\n\\t) \ + $(MOVE) $${YACC_DIR}/$${QMAKE_YACC_HEADER} $${hpp_output}$$escape_expand(\\n\\t) \ + $(MOVE) $${YACC_DIR}/$${QMAKE_YACC_SOURCE} $${cpp_output}$$escape_expand(\\n\\t) + + silent: commands = @echo Yacc $$1 && $$commands + return($$commands) +} - silent:yacc_decl.commands = @echo Yacc ${QMAKE_FILE_IN} && $$yacc_decl.commands +yacc_output_base = $${YACC_DIR}/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC} + +{ + yacc_decl.name = Yacc header + yacc_decl.input = YACCSOURCES + yacc_decl.variable_out = GENERATED_FILES + yacc_decl.commands = ${QMAKE_FUNC_yaccCommands} + yacc_decl.output = $${yacc_output_base}$$first(QMAKE_EXT_H) QMAKE_EXTRA_COMPILERS += yacc_decl } @@ -37,7 +54,9 @@ yacc_impl.variable_out = GENERATED_SOURCES yacc_impl.dependency_type = TYPE_C yacc_impl.commands = $$escape_expand(\\n) # We don't want any commands where, but if command is empty no rules are created - yacc_impl.depends += $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} # Make sure we depend on the step above - yacc_impl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)} # Faked output from this step, output really created in step above + yacc_impl.depends += $${yacc_output_base}$$first(QMAKE_EXT_H) # Make sure we depend on the step above + yacc_impl.output = $${yacc_output_base}$$first(QMAKE_EXT_CPP) # Faked output from this step, output really created in step above QMAKE_EXTRA_COMPILERS += yacc_impl } + +unset(yacc_output_base) diff --git a/mkspecs/linux-clang-32/qmake.conf b/mkspecs/linux-clang-32/qmake.conf new file mode 100644 index 0000000000..de872e7431 --- /dev/null +++ b/mkspecs/linux-clang-32/qmake.conf @@ -0,0 +1,20 @@ +# +# qmake configuration for linux-clang +# + +MAKEFILE_GENERATOR = UNIX +CONFIG += incremental + +QMAKE_INCREMENTAL_STYLE = sublib + +include(../common/linux.conf) + +QMAKE_CFLAGS = -m32 +QMAKE_LFLAGS = -m32 + +include(../common/gcc-base-unix.conf) +include(../common/clang.conf) + +QMAKE_LFLAGS += -ccc-gcc-name g++ + +load(qt_config) diff --git a/mkspecs/linux-clang-32/qplatformdefs.h b/mkspecs/linux-clang-32/qplatformdefs.h new file mode 100644 index 0000000000..8f5ce17858 --- /dev/null +++ b/mkspecs/linux-clang-32/qplatformdefs.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../linux-clang/qplatformdefs.h" diff --git a/mkspecs/linux-clang-libc++-32/qmake.conf b/mkspecs/linux-clang-libc++-32/qmake.conf new file mode 100644 index 0000000000..f4c006d383 --- /dev/null +++ b/mkspecs/linux-clang-libc++-32/qmake.conf @@ -0,0 +1,10 @@ +# +# qmake configuration for linux-clang and libc++ +# + +include(../linux-clang-32/qmake.conf) + +QMAKE_CXXFLAGS += -stdlib=libc++ +QMAKE_LFLAGS += -stdlib=libc++ + +load(qt_config) diff --git a/mkspecs/linux-clang-libc++-32/qplatformdefs.h b/mkspecs/linux-clang-libc++-32/qplatformdefs.h new file mode 100644 index 0000000000..8f5ce17858 --- /dev/null +++ b/mkspecs/linux-clang-libc++-32/qplatformdefs.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../linux-clang/qplatformdefs.h" diff --git a/mkspecs/wasm-emscripten/qmake.conf b/mkspecs/wasm-emscripten/qmake.conf index e7b45d312d..c6c3af3622 100644 --- a/mkspecs/wasm-emscripten/qmake.conf +++ b/mkspecs/wasm-emscripten/qmake.conf @@ -5,6 +5,17 @@ QMAKE_PLATFORM = wasm unix include(../common/gcc-base.conf) include(../common/clang.conf) +load(device_config) + +# Support setting WASM_OBJECT_FILES with -device-option WASM_OBJECT_FILES=1 +!isEmpty(WASM_OBJECT_FILES): { + !equals(WASM_OBJECT_FILES, 1):!equals(WASM_OBJECT_FILES, 0): \ + message(Error: The value for WASM_OBJECT_FILES must be 0 or 1) + QMAKE_CFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES + QMAKE_CXXFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES + QMAKE_LFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES +} + EMTERP_FLAGS = \ -s EMTERPRETIFY=1 \ -s EMTERPRETIFY_ASYNC=1 \ @@ -15,7 +26,6 @@ EMTERP_FLAGS = \ EMCC_COMMON_LFLAGS = \ -s WASM=1 \ -s FULL_ES2=1 \ - -s ALLOW_MEMORY_GROWTH=1 \ -s USE_WEBGL2=1 \ -s NO_EXIT_RUNTIME=0 \ -s ERROR_ON_UNDEFINED_SYMBOLS=1 \ @@ -34,28 +44,40 @@ EMCC_COMMON_LFLAGS_DEBUG = \ # -s SOCKET_DEBUG \ #print out socket,network data transfer -s GL_DEBUG=1 +# Set up debug/optimization flags +QMAKE_CXXFLAGS_RELEASE -= -O2 +QMAKE_CFLAGS_RELEASE -= -O2 +equals(WASM_OBJECT_FILES, 1) { + QMAKE_LFLAGS_DEBUG += -g + + QMAKE_CXXFLAGS_RELEASE += -O3 + QMAKE_CFLAGS_RELEASE += -O3 + QMAKE_LFLAGS_RELEASE += -O3 + QMAKE_CFLAGS_OPTIMIZE += -O3 + QMAKE_CFLAGS_OPTIMIZE_FULL += -Oz +} else { + # Practical debugging setup: + # "-g4" preserves function names for stack traces + # "-Os" produces reasonably sized binaries + QMAKE_CFLAGS_DEBUG -= -g + QMAKE_CXXFLAGS_DEBUG -= -g + QMAKE_CFLAGS_DEBUG += -Os -g4 + QMAKE_CXXFLAGS_DEBUG += -Os -g4 + QMAKE_LFLAGS_DEBUG += -Os -g4 + + QMAKE_CXXFLAGS_RELEASE += -O3 + QMAKE_CFLAGS_RELEASE += -O3 + QMAKE_LFLAGS_RELEASE += -O3 + QMAKE_CFLAGS_OPTIMIZE += -O3 + QMAKE_CFLAGS_OPTIMIZE_FULL += -Oz +} + + QMAKE_COMPILER += emscripten QMAKE_CC = emcc QMAKE_CXX = em++ -# Practical debugging setup: -# "-g4" preserves function names for stack traces -# "-Os" produces reasonably sized binaries -QMAKE_CFLAGS_DEBUG -= -g -QMAKE_CXXFLAGS_DEBUG -= -g -QMAKE_CFLAGS_DEBUG += -Os -g4 -QMAKE_CXXFLAGS_DEBUG += -Os -g4 -QMAKE_LFLAGS_DEBUG += -Os -g4 - -QMAKE_CXXFLAGS_RELEASE -= -O2 -QMAKE_CXXFLAGS_RELEASE += -O3 -QMAKE_CFLAGS_RELEASE -= -O2 -QMAKE_CFLAGS_RELEASE += -O3 -QMAKE_LFLAGS_RELEASE += -O3 -QMAKE_CFLAGS_OPTIMIZE += -O3 -QMAKE_CFLAGS_OPTIMIZE_FULL += -Oz - QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_SHLIB = $$QMAKE_CXX QMAKE_LINK_C = $$QMAKE_CC @@ -72,6 +94,12 @@ QMAKE_PREFIX_STATICLIB = lib QMAKE_EXTENSION_STATICLIB = a # llvm bitcode QMAKE_AR = emar cqs +equals(QMAKE_HOST.os, Windows) { + QMAKE_AR_CMD = \ + "$(file >$(OBJECTS_DIR)/$(TARGET).rsp, $(subst \\,/,$(OBJECTS)))$$escape_expand(\\n\\t)" \ + "$(AR) $(DESTDIR)$(TARGET) @$(OBJECTS_DIR)/$(TARGET).rsp" +} + QMAKE_DISTCLEAN += *.html *.js *.wasm load(qt_config) diff --git a/mkspecs/win32-clang-g++/qmake.conf b/mkspecs/win32-clang-g++/qmake.conf index 4630ec4602..59d42176f0 100644 --- a/mkspecs/win32-clang-g++/qmake.conf +++ b/mkspecs/win32-clang-g++/qmake.conf @@ -24,4 +24,12 @@ QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON QMAKE_LINK = $${CROSS_COMPILE}clang++ QMAKE_LINK_C = $${CROSS_COMPILE}clang +QMAKE_CFLAGS_LTCG = -flto=thin +QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG +QMAKE_CFLAGS_LTCG_FATOBJECTS = -flto +QMAKE_CXXFLAGS_LTCG_FATOBJECTS = $$QMAKE_CFLAGS_LTCG_FATOBJECTS +QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG + +QMAKE_CFLAGS_OPTIMIZE_SIZE = -Oz + load(qt_config) diff --git a/mkspecs/win32-clang-msvc/qmake.conf b/mkspecs/win32-clang-msvc/qmake.conf index 4b9cac3e22..5da7e2d1b2 100644 --- a/mkspecs/win32-clang-msvc/qmake.conf +++ b/mkspecs/win32-clang-msvc/qmake.conf @@ -39,12 +39,16 @@ QMAKE_CXXFLAGS += -Wno-microsoft-enum-value QMAKE_LINK = lld-link QMAKE_LIB = llvm-lib /NOLOGO -QMAKE_CFLAGS_LTCG = -flto +QMAKE_CFLAGS_LTCG = -flto=thin QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG +QMAKE_CFLAGS_LTCG_FATOBJECTS = -flto +QMAKE_CXXFLAGS_LTCG_FATOBJECTS = $$QMAKE_CFLAGS_LTCG_FATOBJECTS # Leave QMAKE_LFLAGS_LTCG empty because lld-link doesn't need any additional parameters QMAKE_LFLAGS_LTCG = -# Precompiled headers are not supported yet by clang -CONFIG -= precompile_header +QMAKE_CFLAGS_OPTIMIZE_SIZE = /clang:-Oz +QMAKE_CFLAGS_OPTIMIZE_FULL = /clang:-O3 + +QMAKE_LFLAGS_RELEASE += /OPT:REF,ICF,LBR load(qt_config) diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf index 5e9923357f..5de482f23b 100644 --- a/mkspecs/win32-g++/qmake.conf +++ b/mkspecs/win32-g++/qmake.conf @@ -8,6 +8,7 @@ # include(../common/g++-win32.conf) +include(../common/windows-desktop.conf) # modifications to g++-win32.conf |