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>
This commit is contained in:
Cristian Adam
2021-08-19 18:51:18 +02:00
parent 19fded6a6a
commit c1c70d339d
3 changed files with 21 additions and 4 deletions

View File

@@ -191,12 +191,14 @@ static bool isChildOf(const FilePath &path, const QStringList &prefixes)
QList<CMakeBuildTarget> generateBuildTargets(const PreprocessedData &input, QList<CMakeBuildTarget> generateBuildTargets(const PreprocessedData &input,
const FilePath &sourceDirectory, const FilePath &sourceDirectory,
const FilePath &buildDirectory) const FilePath &buildDirectory,
bool haveLibrariesRelativeToBuildDirectory)
{ {
QDir sourceDir(sourceDirectory.toString()); QDir sourceDir(sourceDirectory.toString());
const QList<CMakeBuildTarget> result = transform<QList>(input.targetDetails, 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); const FilePath currentBuildDir = buildDirectory.absoluteFilePath(t.buildDir);
CMakeBuildTarget ct; CMakeBuildTarget ct;
@@ -271,7 +273,8 @@ QList<CMakeBuildTarget> generateBuildTargets(const PreprocessedData &input,
if (part.startsWith("-")) if (part.startsWith("-"))
continue; 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") if (f.role == "libraries")
tmp = tmp.parentDir(); tmp = tmp.parentDir();
@@ -707,7 +710,12 @@ FileApiQtcData extractData(FileApiData &input,
return {}; 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.cmakeFiles = std::move(data.cmakeFiles);
result.projectParts = generateRawProjectParts(data, sourceDirectory); result.projectParts = generateRawProjectParts(data, sourceDirectory);

View File

@@ -147,6 +147,13 @@ static ReplyFileContents readReplyFile(const FilePath &filePath, QString &errorM
result.generator = generator.value("name").toString(); result.generator = generator.value("name").toString();
result.isMultiConfig = generator.value("multiConfig").toBool(); 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);
}
} }
} }

View File

@@ -39,6 +39,7 @@
#include <QFutureInterface> #include <QFutureInterface>
#include <QString> #include <QString>
#include <QVector> #include <QVector>
#include <QVersionNumber>
#include <vector> #include <vector>
@@ -65,6 +66,7 @@ public:
QString cmakeRoot; QString cmakeRoot;
QVector<ReplyObject> replies; QVector<ReplyObject> replies;
QVersionNumber cmakeVersion;
Utils::FilePath jsonFile(const QString &kind, const Utils::FilePath &replyDir) const; Utils::FilePath jsonFile(const QString &kind, const Utils::FilePath &replyDir) const;
}; };