diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2020-08-27 14:11:00 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2020-09-11 11:30:56 +0200 |
commit | 96bdcdacbc09b1f3091a39b83fe394af1ccb41ea (patch) | |
tree | ccca51911ad88c3cb05a9205e30201e53c57733d /util | |
parent | 756c65d3676d2b3ce5c7b56145e5f0f7cf7178ad (diff) |
CMake: Implement configure -ltcg
This configure switch sets the CMake variable
CMAKE_INTERPROCEDURAL_OPTIMIZATION_<CONFIG> per release config to ON.
The feature 'ltcg' is enabled if any of the variables
CMAKE_INTERPROCEDURAL_OPTIMIZATION,
CMAKE_INTERPROCEDURAL_OPTIMIZATION_<CONFIG> are ON.
In order to implement the check, configurejson2cmake had to be extended
to be able to write extra CMake code before and after the feature
definition. This extra code can be added to a feature mapping below the
keys "cmakePrelude" and "cmakeEpilogue".
Task-number: QTBUG-85373
Change-Id: Ia2eb907edcf087f137977a9b090705397f83eb05
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Diffstat (limited to 'util')
-rwxr-xr-x | util/cmake/configurejson2cmake.py | 32 |
1 files changed, 30 insertions, 2 deletions
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: |