diff options
Diffstat (limited to 'mkspecs')
31 files changed, 275 insertions, 118 deletions
diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf index ae1a365abd..31ee5d2637 100644 --- a/mkspecs/android-clang/qmake.conf +++ b/mkspecs/android-clang/qmake.conf @@ -70,6 +70,11 @@ QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined QMAKE_LFLAGS_RPATH = -Wl,-rpath= QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link= +equals(QMAKE_HOST.os, Windows) { + QMAKE_LINK_OBJECT_MAX = 10 + QMAKE_LINK_OBJECT_SCRIPT = object_script +} + QMAKE_LIBS_X11 = QMAKE_LIBS_THREAD = QMAKE_LIBS_OPENGL = diff --git a/mkspecs/common/clang-mac.conf b/mkspecs/common/clang-mac.conf index cbae2e6262..143406308c 100644 --- a/mkspecs/common/clang-mac.conf +++ b/mkspecs/common/clang-mac.conf @@ -5,6 +5,7 @@ QMAKE_OBJCXXFLAGS_PRECOMPILE = -x objective-c++-header -c ${QMAKE_PCH_INPUT} QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE QMAKE_XCODE_GCC_VERSION = com.apple.compilers.llvm.clang.1_0 +QMAKE_LFLAGS_LTCG_SEPARATE_DEBUG_INFO = -Wl,-object_path_lto,${OBJECTS_DIR}/${TARGET}_lto.o QMAKE_CXXFLAGS += -stdlib=libc++ QMAKE_LFLAGS += -stdlib=libc++ diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf index 8053feb876..c337696304 100644 --- a/mkspecs/common/g++-base.conf +++ b/mkspecs/common/g++-base.conf @@ -10,12 +10,12 @@ QMAKE_COMPILER = gcc -QMAKE_CC = gcc +QMAKE_CC = $${CROSS_COMPILE}gcc QMAKE_LINK_C = $$QMAKE_CC QMAKE_LINK_C_SHLIB = $$QMAKE_CC -QMAKE_CXX = g++ +QMAKE_CXX = $${CROSS_COMPILE}g++ QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_SHLIB = $$QMAKE_CXX diff --git a/mkspecs/common/macx.conf b/mkspecs/common/macx.conf index 67552dcc6c..d16b77acb8 100644 --- a/mkspecs/common/macx.conf +++ b/mkspecs/common/macx.conf @@ -5,9 +5,13 @@ QMAKE_PLATFORM += macos osx macx QMAKE_MAC_SDK = macosx -QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.12 +QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.13 QMAKE_APPLE_DEVICE_ARCHS = x86_64 -QT_MAC_SDK_VERSION_MIN = 10.13 + +# Should be 10.15, but as long as the CI builds with +# older SDKs we have to keep this. +QT_MAC_SDK_VERSION_MIN = 10.14 + QT_MAC_SDK_VERSION_MAX = 10.15 device.sdk = macosx diff --git a/mkspecs/common/qcc-base-qnx.conf b/mkspecs/common/qcc-base-qnx.conf index 21ce269006..4725371c29 100644 --- a/mkspecs/common/qcc-base-qnx.conf +++ b/mkspecs/common/qcc-base-qnx.conf @@ -4,6 +4,8 @@ include(qcc-base.conf) +isEmpty(QMAKE_WAYLAND_SCANNER): QMAKE_WAYLAND_SCANNER = $$(QNX_HOST)/usr/bin/wayland-scanner + QMAKE_PLATFORM = qnx $$QMAKE_PLATFORM QMAKE_LFLAGS_SHLIB += -shared diff --git a/mkspecs/common/sanitize.conf b/mkspecs/common/sanitize.conf index 5e09406cfb..8417fa4c2f 100644 --- a/mkspecs/common/sanitize.conf +++ b/mkspecs/common/sanitize.conf @@ -17,6 +17,10 @@ QMAKE_SANITIZE_MEMORY_CFLAGS = -fsanitize=memory QMAKE_SANITIZE_MEMORY_CXXFLAGS = -fsanitize=memory QMAKE_SANITIZE_MEMORY_LFLAGS = -fsanitize=memory +QMAKE_SANITIZE_FUZZERNL_CFLAGS = -fsanitize=fuzzer-no-link +QMAKE_SANITIZE_FUZZERNL_CXXFLAGS = -fsanitize=fuzzer-no-link +QMAKE_SANITIZE_FUZZERNL_LFLAGS = -fsanitize=fuzzer-no-link + QMAKE_SANITIZE_UNDEFINED_CFLAGS = -fsanitize=undefined QMAKE_SANITIZE_UNDEFINED_CXXFLAGS = -fsanitize=undefined QMAKE_SANITIZE_UNDEFINED_LFLAGS = -fsanitize=undefined diff --git a/mkspecs/common/uikit.conf b/mkspecs/common/uikit.conf index 0388b8e616..424381e285 100644 --- a/mkspecs/common/uikit.conf +++ b/mkspecs/common/uikit.conf @@ -7,4 +7,6 @@ CONFIG += bitcode reduce_exports shallow_bundle no_qt_rpath INCLUDEPATH += $$PWD/uikit +DEFINES += GLES_SILENCE_DEPRECATION + include(mac.conf) diff --git a/mkspecs/features/android/android.prf b/mkspecs/features/android/android.prf index fc0ff553d0..8290286ec6 100644 --- a/mkspecs/features/android/android.prf +++ b/mkspecs/features/android/android.prf @@ -36,14 +36,15 @@ build_pass { } } } else: contains(TEMPLATE, "lib"):!static:!QTDIR_build:android_install { + tmpvar = $$str_member(TARGET, -$$str_size(QT_ARCH), -1) + !equals(tmpvar, $${QT_ARCH}): TARGET = $${TARGET}_$${QT_ARCH} target.path = /libs/$$ANDROID_TARGET_ARCH/ INSTALLS *= target } } else { - QMAKE_EXTRA_TARGETS *= aab apk apk_install_target - android-build-distclean.commands = \ $$QMAKE_DEL_TREE $$shell_quote($$shell_path($$OUT_PWD/android-build)) QMAKE_EXTRA_TARGETS *= android-build-distclean CLEAN_DEPS += android-build-distclean } +QMAKE_EXTRA_TARGETS *= aab apk apk_install_target diff --git a/mkspecs/features/android/android_deployment_settings.prf b/mkspecs/features/android/android_deployment_settings.prf index 4d6101e297..f375a687a9 100644 --- a/mkspecs/features/android/android_deployment_settings.prf +++ b/mkspecs/features/android/android_deployment_settings.prf @@ -63,6 +63,23 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded { QML_ROOT_PATH = $$_PRO_FILE_PWD_ FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_PATH)," FILE_CONTENT += " \"stdcpp-path\": $$emitString($$ANDROID_STDCPP_PATH)," + !isEmpty(RESOURCES)|!isEmpty(QMLCACHE_RESOURCE_FILES) { + # Make sure that qmake generated qrc files are accounted for + load(resources_functions) + qtFlattenResources() + NEWRESOURCES = $$RESOURCES $$QMLCACHE_RESOURCE_FILES + for(resource, NEWRESOURCES) { + contains(resource, ".*\\qmake_qmake_immediate.qrc$") { + # They will be created for each architecture, since they could be different + # we need to account for all of them + for (arch, ANDROID_ABIS): \ + rescopy += $$absolute_path("qmake_qmake_immediate.qrc", $$OUT_PWD/$$arch) + } else { + contains(resource, ".*\\.qrc$"): rescopy += $$absolute_path($$resource, $$_PRO_FILE_PWD_) + } + } + FILE_CONTENT += " \"qrcFiles\": $$emitString($$join(rescopy, ","))," + } FILE_CONTENT += "" FILE_CONTENT += " \"application-binary\": $$emitString($$TARGET)" FILE_CONTENT += "}" diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in index 364c23e750..26d4c17e6c 100644 --- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in @@ -72,18 +72,28 @@ function(_qt5_$${CMAKE_MODULE_NAME}_process_prl_file prl_file_location Configura string(REGEX REPLACE \"QMAKE_PRL_LIBS_FOR_CMAKE[ \\t]*=[ \\t]*([^\\n]*)\" \"\\\\1\" _static_depends \"${_prl_strings}\") string(REGEX REPLACE \"[ \\t]+\" \";\" _standard_libraries \"${CMAKE_CXX_STANDARD_LIBRARIES}\") set(_search_paths) + set(_framework_flag) 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(_flag MATCHES \"^-framework$\") + # Handle the next flag as framework name + set(_framework_flag 1) + elseif(_framework_flag OR _flag MATCHES \"^-l(.*)$\") + if(_framework_flag) + # Handle Darwin framework bundles passed as -framework Foo + unset(_framework_flag) + set(_lib ${_flag}) + else() + # 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() + endif() if (_lib_is_default_linked) unset(_lib_is_default_linked) elseif(_lib MATCHES \"^pthread$\") @@ -173,11 +183,20 @@ macro(_populate_$${CMAKE_MODULE_NAME}_target_properties Configuration LIB_LOCATI endif() set(_static_link_flags \"${_Qt5$${CMAKE_MODULE_NAME}_STATIC_${Configuration}_LINK_FLAGS}\") - if(NOT CMAKE_VERSION VERSION_LESS \"3.13\" AND _static_link_flags) + if(_static_link_flags) set(_static_link_flags_genex \"$<${_genex_condition}:${_static_link_flags}>\") - set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} APPEND PROPERTY INTERFACE_LINK_OPTIONS - \"${_static_link_flags_genex}\" - ) + if(NOT CMAKE_VERSION VERSION_LESS \"3.13\") + set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} APPEND PROPERTY INTERFACE_LINK_OPTIONS + \"${_static_link_flags_genex}\" + ) + else() + # Abuse INTERFACE_LINK_LIBRARIES to add link flags when CMake version is too low. + # Strip out SHELL:, because it is not supported in this property. And hope for the best. + string(REPLACE \"SHELL:\" \"\" _static_link_flags_genex \"${_static_link_flags_genex}\") + set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} APPEND PROPERTY INTERFACE_LINK_LIBRARIES + \"${_static_link_flags_genex}\" + ) + endif() endif() !!ENDIF @@ -546,11 +565,20 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) endif() set(_static_link_flags \"${_Qt5${Plugin}_STATIC_${Configuration}_LINK_FLAGS}\") - if(NOT CMAKE_VERSION VERSION_LESS \"3.13\" AND _static_link_flags) + if(_static_link_flags) set(_static_link_flags_genex \"$<${_genex_condition}:${_static_link_flags}>\") - set_property(TARGET Qt5::${Plugin} APPEND PROPERTY INTERFACE_LINK_OPTIONS - \"${_static_link_flags_genex}\" - ) + if(NOT CMAKE_VERSION VERSION_LESS \"3.13\") + set_property(TARGET Qt5::${Plugin} APPEND PROPERTY INTERFACE_LINK_OPTIONS + \"${_static_link_flags_genex}\" + ) + else() + # Abuse INTERFACE_LINK_LIBRARIES to add link flags when CMake version is too low. + # Strip out SHELL:, because it is not supported in this property. And hope for the best. + string(REPLACE \"SHELL:\" \"\" _static_link_flags_genex \"${_static_link_flags_genex}\") + set_property(TARGET Qt5::${Plugin} APPEND PROPERTY INTERFACE_LINK_LIBRARIES + \"${_static_link_flags_genex}\" + ) + endif() endif() !!ENDIF endmacro() diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf index 10d14dfe85..d81f340edd 100644 --- a/mkspecs/features/ltcg.prf +++ b/mkspecs/features/ltcg.prf @@ -1,6 +1,12 @@ static:no-static-ltcg { # Static library but no-static-ltcg enabled: skip LTCG } else: CONFIG(release, debug|release) { + separate_debug_info { + # Evaluate single-$ variable references that have no valid value at mkspec loading time + QMAKE_LFLAGS_LTCG_SEPARATE_DEBUG_INFO ~= s/\\$\\{/\$\$\{/ + eval(QMAKE_LFLAGS_LTCG += $$QMAKE_LFLAGS_LTCG_SEPARATE_DEBUG_INFO) + } + # 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 diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf index 03084c7f07..ba163efc18 100644 --- a/mkspecs/features/mac/default_post.prf +++ b/mkspecs/features/mac/default_post.prf @@ -212,14 +212,17 @@ macx-xcode { QMAKE_CXXFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS) QMAKE_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS) } else { - simulator: \ + simulator { version_identifier = $$simulator.deployment_identifier - else: \ + sysroot_path = $$xcodeSDKInfo(Path, $$simulator.sdk) + } else { version_identifier = $$device.deployment_identifier + sysroot_path = $$xcodeSDKInfo(Path, $$device.sdk) + } version_min_flag = -m$${version_identifier}-version-min=$$deployment_target - QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag - QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag - QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH $$version_min_flag + QMAKE_CFLAGS += -isysroot $$sysroot_path $$version_min_flag + QMAKE_CXXFLAGS += -isysroot $$sysroot_path $$version_min_flag + QMAKE_LFLAGS += -Wl,-syslibroot,$$sysroot_path $$version_min_flag } # Enable precompiled headers for multiple architectures diff --git a/mkspecs/features/metatypes.prf b/mkspecs/features/metatypes.prf index 64387458ac..59ef914f63 100644 --- a/mkspecs/features/metatypes.prf +++ b/mkspecs/features/metatypes.prf @@ -1,5 +1,7 @@ qtPrepareTool(MOC_COLLECT_JSON, moc) +load(qt_build_paths) + QMAKE_MOC_OPTIONS += --output-json MOC_JSON_H_BASE = $${QMAKE_H_MOD_MOC} @@ -26,17 +28,26 @@ moc_json_source.variable_out = MOC_JSON_FILES MOC_COLLECT_JSON_OUTPUT = $$lower($$basename(TARGET))_metatypes.json -moc_collect_json.CONFIG += no_link combine +moc_collect_json.CONFIG += no_link combine target_predeps moc_collect_json.commands = $$MOC_COLLECT_JSON --collect-json -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} moc_collect_json.input = MOC_JSON_FILES moc_collect_json.output = $$MOC_COLLECT_JSON_OUTPUT moc_collect_json.name = Collect moc JSON output into central file install_metatypes { - do_install.path = $$[QT_INSTALL_LIBS]/metatypes - do_install.files = $$OUT_PWD/$$MOC_COLLECT_JSON_OUTPUT - prefix_build: INSTALLS += do_install - else: COPIES += do_install + do_install_metatypes.CONFIG += no_check_exist + do_install_metatypes.path = $$[QT_INSTALL_LIBS]/metatypes + do_install_metatypes.files = $$OUT_PWD/$$MOC_COLLECT_JSON_OUTPUT + prefix_build { + !isEmpty(MODULE_BASE_OUTDIR) { + metatypes_to_builddir.files = $$do_install_metatypes.files + metatypes_to_builddir.path = $$MODULE_BASE_OUTDIR/lib/metatypes + COPIES += metatypes_to_builddir + } + INSTALLS += do_install_metatypes + } else { + COPIES += do_install_metatypes + } } QMAKE_EXTRA_COMPILERS += moc_collect_json moc_json_header moc_json_source diff --git a/mkspecs/features/qml_plugin.prf b/mkspecs/features/qml_plugin.prf index f1c5658b04..74ab932f80 100644 --- a/mkspecs/features/qml_plugin.prf +++ b/mkspecs/features/qml_plugin.prf @@ -68,7 +68,10 @@ load(qt_common) # To regenerate run 'make qmltypes' which will update the plugins.qmltypes file in the source # directory. Then review and commit the changes made to plugins.qmltypes. # -!cross_compile { +# Due to the above mentioned drawbacks, there is a better mechanism available now: qmltyperegistrar +# can generate the .qmltypes files at compile time. It will do this when CONFIG += qmltypes is set. +# Therefore, don't try to generate the qmltypes files via qmlplugindump in that case. +!cross_compile:!qmltypes { qmlplugindump = qmlplugindump importpath.name = QML2_IMPORT_PATH importpath.value = @@ -84,12 +87,13 @@ load(qt_common) # against concurrent wrapper creation by omitting it during build passes. # However, creating the actual targets is reserved to the build passes. build_pass|!debug_and_release { - isEmpty(IMPORT_VERSION) { + isEmpty(QML_IMPORT_VERSION):!isEmpty(IMPORT_VERSION): QML_IMPORT_VERSION = $$IMPORT_VERSION + isEmpty(QML_IMPORT_VERSION) { no_cxx_module { - IMPORT_VERSION = $$section(MODULE_VERSION, ., 0, 1) - isEmpty(IMPORT_VERSION): error("Must set IMPORT_VERSION") + QML_IMPORT_VERSION = $$section(MODULE_VERSION, ., 0, 1) + isEmpty(QML_IMPORT_VERSION): error("Must set QML_IMPORT_VERSION") } else { - IMPORT_VERSION = $$section(QT.$${CXX_MODULE}.VERSION, ., 0, 1) + QML_IMPORT_VERSION = $$section(QT.$${CXX_MODULE}.VERSION, ., 0, 1) } } @@ -104,7 +108,7 @@ load(qt_common) } qmltypes.target = qmltypes - qmltypes.commands = $$QMLPLUGINDUMP -nonrelocatable $$QMAKE_QMLPLUGINDUMP_FLAGS $$replace(IMPORT_NAME, /, .) $$IMPORT_VERSION > $$QMLTYPEFILE + qmltypes.commands = $$QMLPLUGINDUMP -nonrelocatable $$QMAKE_QMLPLUGINDUMP_FLAGS $$replace(IMPORT_NAME, /, .) $$QML_IMPORT_VERSION > $$QMLTYPEFILE qmltypes.depends = $$QMAKE_RESOLVED_TARGET } else { qmltypes.CONFIG += recursive diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index adac835c26..6537d98c5d 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -666,6 +666,7 @@ defineTest(qtConfLibrary_inline) { vars += $$eval(config.commandline.rev_assignments.$${iv}) defined(config.input.$${iv}, var) { eval($${1}.builds.$${b} = $$eval(config.input.$${iv})) + export($${1}.builds.$${b}) $${1}.builds._KEYS_ *= $${b} any = true } else { @@ -680,11 +681,14 @@ defineTest(qtConfLibrary_inline) { export($${1}.builds._KEYS_) # we also reset the generic libs, to avoid surprises. $${1}.libs = + export($${1}.libs) } # direct libs. overwrites inline libs. - defined(config.input.$${input}.libs, var): \ + defined(config.input.$${input}.libs, var) { eval($${1}.libs = $$eval(config.input.$${input}.libs)) + export($${1}.libs) + } includes = $$eval(config.input.$${input}.incdir) @@ -693,6 +697,7 @@ defineTest(qtConfLibrary_inline) { !isEmpty(prefix) { includes += $$prefix/include $${1}.libs = -L$$prefix/lib $$eval($${1}.libs) + export($${1}.libs) } libdir = $$eval(config.input.$${input}.libdir) @@ -759,6 +764,8 @@ defineTest(qtConfLibrary_pkgConfig) { return(false) contains($${1}.libs, ".*\\.$${QMAKE_EXTENSION_STATICLIB}$") { qtRunLoggedCommand("$$pkg_config --static --libs $$args", libs)|return(false) + # Split by space + eval(libs = $$libs) !qtConfResolveLibs($${1}.libs, $$libs): \ return(false) } diff --git a/mkspecs/features/qt_docs.prf b/mkspecs/features/qt_docs.prf index deb4ac2829..095bf15dac 100644 --- a/mkspecs/features/qt_docs.prf +++ b/mkspecs/features/qt_docs.prf @@ -45,6 +45,8 @@ isEmpty(WIN_INCLUDETEMP) { QDOC_INCLUDE_PATHS=@$$shell_quote($$WIN_INCLUDETEMP) } +macos: QDOC_INCLUDE_PATHS += $$join(QMAKE_DEFAULT_INCDIRS," -I","-I") + !build_online_docs: qtPrepareTool(QHELPGENERATOR, qhelpgenerator) qtPrepareTool(QTATTRIBUTIONSSCANNER, qtattributionsscanner) @@ -93,7 +95,6 @@ qtattributionsscanner.CONFIG += phony QMAKE_EXTRA_TARGETS += qtattributionsscanner doc_command = $$QDOC $$QMAKE_DOCS - prepare_docs { prepare_docs.commands += $$doc_command -prepare $$PREP_DOC_INDEXES -no-link-errors $$QDOC_INCLUDE_PATHS generate_docs.commands += $$doc_command -generate $$DOC_INDEXES $$QDOC_INCLUDE_PATHS diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index 661b7dd961..45d4492788 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -5,7 +5,7 @@ defineReplace(qtPlatformTargetSuffix) { else: CONFIG(debug, debug|release) { !debug_and_release|build_pass { mac: return($${suffix}_debug) - win32:!gcc: return($${suffix}d) + win32: return($${suffix}d) } } return($$suffix) diff --git a/mkspecs/features/qt_targets.prf b/mkspecs/features/qt_targets.prf index b3c289a90b..3810d1e0ad 100644 --- a/mkspecs/features/qt_targets.prf +++ b/mkspecs/features/qt_targets.prf @@ -1,4 +1,4 @@ QMAKE_TARGET_COMPANY = The Qt Company Ltd. isEmpty(QMAKE_TARGET_PRODUCT): QMAKE_TARGET_PRODUCT = Qt5 isEmpty(QMAKE_TARGET_DESCRIPTION): QMAKE_TARGET_DESCRIPTION = C++ Application Development Framework -QMAKE_TARGET_COPYRIGHT = Copyright (C) 2019 The Qt Company Ltd. +QMAKE_TARGET_COPYRIGHT = Copyright (C) 2020 The Qt Company Ltd. diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf index fa8ff1fb58..cee0981db0 100644 --- a/mkspecs/features/resources.prf +++ b/mkspecs/features/resources.prf @@ -6,73 +6,8 @@ isEmpty(QMAKE_MOD_RCC):QMAKE_MOD_RCC = qrc !contains(QMAKE_RESOURCE_FLAGS, -root):!isEmpty(QMAKE_RESOURCE_ROOT):QMAKE_RESOURCE_FLAGS += -root $$QMAKE_RESOURCE_ROOT !contains(QMAKE_RESOURCE_FLAGS, -name): QMAKE_RESOURCE_FLAGS += -name ${QMAKE_FILE_BASE} -# http://www.w3.org/TR/xml/#syntax -defineReplace(xml_escape) { - 1 ~= s,&,&, - 1 ~= s,\',', - 1 ~= s,\",", - 1 ~= s,<,<, - 1 ~= s,>,>, - return($$1) -} - -RESOURCES += qmake_immediate -for(resource, RESOURCES) { - # Regular case of user qrc file - contains(resource, ".*\\.qrc$"): \ - next() - - # Fallback for stand-alone files/directories - !defined($${resource}.files, var) { - !equals(resource, qmake_immediate) { - !exists($$absolute_path($$resource, $$_PRO_FILE_PWD_)): \ - warning("Failure to find: $$resource") - qmake_immediate.files += $$resource - OTHER_FILES *= $$resource - } - RESOURCES -= $$resource - next() - } - - resource_file = $$absolute_path($$RCC_DIR/qmake_$${resource}.qrc, $$OUT_PWD) - - isEmpty(BUILDS)|build_pass { - # Collection of files, generate qrc file - prefix = $$eval($${resource}.prefix) - isEmpty(prefix): \ - prefix = "/" - - resource_file_content = \ - "<!DOCTYPE RCC><RCC version=\"1.0\">" \ - "<qresource prefix=\"$$xml_escape($$prefix)\">" - - abs_base = $$absolute_path($$eval($${resource}.base), $$_PRO_FILE_PWD_) - - for(file, $${resource}.files) { - abs_path = $$absolute_path($$file, $$_PRO_FILE_PWD_) - files = $$files($$abs_path/*, true) - isEmpty(files): \ - files = $$abs_path - for (file, files) { - exists($$file/*): next() # exclude directories - alias = $$relative_path($$file, $$abs_base) - resource_file_content += \ - "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$file)</file>" - OTHER_FILES *= $$file - } - } - - resource_file_content += \ - "</qresource>" \ - "</RCC>" - - !write_file($$resource_file, resource_file_content): \ - error() - } - - RESOURCES -= $$resource - RESOURCES += $$resource_file -} +load(resources_functions) +qtFlattenResources() !isEmpty(RESOURCES):contains(TEMPLATE, .*lib):plugin:static { pluginBaseName = $$basename(TARGET) diff --git a/mkspecs/features/resources_functions.prf b/mkspecs/features/resources_functions.prf new file mode 100644 index 0000000000..b7a15fd1d9 --- /dev/null +++ b/mkspecs/features/resources_functions.prf @@ -0,0 +1,80 @@ +# http://www.w3.org/TR/xml/#syntax +defineReplace(xml_escape) { + 1 ~= s,&,&, + 1 ~= s,\',', + 1 ~= s,\",", + 1 ~= s,<,<, + 1 ~= s,>,>, + return($$1) +} + +defineTest(qtFlattenResources) { + immediate = qmake_immediate$$QMAKE_RESOURCES_IMMEDIATE_NR + defined(QMAKE_RESOURCES_IMMEDIATE_NR, var): \ + QMAKE_RESOURCES_IMMEDIATE_NR = $$num_add($$QMAKE_RESOURCES_IMMEDIATE_NR, 1) + else: \ + QMAKE_RESOURCES_IMMEDIATE_NR = 1 + + RESOURCES += $$immediate + for(resource, RESOURCES) { + # Regular case of user qrc file + contains(resource, ".*\\.qrc$"): \ + next() + + # Fallback for stand-alone files/directories + !defined($${resource}.files, var) { + !equals(resource, $$immediate) { + !exists($$absolute_path($$resource, $$_PRO_FILE_PWD_)): \ + warning("Failure to find: $$resource") + $${immediate}.files += $$resource + OTHER_FILES *= $$resource + } + RESOURCES -= $$resource + next() + } + + resource_file = $$absolute_path($$RCC_DIR/qmake_$${resource}.qrc, $$OUT_PWD) + + isEmpty(BUILDS)|build_pass { + # Collection of files, generate qrc file + prefix = $$eval($${resource}.prefix) + isEmpty(prefix): \ + prefix = "/" + + resource_file_content = \ + "<!DOCTYPE RCC><RCC version=\"1.0\">" \ + "<qresource prefix=\"$$xml_escape($$prefix)\">" + + abs_base = $$absolute_path($$eval($${resource}.base), $$_PRO_FILE_PWD_) + + for(file, $${resource}.files) { + abs_path = $$absolute_path($$file, $$_PRO_FILE_PWD_) + files = $$files($$abs_path/*, true) + isEmpty(files): \ + files = $$abs_path + for (file, files) { + exists($$file/*): next() # exclude directories + alias = $$relative_path($$file, $$abs_base) + resource_file_content += \ + "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$file)</file>" + OTHER_FILES *= $$file + } + } + + resource_file_content += \ + "</qresource>" \ + "</RCC>" + + !write_file($$resource_file, resource_file_content): \ + error() + } + + RESOURCES -= $$resource + RESOURCES += $$resource_file + } + export(QMAKE_RESOURCES_IMMEDIATE_NR) + export(RESOURCES) + export(OTHER_FILES) + export($${immediate}.files) + return(true) +} diff --git a/mkspecs/features/sanitizer.prf b/mkspecs/features/sanitizer.prf index c7d72aec80..12ca1a17bd 100644 --- a/mkspecs/features/sanitizer.prf +++ b/mkspecs/features/sanitizer.prf @@ -42,6 +42,12 @@ sanitize_thread { QMAKE_LFLAGS += $$QMAKE_SANITIZE_THREAD_LFLAGS } +sanitize_fuzzer_no_link { + QMAKE_CFLAGS += $$QMAKE_SANITIZE_FUZZERNL_CFLAGS + QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_FUZZERNL_CXXFLAGS + QMAKE_LFLAGS += $$QMAKE_SANITIZE_FUZZERNL_LFLAGS +} + sanitize_undefined { QMAKE_CFLAGS += $$QMAKE_SANITIZE_UNDEFINED_CFLAGS QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_UNDEFINED_CXXFLAGS diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf index d4f08835f1..7e9903d663 100644 --- a/mkspecs/features/testcase.prf +++ b/mkspecs/features/testcase.prf @@ -9,6 +9,9 @@ testcase_exceptions: CONFIG += exceptions # Set in qt_build_config.prf testcase_no_bundle: CONFIG -= app_bundle +# cmdline may have been specified and not processed yet +cmdline: CONFIG -= app_bundle + # Allow testcases to mark themselves as not supporting high-DPI testcase_lowdpi { macos { diff --git a/mkspecs/features/wasm/default_pre.prf b/mkspecs/features/wasm/default_pre.prf new file mode 100644 index 0000000000..2760889929 --- /dev/null +++ b/mkspecs/features/wasm/default_pre.prf @@ -0,0 +1,2 @@ +load(default_pre) +load(emcc_ver) diff --git a/mkspecs/features/wasm/emcc_ver.prf b/mkspecs/features/wasm/emcc_ver.prf new file mode 100644 index 0000000000..505a321d64 --- /dev/null +++ b/mkspecs/features/wasm/emcc_ver.prf @@ -0,0 +1,23 @@ +defineReplace(qtEmccRecommendedVersion) { + return (1.38.27) +} + +defineReplace(qtSystemEmccVersion) { + E_VERSION = $$system("emcc -v 2>&1 | perl -alne $$shell_quote($_ = $F[9]; s/://; print;) ") + return ($${E_VERSION}) +} + +defineTest(qtConfTest_emccVersion) { + + REQ_VERSION = $$qtEmccRecommendedVersion() + EMCC_VERSION = $$qtSystemEmccVersion() + + !defined(QT_EMCC_VERSION, var):!equals(EMCC_VERSION, $${REQ_VERSION}) { + warning ("You should use the recommended Emscripten version $$REQ_VERSION with this Qt. You have $${EMCC_VERSION} ") + } + contains(TEMPLATE, .*app) { + !equals(QT_EMCC_VERSION, $$EMCC_VERSION) { + warning("This Qt was built with Emscripten version $${QT_EMCC_VERSION}. You have $${EMCC_VERSION}. The difference may cause issues.") + } + } +} diff --git a/mkspecs/features/wasm/wasm.prf b/mkspecs/features/wasm/wasm.prf index 25413d7470..2e886fc4a5 100644 --- a/mkspecs/features/wasm/wasm.prf +++ b/mkspecs/features/wasm/wasm.prf @@ -1,8 +1,11 @@ + # 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) { +## this may be subject to change + qtConfig(thread) { EMCC_THREAD_LFLAGS += -s USE_PTHREADS=1 @@ -71,7 +74,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 = $$QMAKE_STREAM_EDITOR -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 @@ -109,6 +112,8 @@ contains(TEMPLATE, .*app) { } } +qtConfTest_emccVersion() + # 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/ diff --git a/mkspecs/features/win32/dumpcpp.prf b/mkspecs/features/win32/dumpcpp.prf index d19da3d077..589d700e4e 100644 --- a/mkspecs/features/win32/dumpcpp.prf +++ b/mkspecs/features/win32/dumpcpp.prf @@ -26,9 +26,9 @@ QMAKE_EXTRA_COMPILERS += dumpcpp_impl !build_pass:have_target:!contains(TEMPLATE, vc.*) { for(tlb, TYPELIBS) { tlbCopy = $$replace(tlb, \", ) - hdr = $$basename(tlb) + hdr = $$basename(tlbCopy) hdr = $$section(hdr, ., 0, -2) - tmp_command = $$QMAKE_DUMPCPP $$system_quote($$absolute_path($$tlb, $$_PRO_FILE_PWD_)) \ + tmp_command = $$QMAKE_DUMPCPP $$system_quote($$absolute_path($$tlbCopy, $$_PRO_FILE_PWD_)) \ -o $$system_quote($$OUT_PWD/$$hdr) qaxcontainer_compat: tmp_command += -compat !exists($$OUT_PWD/$${hdr}.h): system($$tmp_command) diff --git a/mkspecs/macx-ios-clang/qmake.conf b/mkspecs/macx-ios-clang/qmake.conf index 88e96ef32e..b164d44d9f 100644 --- a/mkspecs/macx-ios-clang/qmake.conf +++ b/mkspecs/macx-ios-clang/qmake.conf @@ -2,7 +2,7 @@ # qmake configuration for macx-ios-clang # -QMAKE_IOS_DEPLOYMENT_TARGET = 11.0 +QMAKE_IOS_DEPLOYMENT_TARGET = 12.0 # Universal target (iPhone and iPad) QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 1,2 diff --git a/mkspecs/macx-tvos-clang/qmake.conf b/mkspecs/macx-tvos-clang/qmake.conf index 77f6a02f7b..ad53627c4a 100644 --- a/mkspecs/macx-tvos-clang/qmake.conf +++ b/mkspecs/macx-tvos-clang/qmake.conf @@ -2,7 +2,7 @@ # qmake configuration for macx-tvos-clang # -QMAKE_TVOS_DEPLOYMENT_TARGET = 11.0 +QMAKE_TVOS_DEPLOYMENT_TARGET = 12.0 QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 3 diff --git a/mkspecs/macx-watchos-clang/qmake.conf b/mkspecs/macx-watchos-clang/qmake.conf index 8194261275..6a1fb253c1 100644 --- a/mkspecs/macx-watchos-clang/qmake.conf +++ b/mkspecs/macx-watchos-clang/qmake.conf @@ -2,7 +2,7 @@ # qmake configuration for macx-watchos-clang # -QMAKE_WATCHOS_DEPLOYMENT_TARGET = 4.0 +QMAKE_WATCHOS_DEPLOYMENT_TARGET = 5.0 QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 4 diff --git a/mkspecs/macx-xcode/default.xcscheme b/mkspecs/macx-xcode/default.xcscheme index 170174ed2b..355765e964 100644 --- a/mkspecs/macx-xcode/default.xcscheme +++ b/mkspecs/macx-xcode/default.xcscheme @@ -64,6 +64,8 @@ buildConfiguration = "Debug" ignoresPersistentStateOnLaunch = "NO" disableMainThreadChecker = "YES" + enableGPUFrameCaptureMode = "3" + enableGPUValidationMode = "1" debugDocumentVersioning = "NO" allowLocationSimulation = "YES"> <BuildableProductRunnable> diff --git a/mkspecs/wasm-emscripten/qmake.conf b/mkspecs/wasm-emscripten/qmake.conf index 992803e055..d520ce361a 100644 --- a/mkspecs/wasm-emscripten/qmake.conf +++ b/mkspecs/wasm-emscripten/qmake.conf @@ -6,6 +6,7 @@ include(../common/gcc-base.conf) include(../common/clang.conf) load(device_config) +load(emcc_ver) # Support setting WASM_OBJECT_FILES with -device-option WASM_OBJECT_FILES=1 !isEmpty(WASM_OBJECT_FILES): { @@ -15,7 +16,10 @@ load(device_config) QMAKE_CXXFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES QMAKE_LFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES } else { - EMCC_COMMON_LFLAGS += -s \"BINARYEN_TRAP_MODE=\'clamp\'\" + EMSCRIPTEN_VERSION=$$qtSystemEmccVersion() + lessThan(EMSCRIPTEN_VERSION, 1.39) { + EMCC_COMMON_LFLAGS += -s \"BINARYEN_TRAP_MODE=\'clamp\'\" + } } EMTERP_FLAGS = \ @@ -25,9 +29,10 @@ EMTERP_FLAGS = \ -s ASSERTIONS=1 \ --profiling-funcs -EMCC_COMMON_LFLAGS = \ +EMCC_COMMON_LFLAGS += \ -s WASM=1 \ -s FULL_ES2=1 \ + -s FULL_ES3=1 \ -s USE_WEBGL2=1 \ -s NO_EXIT_RUNTIME=0 \ -s ERROR_ON_UNDEFINED_SYMBOLS=1 \ |