Files
qt-creator/src/plugins/mesonprojectmanager/project/mesonprojectparser.h
Eike Ziller 381c5656e7 Merge remote-tracking branch 'origin/4.14'
Conflicts:
	src/plugins/mesonprojectmanager/project/mesonprojectparser.h

Change-Id: Id38d20ce20981dcdc322fe5d1d7647f4bec89d8a
2020-11-13 16:03:26 +01:00

137 lines
5.3 KiB
C++

/****************************************************************************
**
** Copyright (C) 2020 Alexis Jeandet.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#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::QtVersion 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::QtVersion m_qtVersion = Utils::QtVersion::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