forked from qt-creator/qt-creator
Docker: validate clangd version
Do not automatically setup a clangd that is too old and mark them as invalid if they are manually selected. Change-Id: Ie9662a8821df8fc678eabc4b8a08375723b4d1c3 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
66
src/libs/utils/clangutils.cpp
Normal file
66
src/libs/utils/clangutils.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
// Copyright (C) 2023 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include "clangutils.h"
|
||||
|
||||
#include "filepath.h"
|
||||
#include "qtcprocess.h"
|
||||
#include "utilstr.h"
|
||||
|
||||
#include <QVersionNumber>
|
||||
|
||||
namespace Utils {
|
||||
|
||||
static QVersionNumber getClangdVersion(const FilePath &clangdFilePath)
|
||||
{
|
||||
QtcProcess clangdProc;
|
||||
clangdProc.setCommand({clangdFilePath, {"--version"}});
|
||||
clangdProc.runBlocking();
|
||||
if (clangdProc.result() != ProcessResult::FinishedWithSuccess)
|
||||
return {};
|
||||
const QString output = clangdProc.allOutput();
|
||||
static const QString versionPrefix = "clangd version ";
|
||||
const int prefixOffset = output.indexOf(versionPrefix);
|
||||
if (prefixOffset == -1)
|
||||
return {};
|
||||
return QVersionNumber::fromString(output.mid(prefixOffset + versionPrefix.length()));
|
||||
}
|
||||
|
||||
QVersionNumber clangdVersion(const FilePath &clangd)
|
||||
{
|
||||
static QHash<FilePath, QPair<QDateTime, QVersionNumber>> versionCache;
|
||||
const QDateTime timeStamp = clangd.lastModified();
|
||||
const auto it = versionCache.find(clangd);
|
||||
if (it == versionCache.end()) {
|
||||
const QVersionNumber version = getClangdVersion(clangd);
|
||||
versionCache.insert(clangd, {timeStamp, version});
|
||||
return version;
|
||||
}
|
||||
if (it->first != timeStamp) {
|
||||
it->first = timeStamp;
|
||||
it->second = getClangdVersion(clangd);
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
bool checkClangdVersion(const FilePath &clangd, QString *error)
|
||||
{
|
||||
const QVersionNumber version = clangdVersion(clangd);
|
||||
if (version >= minimumClangdVersion())
|
||||
return true;
|
||||
if (error) {
|
||||
*error = version.isNull()
|
||||
? Tr::tr("Failed to retrieve clangd version: Unexpected clangd output.")
|
||||
: Tr::tr("The clangd version is %1, but %2 or greater is required.")
|
||||
.arg(version.toString())
|
||||
.arg(minimumClangdVersion().majorVersion());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QVersionNumber minimumClangdVersion()
|
||||
{
|
||||
return QVersionNumber(14);
|
||||
}
|
||||
|
||||
} // namespace Utils
|
||||
Reference in New Issue
Block a user