aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2023-01-31 16:14:36 +0100
committerCristian Adam <cristian.adam@qt.io>2023-02-02 15:56:46 +0000
commit51cbfd77db86f3d35ed80d5fdb75bc8fdb11a773 (patch)
tree975649ba0ab3a77f8da47510904c446b584a057e
parent1d6d01952b0d59b153f8bf82d7f6f358c52d551a (diff)
CMakePM: Improve CMake presets kit config hashing
Amends a3153c535d7e9e64fab530d86e64ab76ef4988e0 QT_QMAKE_EXECUTABLE was not taken into consideration and this would result in not matching kits. Also Visual Studio generator will not have a CMAKE_C|XX_COMPILER values in the cache. On Windows there could be paths with "C:" vs "c:" and the hashes again wouldn't match. Change-Id: I5da5fafbd29f3d1fd8c9615c41b7659e63c30ff1 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakekitinformation.cpp14
-rw-r--r--src/plugins/cmakeprojectmanager/cmakekitinformation.h3
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp37
-rw-r--r--tests/manual/cmakepresets/CMakePresets.json10
4 files changed, 53 insertions, 11 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
index 6e7638e2d0..5fbf06505d 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
@@ -1145,7 +1145,10 @@ void CMakeConfigurationKitAspect::setKitDefaultConfigHash(ProjectExplorer::Kit *
expanded.value = item.expandedValue(k).toUtf8();
return expanded;
});
- const QByteArray kitHash = computeDefaultConfigHash(defaultConfigExpanded);
+ const CMakeTool *const tool = CMakeKitAspect::cmakeTool(k);
+ const QByteArray kitHash = computeDefaultConfigHash(defaultConfigExpanded,
+ tool ? tool->cmakeExecutable()
+ : FilePath());
CMakeConfig config = configuration(k);
config.append(CMakeConfigItem(QTC_KIT_DEFAULT_CONFIG_HASH, CMakeConfigItem::INTERNAL, kitHash));
@@ -1161,7 +1164,8 @@ CMakeConfigItem CMakeConfigurationKitAspect::kitDefaultConfigHashItem(const Proj
});
}
-QByteArray CMakeConfigurationKitAspect::computeDefaultConfigHash(const CMakeConfig &config)
+QByteArray CMakeConfigurationKitAspect::computeDefaultConfigHash(const CMakeConfig &config,
+ const FilePath &cmakeBinary)
{
const CMakeConfig defaultConfig = defaultConfiguration(nullptr);
const QByteArray configValues = std::accumulate(defaultConfig.begin(),
@@ -1171,7 +1175,11 @@ QByteArray CMakeConfigurationKitAspect::computeDefaultConfigHash(const CMakeConf
const CMakeConfigItem &item) {
return sum += config.valueOf(item.key);
});
- return QCryptographicHash::hash(configValues, QCryptographicHash::Md5).toHex();
+ return QCryptographicHash::hash(cmakeBinary.caseSensitivity() == Qt::CaseInsensitive
+ ? configValues.toLower()
+ : configValues,
+ QCryptographicHash::Md5)
+ .toHex();
}
QVariant CMakeConfigurationKitAspect::defaultValue(const Kit *k) const
diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.h b/src/plugins/cmakeprojectmanager/cmakekitinformation.h
index 25b7b7f3f7..66e54280b8 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitinformation.h
+++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.h
@@ -93,7 +93,8 @@ public:
static void setKitDefaultConfigHash(ProjectExplorer::Kit *k);
static CMakeConfigItem kitDefaultConfigHashItem(const ProjectExplorer::Kit *k);
- static QByteArray computeDefaultConfigHash(const CMakeConfig &config);
+ static QByteArray computeDefaultConfigHash(const CMakeConfig &config,
+ const Utils::FilePath &cmakeBinary);
// KitAspect interface
ProjectExplorer::Tasks validate(const ProjectExplorer::Kit *k) const final;
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
index b2e0e6f12d..840e0108ce 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
@@ -464,6 +464,35 @@ void updateCompilerPaths(CMakeConfig &config, const Environment &env)
updateRelativePath("CMAKE_CXX_COMPILER");
}
+void updateConfigWithDirectoryData(CMakeConfig &config, const std::unique_ptr<DirectoryData> &data)
+{
+ auto updateCompilerValue = [&config, &data](const QByteArray &key, const Utils::Id &language) {
+ auto it = std::find_if(config.begin(), config.end(), [&key](const CMakeConfigItem &ci) {
+ return ci.key == key;
+ });
+
+ auto tcd = Utils::findOrDefault(data->toolChains,
+ [&language](const ToolChainDescription &t) {
+ return t.language == language;
+ });
+
+ if (it != config.end() && it->value.isEmpty())
+ it->value = tcd.compilerPath.toString().toUtf8();
+ else
+ config << CMakeConfigItem(key,
+ CMakeConfigItem::FILEPATH,
+ tcd.compilerPath.toString().toUtf8());
+ };
+
+ updateCompilerValue("CMAKE_C_COMPILER", ProjectExplorer::Constants::C_LANGUAGE_ID);
+ updateCompilerValue("CMAKE_CXX_COMPILER", ProjectExplorer::Constants::CXX_LANGUAGE_ID);
+
+ if (data->qt.qt)
+ config << CMakeConfigItem("QT_QMAKE_EXECUTABLE",
+ CMakeConfigItem::FILEPATH,
+ data->qt.qt->qmakeFilePath().toString().toUtf8());
+}
+
QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
QString *warningMessage) const
{
@@ -550,8 +579,6 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
CMakeConfigItem::STRING,
configurePreset.generator.value().toUtf8());
}
- data->cmakePresetDefaultConfigHash = CMakeConfigurationKitAspect::computeDefaultConfigHash(
- config);
const FilePath qmake = qmakeFromCMakeCache(config);
if (!qmake.isEmpty())
@@ -560,6 +587,12 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
// ToolChains:
data->toolChains = extractToolChainsFromCache(config);
+ // Update QT_QMAKE_EXECUTABLE and CMAKE_C|XX_COMPILER config values
+ updateConfigWithDirectoryData(config, data);
+
+ data->cmakePresetDefaultConfigHash
+ = CMakeConfigurationKitAspect::computeDefaultConfigHash(config, data->cmakeBinary);
+
QByteArrayList buildConfigurationTypes = {cache.valueOf("CMAKE_BUILD_TYPE")};
if (buildConfigurationTypes.front().isEmpty()) {
buildConfigurationTypes.clear();
diff --git a/tests/manual/cmakepresets/CMakePresets.json b/tests/manual/cmakepresets/CMakePresets.json
index 90e2df5836..da98c991ba 100644
--- a/tests/manual/cmakepresets/CMakePresets.json
+++ b/tests/manual/cmakepresets/CMakePresets.json
@@ -12,7 +12,7 @@
"generator": "Ninja",
"installDir": "../inst-${presetName}",
"cacheVariables": {
- "CMAKE_PREFIX_PATH": "$env{SYSTEMDRIVE}/Qt/6.3.2/mingw_64"
+ "CMAKE_PREFIX_PATH": "$env{SYSTEMDRIVE}/Qt/6.4.2/mingw_64"
},
"condition": {
"type": "equals",
@@ -34,7 +34,7 @@
"inherits" : "mingw",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
- "CMAKE_PREFIX_PATH": "$env{SystemDrive}/Qt/6.3.2/mingw_64"
+ "CMAKE_PREFIX_PATH": "$env{SystemDrive}/Qt/6.4.2/mingw_64"
}
},
{
@@ -56,7 +56,7 @@
},
"environment" : {
"HOST_SYSTEM_NAME": "Windows",
- "QT_VERSION": "6.3.2"
+ "QT_VERSION": "6.4.2"
}
},
{
@@ -64,7 +64,7 @@
"displayName": "Visual C++ 2019 x64 Ninja",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build-${presetName}",
- "toolchainFile" : "c:/Qt/6.3.2/msvc2019_64/lib/cmake/Qt6/qt.toolchain.cmake",
+ "toolchainFile" : "c:/Qt/6.4.2/msvc2019_64/lib/cmake/Qt6/qt.toolchain.cmake",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
},
@@ -92,7 +92,7 @@
"displayName": "Linux GCC",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build-${presetName}",
- "toolchainFile" : "$env{HOME}/Qt/6.3.2/gcc_64/lib/cmake/Qt6/qt.toolchain.cmake",
+ "toolchainFile" : "$env{HOME}/Qt/6.4.2/gcc_64/lib/cmake/Qt6/qt.toolchain.cmake",
"condition" : {
"type": "equals",
"lhs": "${hostSystemName}",