diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index af6b95e460d..389298783c0 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -37,13 +37,10 @@ add_qtc_plugin(MesonProjectManager mesonrunconfiguration.h mesontools.cpp mesontools.h - mesonwrapper.cpp - mesonwrapper.h ninjabuildstep.cpp ninjabuildstep.h ninjaparser.cpp ninjaparser.h - ninjawrapper.h projecttree.cpp projecttree.h resources_meson.qrc @@ -84,9 +81,6 @@ add_qtc_test(tst_mesonwrapper TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" SOURCES tests/testmesonwrapper.cpp - mesonwrapper.cpp - mesonwrapper.h - ninjawrapper.h toolwrapper.h toolwrapper.cpp mesontools.h @@ -105,9 +99,6 @@ add_qtc_test(tst_mesoninfoparser TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" SOURCES tests/testmesoninfoparser.cpp - mesonwrapper.cpp - mesonwrapper.h - ninjawrapper.h toolwrapper.h toolwrapper.cpp mesontools.h diff --git a/src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp b/src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp index 090f48257f9..385d9b13edc 100644 --- a/src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp +++ b/src/plugins/mesonprojectmanager/mesonbuildconfiguration.cpp @@ -7,7 +7,6 @@ #include "mesonbuildsystem.h" #include "mesonpluginconstants.h" #include "mesonprojectmanagertr.h" -#include "mesonwrapper.h" #include "ninjabuildstep.h" #include diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index a978bd2123a..fed454a6ce5 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -20,9 +20,6 @@ Project { files: [ "mesontools.cpp", "mesontools.h", - "mesonwrapper.cpp", - "mesonwrapper.h", - "ninjawrapper.h", "toolwrapper.cpp", "toolwrapper.h", "kitdata.h", @@ -94,9 +91,6 @@ Project { cpp.includePaths: "." files: [ - "mesonwrapper.cpp", - "mesonwrapper.h", - "ninjawrapper.h", "toolwrapper.h", "toolwrapper.cpp", "mesontools.h", @@ -114,9 +108,6 @@ Project { cpp.includePaths: "." files: [ - "mesonwrapper.cpp", - "mesonwrapper.h", - "ninjawrapper.h", "toolwrapper.h", "toolwrapper.cpp", "mesontools.h", diff --git a/src/plugins/mesonprojectmanager/mesonprojectparser.h b/src/plugins/mesonprojectmanager/mesonprojectparser.h index 126d9b4d0fd..2a68d2c31c8 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectparser.h +++ b/src/plugins/mesonprojectmanager/mesonprojectparser.h @@ -7,7 +7,7 @@ #include "mesoninfoparser.h" #include "mesonoutputparser.h" #include "mesonprojectnodes.h" -#include "mesonwrapper.h" +#include "toolwrapper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/mesontools.h b/src/plugins/mesonprojectmanager/mesontools.h index 23ff67b4b6b..9904bdfb3b3 100644 --- a/src/plugins/mesonprojectmanager/mesontools.h +++ b/src/plugins/mesonprojectmanager/mesontools.h @@ -3,8 +3,6 @@ #pragma once -#include "mesonwrapper.h" -#include "ninjawrapper.h" #include "toolwrapper.h" #include diff --git a/src/plugins/mesonprojectmanager/mesonwrapper.cpp b/src/plugins/mesonprojectmanager/mesonwrapper.cpp deleted file mode 100644 index 61c295c98be..00000000000 --- a/src/plugins/mesonprojectmanager/mesonwrapper.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2020 Alexis Jeandet. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "mesonwrapper.h" - -#include -#include - -namespace { -template -void impl_option_cat(QStringList &list, const First &first) -{ - list.append(first); -} - -template -void impl_option_cat(QStringList &list, const First &first, const T &...args) -{ - impl_option_cat(list, first); - impl_option_cat(list, args...); -} - -template -QStringList options_cat(const T &...args) -{ - QStringList result; - impl_option_cat(result, args...); - return result; -} - -} // namespace -namespace MesonProjectManager { -namespace Internal { - -Command MesonWrapper::setup(const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory, - const QStringList &options) const -{ - return {m_exe, - sourceDirectory, - options_cat("setup", options, sourceDirectory.toString(), buildDirectory.toString())}; -} - -Command MesonWrapper::configure(const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory, - const QStringList &options) const -{ - if (!isSetup(buildDirectory)) - return setup(sourceDirectory, buildDirectory, options); - return {m_exe, buildDirectory, options_cat("configure", options, buildDirectory.toString())}; -} - -Command MesonWrapper::regenerate(const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory) const -{ - return {m_exe, - buildDirectory, - options_cat("--internal", - "regenerate", - sourceDirectory.toString(), - buildDirectory.toString(), - "--backend", - "ninja")}; -} - -Command MesonWrapper::introspect(const Utils::FilePath &sourceDirectory) const -{ - return {m_exe, - sourceDirectory, - {"introspect", "--all", QString("%1/meson.build").arg(sourceDirectory.toString())}}; -} - -} // namespace Internal -} // namespace MesonProjectManager diff --git a/src/plugins/mesonprojectmanager/mesonwrapper.h b/src/plugins/mesonprojectmanager/mesonwrapper.h deleted file mode 100644 index c38927fc9f2..00000000000 --- a/src/plugins/mesonprojectmanager/mesonwrapper.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2020 Alexis Jeandet. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "mesonpluginconstants.h" -#include "toolwrapper.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -namespace MesonProjectManager { -namespace Internal { - -template -bool containsFiles(const QString &path, const File_t &file) -{ - return QFileInfo::exists(QString("%1/%2").arg(path).arg(file)); -} - -template -bool containsFiles(const QString &path, const File_t &file, const T &...files) -{ - return containsFiles(path, file) && containsFiles(path, files...); -} - -inline bool run_meson(const Command &command, QIODevice *output = nullptr) -{ - Utils::Process process; - process.setWorkingDirectory(command.workDir()); - process.setCommand(command.cmdLine()); - process.start(); - if (!process.waitForFinished()) - return false; - if (output) { - output->write(process.rawStdOut()); - } - return process.exitCode() == 0; -} - -inline bool isSetup(const Utils::FilePath &buildPath) -{ - using namespace Utils; - return containsFiles(buildPath.pathAppended(Constants::MESON_INFO_DIR).toString(), - Constants::MESON_INTRO_TESTS, - Constants::MESON_INTRO_TARGETS, - Constants::MESON_INTRO_INSTALLED, - Constants::MESON_INTRO_BENCHMARKS, - Constants::MESON_INTRO_BUIDOPTIONS, - Constants::MESON_INTRO_PROJECTINFO, - Constants::MESON_INTRO_DEPENDENCIES, - Constants::MESON_INTRO_BUILDSYSTEM_FILES); -} - -class MesonWrapper final : public ToolWrapper -{ -public: - using ToolWrapper::ToolWrapper; - - Command setup(const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory, - const QStringList &options = {}) const; - Command configure(const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory, - const QStringList &options = {}) const; - - Command regenerate(const Utils::FilePath &sourceDirectory, - const Utils::FilePath &buildDirectory) const; - - Command introspect(const Utils::FilePath &sourceDirectory) const; - - static std::optional find() - { - return ToolWrapper::findTool({"meson.py", "meson"}); - } - - static QString toolName() { return {"Meson"}; } -}; - -template<> -inline Utils::Store toVariantMap(const MesonWrapper &meson) -{ - Utils::Store data; - data.insert(Constants::ToolsSettings::NAME_KEY, meson.m_name); - data.insert(Constants::ToolsSettings::EXE_KEY, meson.m_exe.toSettings()); - data.insert(Constants::ToolsSettings::AUTO_DETECTED_KEY, meson.m_autoDetected); - data.insert(Constants::ToolsSettings::ID_KEY, meson.m_id.toSetting()); - data.insert(Constants::ToolsSettings::TOOL_TYPE_KEY, Constants::ToolsSettings::TOOL_TYPE_MESON); - return data; -} -template<> -inline MesonWrapper *fromVariantMap(const Utils::Store &data) -{ - return new MesonWrapper(data[Constants::ToolsSettings::NAME_KEY].toString(), - Utils::FilePath::fromSettings(data[Constants::ToolsSettings::EXE_KEY]), - Utils::Id::fromSetting(data[Constants::ToolsSettings::ID_KEY]), - data[Constants::ToolsSettings::AUTO_DETECTED_KEY].toBool()); -} - -} // namespace Internal -} // namespace MesonProjectManager diff --git a/src/plugins/mesonprojectmanager/ninjawrapper.h b/src/plugins/mesonprojectmanager/ninjawrapper.h deleted file mode 100644 index 93339d37f9e..00000000000 --- a/src/plugins/mesonprojectmanager/ninjawrapper.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2020 Alexis Jeandet. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "mesonpluginconstants.h" -#include "toolwrapper.h" - -namespace MesonProjectManager { -namespace Internal { - -class NinjaWrapper final : public ToolWrapper -{ -public: - using ToolWrapper::ToolWrapper; - - static std::optional find() - { - return ToolWrapper::findTool({"ninja", "ninja-build"}); - } - static QString toolName() { return {"Ninja"}; } -}; - -template<> -inline Utils::Store toVariantMap(const NinjaWrapper &meson) -{ - Utils::Store data; - data.insert(Constants::ToolsSettings::NAME_KEY, meson.m_name); - data.insert(Constants::ToolsSettings::EXE_KEY, meson.m_exe.toSettings()); - data.insert(Constants::ToolsSettings::AUTO_DETECTED_KEY, meson.m_autoDetected); - data.insert(Constants::ToolsSettings::ID_KEY, meson.m_id.toSetting()); - data.insert(Constants::ToolsSettings::TOOL_TYPE_KEY, Constants::ToolsSettings::TOOL_TYPE_NINJA); - return data; -} -template<> -inline NinjaWrapper *fromVariantMap(const Utils::Store &data) -{ - return new NinjaWrapper(data[Constants::ToolsSettings::NAME_KEY].toString(), - Utils::FilePath::fromSettings(data[Constants::ToolsSettings::EXE_KEY]), - Utils::Id::fromSetting(data[Constants::ToolsSettings::ID_KEY]), - data[Constants::ToolsSettings::AUTO_DETECTED_KEY].toBool()); -} - -} // namespace Internal -} // namespace MesonProjectManager diff --git a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp index 37051b7ecdc..86007d22474 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "mesonwrapper.h" +#include "toolwrapper.h" #include "mesoninfoparser.h" #include diff --git a/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp b/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp index f3217302768..b0095828968 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "../mesonwrapper.h" +#include "../toolwrapper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/toolkitaspectwidget.h b/src/plugins/mesonprojectmanager/toolkitaspectwidget.h index 1ff312d99f2..182c6870aa7 100644 --- a/src/plugins/mesonprojectmanager/toolkitaspectwidget.h +++ b/src/plugins/mesonprojectmanager/toolkitaspectwidget.h @@ -3,8 +3,7 @@ #pragma once -#include "mesonwrapper.h" -#include "ninjawrapper.h" +#include "toolwrapper.h" #include #include diff --git a/src/plugins/mesonprojectmanager/toolwrapper.cpp b/src/plugins/mesonprojectmanager/toolwrapper.cpp index 2263c0d512c..34cde237da5 100644 --- a/src/plugins/mesonprojectmanager/toolwrapper.cpp +++ b/src/plugins/mesonprojectmanager/toolwrapper.cpp @@ -3,11 +3,22 @@ #include "toolwrapper.h" +#include +#include +#include #include +#include +#include +#include + +using namespace Utils; + namespace MesonProjectManager { namespace Internal { +// ToolWrapper base + ToolWrapper::ToolWrapper(const QString &name, const Utils::FilePath &path, bool autoDetected) : m_version(read_version(path)) , m_isValid{path.exists() && m_version.isValid} @@ -49,9 +60,8 @@ Version ToolWrapper::read_version(const Utils::FilePath &toolPath) return {}; } -std::optional ToolWrapper::findTool(const QStringList &exeNames) +static std::optional findTool(const QStringList &exeNames) { - using namespace Utils; Environment systemEnvironment = Environment::systemEnvironment(); for (const auto &exe : exeNames) { const FilePath exe_path = systemEnvironment.searchInPath(exe); @@ -61,5 +71,118 @@ std::optional ToolWrapper::findTool(const QStringList &exeNames return std::nullopt; } +// MesonWrapper + +template +void impl_option_cat(QStringList &list, const First &first) +{ + list.append(first); +} + +template +void impl_option_cat(QStringList &list, const First &first, const T &...args) +{ + impl_option_cat(list, first); + impl_option_cat(list, args...); +} + +template +QStringList options_cat(const T &...args) +{ + QStringList result; + impl_option_cat(result, args...); + return result; +} + +Command MesonWrapper::setup(const Utils::FilePath &sourceDirectory, + const Utils::FilePath &buildDirectory, + const QStringList &options) const +{ + return {m_exe, + sourceDirectory, + options_cat("setup", options, sourceDirectory.toString(), buildDirectory.toString())}; +} + +Command MesonWrapper::configure(const Utils::FilePath &sourceDirectory, + const Utils::FilePath &buildDirectory, + const QStringList &options) const +{ + if (!isSetup(buildDirectory)) + return setup(sourceDirectory, buildDirectory, options); + return {m_exe, buildDirectory, options_cat("configure", options, buildDirectory.toString())}; +} + +Command MesonWrapper::regenerate(const Utils::FilePath &sourceDirectory, + const Utils::FilePath &buildDirectory) const +{ + return {m_exe, + buildDirectory, + options_cat("--internal", + "regenerate", + sourceDirectory.toString(), + buildDirectory.toString(), + "--backend", + "ninja")}; +} + +Command MesonWrapper::introspect(const Utils::FilePath &sourceDirectory) const +{ + return {m_exe, + sourceDirectory, + {"introspect", "--all", QString("%1/meson.build").arg(sourceDirectory.toString())}}; +} + +std::optional MesonWrapper::find() +{ + return findTool({"meson.py", "meson"}); +} + +template +bool containsFiles(const QString &path, const File_t &file) +{ + return QFileInfo::exists(QString("%1/%2").arg(path).arg(file)); +} + +template +bool containsFiles(const QString &path, const File_t &file, const T &...files) +{ + return containsFiles(path, file) && containsFiles(path, files...); +} + +bool run_meson(const Command &command, QIODevice *output) +{ + Utils::Process process; + process.setWorkingDirectory(command.workDir()); + process.setCommand(command.cmdLine()); + process.start(); + if (!process.waitForFinished()) + return false; + if (output) { + output->write(process.rawStdOut()); + } + return process.exitCode() == 0; +} + +bool isSetup(const Utils::FilePath &buildPath) +{ + using namespace Utils; + return containsFiles(buildPath.pathAppended(Constants::MESON_INFO_DIR).toString(), + Constants::MESON_INTRO_TESTS, + Constants::MESON_INTRO_TARGETS, + Constants::MESON_INTRO_INSTALLED, + Constants::MESON_INTRO_BENCHMARKS, + Constants::MESON_INTRO_BUIDOPTIONS, + Constants::MESON_INTRO_PROJECTINFO, + Constants::MESON_INTRO_DEPENDENCIES, + Constants::MESON_INTRO_BUILDSYSTEM_FILES); +} + +// NinjaWrapper + +std::optional NinjaWrapper::find() +{ + return findTool({"ninja", "ninja-build"}); +} + } // namespace Internal } // namespace MesonProjectManager diff --git a/src/plugins/mesonprojectmanager/toolwrapper.h b/src/plugins/mesonprojectmanager/toolwrapper.h index 47fe583eff3..1ee49c0e6e9 100644 --- a/src/plugins/mesonprojectmanager/toolwrapper.h +++ b/src/plugins/mesonprojectmanager/toolwrapper.h @@ -3,12 +3,14 @@ #pragma once +#include "mesonpluginconstants.h" #include "versionhelper.h" #include #include #include #include +#include #include #include @@ -61,8 +63,6 @@ public: static Version read_version(const Utils::FilePath &toolPath); - static std::optional findTool(const QStringList &exeNames); - template friend Utils::Store toVariantMap(const T &); template @@ -82,5 +82,80 @@ Utils::Store toVariantMap(const T &); template T fromVariantMap(const Utils::Store &); +bool run_meson(const Command &command, QIODevice *output = nullptr); + +bool isSetup(const Utils::FilePath &buildPath); + +class MesonWrapper final : public ToolWrapper +{ +public: + using ToolWrapper::ToolWrapper; + + Command setup(const Utils::FilePath &sourceDirectory, + const Utils::FilePath &buildDirectory, + const QStringList &options = {}) const; + Command configure(const Utils::FilePath &sourceDirectory, + const Utils::FilePath &buildDirectory, + const QStringList &options = {}) const; + + Command regenerate(const Utils::FilePath &sourceDirectory, + const Utils::FilePath &buildDirectory) const; + + Command introspect(const Utils::FilePath &sourceDirectory) const; + + static std::optional find(); + + static QString toolName() { return {"Meson"}; } +}; + +template<> +inline Utils::Store toVariantMap(const MesonWrapper &meson) +{ + Utils::Store data; + data.insert(Constants::ToolsSettings::NAME_KEY, meson.m_name); + data.insert(Constants::ToolsSettings::EXE_KEY, meson.m_exe.toSettings()); + data.insert(Constants::ToolsSettings::AUTO_DETECTED_KEY, meson.m_autoDetected); + data.insert(Constants::ToolsSettings::ID_KEY, meson.m_id.toSetting()); + data.insert(Constants::ToolsSettings::TOOL_TYPE_KEY, Constants::ToolsSettings::TOOL_TYPE_MESON); + return data; +} +template<> +inline MesonWrapper *fromVariantMap(const Utils::Store &data) +{ + return new MesonWrapper(data[Constants::ToolsSettings::NAME_KEY].toString(), + Utils::FilePath::fromSettings(data[Constants::ToolsSettings::EXE_KEY]), + Utils::Id::fromSetting(data[Constants::ToolsSettings::ID_KEY]), + data[Constants::ToolsSettings::AUTO_DETECTED_KEY].toBool()); +} + +class NinjaWrapper final : public ToolWrapper +{ +public: + using ToolWrapper::ToolWrapper; + + static std::optional find(); + static QString toolName() { return {"Ninja"}; } +}; + +template<> +inline Utils::Store toVariantMap(const NinjaWrapper &meson) +{ + Utils::Store data; + data.insert(Constants::ToolsSettings::NAME_KEY, meson.m_name); + data.insert(Constants::ToolsSettings::EXE_KEY, meson.m_exe.toSettings()); + data.insert(Constants::ToolsSettings::AUTO_DETECTED_KEY, meson.m_autoDetected); + data.insert(Constants::ToolsSettings::ID_KEY, meson.m_id.toSetting()); + data.insert(Constants::ToolsSettings::TOOL_TYPE_KEY, Constants::ToolsSettings::TOOL_TYPE_NINJA); + return data; +} +template<> +inline NinjaWrapper *fromVariantMap(const Utils::Store &data) +{ + return new NinjaWrapper(data[Constants::ToolsSettings::NAME_KEY].toString(), + Utils::FilePath::fromSettings(data[Constants::ToolsSettings::EXE_KEY]), + Utils::Id::fromSetting(data[Constants::ToolsSettings::ID_KEY]), + data[Constants::ToolsSettings::AUTO_DETECTED_KEY].toBool()); +} + } // namespace Internal } // namespace MesonProjectManager