aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2021-08-19 18:51:18 +0200
committerCristian Adam <cristian.adam@qt.io>2021-08-20 13:58:15 +0000
commitc1c70d339d66784896a0bb5310b91337563dd280 (patch)
tree92e922bfadee94c5f320316db8e923237603172f
parent19fded6a6a381e71ae596e538b5d4941b8153501 (diff)
CMakePM: Fix build library search path with CMake 3.20+
CMake 3.20 has changed the relative path to dependent libraries from current binary directory to main binary directory. See https://gitlab.kitware.com/cmake/cmake/-/issues/22556 Fixes: QTCREATORBUG-26110 Change-Id: I39c1d6b2998ebb079e7017e8d349881752d80354 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/fileapidataextractor.cpp16
-rw-r--r--src/plugins/cmakeprojectmanager/fileapiparser.cpp7
-rw-r--r--src/plugins/cmakeprojectmanager/fileapiparser.h2
3 files changed, 21 insertions, 4 deletions
diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
index 7b38aa0f41..951847397c 100644
--- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
@@ -191,12 +191,14 @@ static bool isChildOf(const FilePath &path, const QStringList &prefixes)
QList<CMakeBuildTarget> generateBuildTargets(const PreprocessedData &input,
const FilePath &sourceDirectory,
- const FilePath &buildDirectory)
+ const FilePath &buildDirectory,
+ bool haveLibrariesRelativeToBuildDirectory)
{
QDir sourceDir(sourceDirectory.toString());
const QList<CMakeBuildTarget> result = transform<QList>(input.targetDetails,
- [&sourceDir, &sourceDirectory, &buildDirectory](const TargetDetails &t) {
+ [&sourceDir, &sourceDirectory, &buildDirectory,
+ &haveLibrariesRelativeToBuildDirectory](const TargetDetails &t) {
const FilePath currentBuildDir = buildDirectory.absoluteFilePath(t.buildDir);
CMakeBuildTarget ct;
@@ -271,7 +273,8 @@ QList<CMakeBuildTarget> generateBuildTargets(const PreprocessedData &input,
if (part.startsWith("-"))
continue;
- FilePath tmp = currentBuildDir.absoluteFilePath(FilePath::fromUserInput(part));
+ const FilePath buildDir = haveLibrariesRelativeToBuildDirectory ? buildDirectory : currentBuildDir;
+ FilePath tmp = buildDir.absoluteFilePath(FilePath::fromUserInput(part));
if (f.role == "libraries")
tmp = tmp.parentDir();
@@ -707,7 +710,12 @@ FileApiQtcData extractData(FileApiData &input,
return {};
}
- result.buildTargets = generateBuildTargets(data, sourceDirectory, buildDirectory);
+ // Ninja generator from CMake version 3.20.5 has libraries relative to build directory
+ const bool haveLibrariesRelativeToBuildDirectory =
+ input.replyFile.generator.startsWith("Ninja")
+ && input.replyFile.cmakeVersion >= QVersionNumber(3, 20, 5);
+
+ result.buildTargets = generateBuildTargets(data, sourceDirectory, buildDirectory, haveLibrariesRelativeToBuildDirectory);
result.cmakeFiles = std::move(data.cmakeFiles);
result.projectParts = generateRawProjectParts(data, sourceDirectory);
diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp
index cf6bff8233..c2942b02dd 100644
--- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp
@@ -147,6 +147,13 @@ static ReplyFileContents readReplyFile(const FilePath &filePath, QString &errorM
result.generator = generator.value("name").toString();
result.isMultiConfig = generator.value("multiConfig").toBool();
}
+ const QJsonObject version = cmakeObject.value("version").toObject();
+ {
+ int major = version.value("major").toInt();
+ int minor = version.value("minor").toInt();
+ int patch = version.value("patch").toInt();
+ result.cmakeVersion = QVersionNumber(major, minor, patch);
+ }
}
}
diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.h b/src/plugins/cmakeprojectmanager/fileapiparser.h
index e4400a7abc..dc018a7c62 100644
--- a/src/plugins/cmakeprojectmanager/fileapiparser.h
+++ b/src/plugins/cmakeprojectmanager/fileapiparser.h
@@ -39,6 +39,7 @@
#include <QFutureInterface>
#include <QString>
#include <QVector>
+#include <QVersionNumber>
#include <vector>
@@ -65,6 +66,7 @@ public:
QString cmakeRoot;
QVector<ReplyObject> replies;
+ QVersionNumber cmakeVersion;
Utils::FilePath jsonFile(const QString &kind, const Utils::FilePath &replyDir) const;
};