1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "cmake_global.h"
#include <texteditor/codeassist/keywordscompletionassist.h>
#include <utils/filepath.h>
#include <utils/id.h>
#include <utils/store.h>
#include <optional>
namespace Utils { class Process; }
namespace CMakeProjectManager {
namespace Internal { class IntrospectionData; }
class CMAKE_EXPORT CMakeTool
{
public:
enum Detection { ManualDetection, AutoDetection };
enum ReaderType { FileApi };
struct Version
{
int major = 0;
int minor = 0;
int patch = 0;
QByteArray fullVersion;
};
class Generator
{
public:
Generator(const QString &n, const QStringList &eg, bool pl = true, bool ts = true) :
name(n), extraGenerators(eg), supportsPlatform(pl), supportsToolset(ts)
{ }
QString name;
QStringList extraGenerators;
bool supportsPlatform = true;
bool supportsToolset = true;
bool matches(const QString &n, const QString &ex = QString()) const;
};
using PathMapper = std::function<Utils::FilePath (const Utils::FilePath &)>;
explicit CMakeTool(Detection d, const Utils::Id &id);
explicit CMakeTool(const QVariantMap &map, bool fromSdk);
~CMakeTool();
static Utils::Id createId();
bool isValid() const;
Utils::Id id() const { return m_id; }
Utils::Store toMap () const;
void setAutorun(bool autoRun) { m_isAutoRun = autoRun; }
void setFilePath(const Utils::FilePath &executable);
Utils::FilePath filePath() const;
Utils::FilePath cmakeExecutable() const;
void setQchFilePath(const Utils::FilePath &path);
Utils::FilePath qchFilePath() const;
static Utils::FilePath cmakeExecutable(const Utils::FilePath &path);
bool isAutoRun() const;
bool autoCreateBuildDirectory() const;
QList<Generator> supportedGenerators() const;
TextEditor::Keywords keywords();
bool hasFileApi() const;
Version version() const;
QString versionDisplay() const;
bool isAutoDetected() const;
QString displayName() const;
void setDisplayName(const QString &displayName);
void setPathMapper(const PathMapper &includePathMapper);
PathMapper pathMapper() const;
std::optional<ReaderType> readerType() const;
static Utils::FilePath searchQchFile(const Utils::FilePath &executable);
QString detectionSource() const { return m_detectionSource; }
void setDetectionSource(const QString &source) { m_detectionSource = source; }
static QString documentationUrl(const Version &version, bool online);
static void openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl);
private:
void readInformation() const;
void runCMake(Utils::Process &proc, const QStringList &args, int timeoutS = 1) const;
void parseFunctionDetailsOutput(const QString &output);
QStringList parseVariableOutput(const QString &output);
void fetchFromCapabilities() const;
void parseFromCapabilities(const QString &input) const;
// Note: New items here need also be handled in CMakeToolItemModel::apply()
// FIXME: Use a saner approach.
Utils::Id m_id;
QString m_displayName;
Utils::FilePath m_executable;
Utils::FilePath m_qchFilePath;
bool m_isAutoRun = true;
bool m_isAutoDetected = false;
QString m_detectionSource;
bool m_autoCreateBuildDirectory = false;
std::optional<ReaderType> m_readerType;
std::unique_ptr<Internal::IntrospectionData> m_introspection;
PathMapper m_pathMapper;
};
} // namespace CMakeProjectManager
|