diff options
-rw-r--r-- | cmake/QtProcessConfigureArgs.cmake | 10 | ||||
-rw-r--r-- | cmake/configure-cmake-mapping.md | 3 | ||||
-rw-r--r-- | configure.cmake | 16 | ||||
-rwxr-xr-x | util/cmake/configurejson2cmake.py | 32 |
4 files changed, 56 insertions, 5 deletions
diff --git a/cmake/QtProcessConfigureArgs.cmake b/cmake/QtProcessConfigureArgs.cmake index b4fc1792c5..8a620ba31c 100644 --- a/cmake/QtProcessConfigureArgs.cmake +++ b/cmake/QtProcessConfigureArgs.cmake @@ -603,6 +603,16 @@ elseif(nr_of_build_configs GREATER 1) list(APPEND cmake_args "-DCMAKE_CONFIGURATION_TYPES=${escaped_build_configs}") endif() +drop_input(ltcg) +if("${INPUT_ltcg}" STREQUAL "yes") + foreach(config ${build_configs}) + string(TOUPPER "${config}" ucconfig) + if(NOT ucconfig STREQUAL "DEBUG") + push("-DCMAKE_INTERPROCEDURAL_OPTIMIZATION_${ucconfig}=ON") + endif() + endforeach() +endif() + translate_list_input(device-option QT_QMAKE_DEVICE_OPTIONS) translate_list_input(defines QT_EXTRA_DEFINES) translate_list_input(fpaths QT_EXTRA_FRAMEWORKPATHS) diff --git a/cmake/configure-cmake-mapping.md b/cmake/configure-cmake-mapping.md index 6e4b2c4549..780bbebef4 100644 --- a/cmake/configure-cmake-mapping.md +++ b/cmake/configure-cmake-mapping.md @@ -66,7 +66,8 @@ The effort of this is tracked in QTBUG-85373 and QTBUG-85349. | -plugin-manifests | | | | -static-runtime | -DFEATURE_static_runtime=ON | | | -pch | -DBUILD_WITH_PCH=ON | | -| -ltcg | | | +| -ltcg | -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON or | | +| | -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_<CONFIG>=ON | | | -linker [bfd,gold,lld] | -DINPUT_linker=<name> or | | | | -DFEATURE_use_<name>_linker=ON | | | -incredibuild-xge | n/a | This option enables remote distribution of Visual Studio | diff --git a/configure.cmake b/configure.cmake index 754f0c324c..8e7ba06299 100644 --- a/configure.cmake +++ b/configure.cmake @@ -616,11 +616,23 @@ qt_feature("precompile_header" CONDITION BUILD_WITH_PCH ) qt_feature_config("precompile_header" QMAKE_PRIVATE_CONFIG) +set(__qt_ltcg_detected FALSE) +if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) + set(__qt_ltcg_detected TRUE) +else() + foreach(config ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES}) + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION_${config}) + set(__qt_ltcg_detected TRUE) + break() + endif() + endforeach() +endif() qt_feature("ltcg" LABEL "Using LTCG" - AUTODETECT 1 - CONDITION CMAKE_INTERPROCEDURAL_OPTIMIZATION + AUTODETECT ON + CONDITION __qt_ltcg_detected ) +unset(__qt_ltcg_detected) qt_feature_config("ltcg" QMAKE_PRIVATE_CONFIG) qt_feature("enable_gdb_index" LABEL "Generating GDB index" diff --git a/util/cmake/configurejson2cmake.py b/util/cmake/configurejson2cmake.py index cccfabb9e8..b0c4f61d55 100755 --- a/util/cmake/configurejson2cmake.py +++ b/util/cmake/configurejson2cmake.py @@ -914,7 +914,22 @@ def get_feature_mapping(): "condition": "NOT QT_FEATURE_icu AND QT_FEATURE_textcodec AND NOT WIN32 AND NOT QNX AND NOT ANDROID AND NOT APPLE AND WrapIconv_FOUND", }, "incredibuild_xge": None, - "ltcg": {"autoDetect": "1", "condition": "CMAKE_INTERPROCEDURAL_OPTIMIZATION"}, + "ltcg": { + "autoDetect": "ON", + "cmakePrelude": """set(__qt_ltcg_detected FALSE) +if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) + set(__qt_ltcg_detected TRUE) +else() + foreach(config ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES}) + if(CMAKE_INTERPROCEDURAL_OPTIMIZATION_${config}) + set(__qt_ltcg_detected TRUE) + break() + endif() + endforeach() +endif()""", + "condition": "__qt_ltcg_detected", + "cmakeEpilogue": "unset(__qt_ltcg_detected)" + }, "msvc_mp": None, "simulator_and_device": {"condition": "UIKIT AND NOT QT_UIKIT_SDK"}, "pkg-config": {"condition": "PKG_CONFIG_FOUND"}, @@ -1001,6 +1016,8 @@ def parseFeature(ctx, feature, data, cm_fh): enable = map_condition(mapping.get("enable", data.get("enable", ""))) disable = map_condition(mapping.get("disable", data.get("disable", ""))) emitIf = map_condition(mapping.get("emitIf", data.get("emitIf", ""))) + cmakePrelude = mapping.get("cmakePrelude", None) + cmakeEpilogue = mapping.get("cmakeEpilogue", None) for k in [k for k in data.keys() if k not in handled]: print(f" XXXX UNHANDLED KEY {k} in feature description") @@ -1070,10 +1087,16 @@ def parseFeature(ctx, feature, data, cm_fh): labelAppend="", superFeature=None, autoDetect="", + cmakePrelude=None, + cmakeEpilogue=None, ): if comment: cm_fh.write(f"# {comment}\n") + if cmakePrelude is not None: + cm_fh.write(cmakePrelude) + cm_fh.write("\n") + cm_fh.write(f'qt_feature("{name}"') if publicFeature: cm_fh.write(" PUBLIC") @@ -1096,11 +1119,16 @@ def parseFeature(ctx, feature, data, cm_fh): cm_fh.write(lineify("EMIT_IF", emitIf, quote=False)) cm_fh.write(")\n") + if cmakeEpilogue is not None: + cm_fh.write(cmakeEpilogue) + cm_fh.write("\n") + # Write qt_feature() calls before any qt_feature_definition() calls # Default internal feature case. featureCalls = {} - featureCalls[feature] = {"name": feature, "labelAppend": "", "autoDetect": autoDetect} + featureCalls[feature] = {"name": feature, "labelAppend": "", "autoDetect": autoDetect, + "cmakePrelude": cmakePrelude, "cmakeEpilogue": cmakeEpilogue} # Go over all outputs to compute the number of features that have to be declared for o in output: |