summaryrefslogtreecommitdiff
path: root/src/plugins/clangtools/clangtoolsutils.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2019-08-28 08:56:22 +0200
committerNikolai Kosjar <nikolai.kosjar@qt.io>2019-09-12 13:35:01 +0000
commitfc37ea4276c9728a6fa4e3dfab8ce8df98b81d7d (patch)
treed746044f21d96bb82a5552d4120349317a16020e /src/plugins/clangtools/clangtoolsutils.cpp
parent8890a7412c154d48fc160a366fdbe28021ca0138 (diff)
downloadqt-creator-fc37ea4276c9728a6fa4e3dfab8ce8df98b81d7d.tar.gz
ClangTools: Add UI for specifying executables
Add a new group box "Executables" for this. Hide the UI for clazy-standalone unless QTC_USE_CLAZY_STANDALONE_PATH is set as there is no released version with the needed -export-fixes option. Rename the previous group box from "General" to "Run Options". Change-Id: Ia9daf66c40d3a7eea98b31d9c086886d29466490 Reviewed-by: Cristian Adam <cristian.adam@qt.io> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins/clangtools/clangtoolsutils.cpp')
-rw-r--r--src/plugins/clangtools/clangtoolsutils.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/plugins/clangtools/clangtoolsutils.cpp b/src/plugins/clangtools/clangtoolsutils.cpp
index 173d97e31d..acb87f5ec1 100644
--- a/src/plugins/clangtools/clangtoolsutils.cpp
+++ b/src/plugins/clangtools/clangtoolsutils.cpp
@@ -26,6 +26,7 @@
#include "clangtoolsutils.h"
#include "clangtool.h"
+#include "clangtoolsconstants.h"
#include "clangtoolsdiagnostic.h"
#include "clangtoolssettings.h"
@@ -70,5 +71,88 @@ void showHintAboutBuildBeforeAnalysis()
"ClangToolsDisablingBuildBeforeAnalysisHint");
}
+bool isFileExecutable(const QString &filePath)
+{
+ if (filePath.isEmpty())
+ return false;
+
+ const QFileInfo fileInfo(filePath);
+ return fileInfo.isFile() && fileInfo.isExecutable();
+}
+
+QString shippedClangTidyExecutable()
+{
+ const QString shippedExecutable = Core::ICore::clangTidyExecutable(CLANG_BINDIR);
+ if (isFileExecutable(shippedExecutable))
+ return shippedExecutable;
+ return {};
+}
+
+QString shippedClazyStandaloneExecutable()
+{
+ const QString shippedExecutable = Core::ICore::clazyStandaloneExecutable(CLANG_BINDIR);
+ if (isFileExecutable(shippedExecutable))
+ return shippedExecutable;
+ return {};
+}
+
+static QString fullPath(const QString &executable)
+{
+ const QString hostExeSuffix = QLatin1String(QTC_HOST_EXE_SUFFIX);
+ const Qt::CaseSensitivity caseSensitivity = Utils::HostOsInfo::fileNameCaseSensitivity();
+
+ QString candidate = executable;
+ const bool hasSuffix = candidate.endsWith(hostExeSuffix, caseSensitivity);
+
+ const QFileInfo fileInfo = QFileInfo(candidate);
+ if (fileInfo.isAbsolute()) {
+ if (!hasSuffix)
+ candidate.append(hostExeSuffix);
+ } else {
+ const Utils::Environment environment = Utils::Environment::systemEnvironment();
+ const QString expandedPath = environment.searchInPath(candidate).toString();
+ if (!expandedPath.isEmpty())
+ candidate = expandedPath;
+ }
+
+ return candidate;
+}
+
+static QString findValidExecutable(const QStringList &candidates)
+{
+ for (QString candidate : candidates) {
+ const QString expandedPath = fullPath(candidate);
+ if (isFileExecutable(expandedPath))
+ return expandedPath;
+ }
+
+ return {};
+}
+
+QString clangTidyExecutable()
+{
+ const QString fromSettings = ClangToolsSettings::instance()->clangTidyExecutable();
+ if (!fromSettings.isEmpty())
+ return fullPath(fromSettings);
+
+ return findValidExecutable({
+ shippedClangTidyExecutable(),
+ Constants::CLANG_TIDY_EXECUTABLE_NAME,
+ });
+}
+
+QString clazyStandaloneExecutable()
+{
+ const QString fromSettings = ClangToolsSettings::instance()->clazyStandaloneExecutable();
+ if (!fromSettings.isEmpty())
+ return fullPath(fromSettings);
+
+ return findValidExecutable({
+ shippedClazyStandaloneExecutable(),
+ qEnvironmentVariable("QTC_USE_CLAZY_STANDALONE_PATH"),
+ Constants::CLAZY_STANDALONE_EXECUTABLE_NAME,
+ });
+}
+
} // namespace Internal
} // namespace ClangTools