diff options
author | Cristian Adam <cristian.adam@qt.io> | 2021-08-19 18:51:18 +0200 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2021-08-20 13:58:15 +0000 |
commit | c1c70d339d66784896a0bb5310b91337563dd280 (patch) | |
tree | 92e922bfadee94c5f320316db8e923237603172f | |
parent | 19fded6a6a381e71ae596e538b5d4941b8153501 (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.cpp | 16 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/fileapiparser.cpp | 7 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/fileapiparser.h | 2 |
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; }; |