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
|
// Copyright (C) 2020 Alexis Jeandet.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once
#include "exewrappers/mesonwrapper.h"
#include "kithelper/kitdata.h"
#include "mesoninfoparser/mesoninfoparser.h"
#include "mesonprocess.h"
#include "outputparsers/mesonoutputparser.h"
#include "projecttree/mesonprojectnodes.h"
#include <projectexplorer/buildsystem.h>
#include <projectexplorer/kit.h>
#include <projectexplorer/rawprojectpart.h>
#include <utils/environment.h>
#include <utils/fileutils.h>
#include <QFuture>
#include <QQueue>
namespace MesonProjectManager {
namespace Internal {
class MesonProjectParser : public QObject
{
Q_OBJECT
enum class IntroDataType { file, stdo };
struct ParserData
{
MesonInfoParser::Result data;
std::unique_ptr<MesonProjectNode> rootNode;
};
public:
MesonProjectParser(const Utils::Id &meson, Utils::Environment env, ProjectExplorer::Project* project);
void setMesonTool(const Utils::Id &meson);
bool configure(const Utils::FilePath &sourcePath,
const Utils::FilePath &buildPath,
const QStringList &args);
bool wipe(const Utils::FilePath &sourcePath,
const Utils::FilePath &buildPath,
const QStringList &args);
bool setup(const Utils::FilePath &sourcePath,
const Utils::FilePath &buildPath,
const QStringList &args,
bool forceWipe = false);
bool parse(const Utils::FilePath &sourcePath, const Utils::FilePath &buildPath);
bool parse(const Utils::FilePath &sourcePath);
Q_SIGNAL void parsingCompleted(bool success);
std::unique_ptr<MesonProjectNode> takeProjectNode() { return std::move(m_rootNode); }
inline const BuildOptionsList &buildOptions() const { return m_parserResult.buildOptions; };
inline const TargetsList &targets() const { return m_parserResult.targets; }
inline const QStringList &targetsNames() const { return m_targetsNames; }
static inline QStringList additionalTargets()
{
return QStringList{Constants::Targets::all,
Constants::Targets::clean,
Constants::Targets::install,
Constants::Targets::benchmark,
Constants::Targets::scan_build};
}
QList<ProjectExplorer::BuildTargetInfo> appsTargets() const;
ProjectExplorer::RawProjectParts buildProjectParts(
const ProjectExplorer::ToolChain *cxxToolChain,
const ProjectExplorer::ToolChain *cToolChain);
inline void setEnvironment(const Utils::Environment &environment) { m_env = environment; }
inline void setQtVersion(Utils::QtMajorVersion v) { m_qtVersion = v; }
bool matchesKit(const KitData &kit);
bool usesSameMesonVersion(const Utils::FilePath &buildPath);
private:
bool startParser();
static ParserData *extractParserResults(const Utils::FilePath &srcDir,
MesonInfoParser::Result &&parserResult);
static void addMissingTargets(QStringList &targetList);
void update(const QFuture<ParserData *> &data);
ProjectExplorer::RawProjectPart buildRawPart(const Target &target,
const Target::SourceGroup &sources,
const ProjectExplorer::ToolChain *cxxToolChain,
const ProjectExplorer::ToolChain *cToolChain);
void processFinished(int exitCode, QProcess::ExitStatus exitStatus);
MesonProcess m_process;
MesonOutputParser m_outputParser;
Utils::Environment m_env;
Utils::Id m_meson;
Utils::FilePath m_buildDir;
Utils::FilePath m_srcDir;
QFuture<ParserData *> m_parserFutureResult;
bool m_configuring = false;
IntroDataType m_introType;
MesonInfoParser::Result m_parserResult;
QStringList m_targetsNames;
Utils::QtMajorVersion m_qtVersion = Utils::QtMajorVersion::Unknown;
std::unique_ptr<MesonProjectNode> m_rootNode; // <- project tree root node
QString m_projectName;
// maybe moving meson to build step could make this class simpler
// also this should ease command dependencies
QQueue<std::tuple<Command, bool>> m_pendingCommands;
};
} // namespace Internal
} // namespace MesonProjectManager
|