diff --git a/src/plugins/mesonprojectmanager/mesonprojectparser.cpp b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp index 1eaff45346b..220bbd82dac 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectparser.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectparser.cpp @@ -120,10 +120,10 @@ bool MesonProjectParser::configure(const FilePath &sourcePath, m_srcDir = sourcePath; m_buildDir = buildPath; m_outputParser.setSourceDirectory(sourcePath); - auto cmd = MesonTools::mesonWrapper(m_meson)->configure(sourcePath, buildPath, args); + auto cmd = MesonTools::toolById(m_meson, ToolType::Meson)->configure(sourcePath, buildPath, args); // see comment near m_pendingCommands declaration m_pendingCommands.enqueue( - std::make_tuple(MesonTools::mesonWrapper(m_meson)->regenerate(sourcePath, buildPath), + std::make_tuple(MesonTools::toolById(m_meson, ToolType::Meson)->regenerate(sourcePath, buildPath), false)); return run(cmd, m_env, m_projectName); } @@ -147,7 +147,7 @@ bool MesonProjectParser::setup(const FilePath &sourcePath, auto cmdArgs = args; if (forceWipe || isSetup(buildPath)) cmdArgs << "--wipe"; - auto cmd = MesonTools::mesonWrapper(m_meson)->setup(sourcePath, buildPath, cmdArgs); + auto cmd = MesonTools::toolById(m_meson, ToolType::Meson)->setup(sourcePath, buildPath, cmdArgs); return run(cmd, m_env, m_projectName); } @@ -169,7 +169,7 @@ bool MesonProjectParser::parse(const FilePath &sourcePath) m_srcDir = sourcePath; m_introType = IntroDataType::stdo; m_outputParser.setSourceDirectory(sourcePath); - return run(MesonTools::mesonWrapper(m_meson)->introspect(sourcePath), + return run(MesonTools::toolById(m_meson, ToolType::Meson)->introspect(sourcePath), m_env, m_projectName, true); @@ -310,11 +310,10 @@ bool MesonProjectParser::matchesKit(const KitData &kit) bool MesonProjectParser::usesSameMesonVersion(const FilePath &buildPath) { auto info = MesonInfoParser::mesonInfo(buildPath); - auto meson = MesonTools::mesonWrapper(m_meson); + auto meson = MesonTools::toolById(m_meson, ToolType::Meson); return info && meson && info->mesonVersion == meson->version(); } - bool MesonProjectParser::run(const Command &command, const Environment &env, const QString &projectName, diff --git a/src/plugins/mesonprojectmanager/mesontools.cpp b/src/plugins/mesonprojectmanager/mesontools.cpp index 096350fbf73..76a7b319bd8 100644 --- a/src/plugins/mesonprojectmanager/mesontools.cpp +++ b/src/plugins/mesonprojectmanager/mesontools.cpp @@ -3,51 +3,51 @@ #include "mesontools.h" +#include #include using namespace Utils; -namespace MesonProjectManager { -namespace Internal { +namespace MesonProjectManager::Internal { -MesonTools::Tool_t tool(const Id &id, - const std::vector &tools, - ToolType toolType) +std::vector s_tools; + +static MesonTools::Tool_t findTool(const Id &id, ToolType toolType) { - const auto tool = std::find_if(std::cbegin(tools), - std::cend(tools), + const auto tool = std::find_if(std::cbegin(s_tools), + std::cend(s_tools), [&id](const MesonTools::Tool_t &tool) { return tool->id() == id; }); - if (tool != std::cend(tools) && (*tool)->toolType() == toolType) + if (tool != std::cend(s_tools) && (*tool)->toolType() == toolType) return *tool; return nullptr; } -static MesonTools::Tool_t autoDetected(const std::vector &tools, ToolType toolType) +MesonTools::Tool_t autoDetectedTool(ToolType toolType) { - for (const auto &tool : tools) { + for (const auto &tool : s_tools) { if (tool->autoDetected() && tool->toolType() == toolType) return tool; } return nullptr; } -static void fixAutoDetected(std::vector &tools, ToolType toolType) +static void fixAutoDetected(ToolType toolType) { - MesonTools::Tool_t autoDetectedTool = autoDetected(tools, toolType); - if (!autoDetectedTool) { + MesonTools::Tool_t autoDetected = autoDetectedTool(toolType); + if (!autoDetected) { QStringList exeNames; QString toolName; if (toolType == ToolType::Meson) { - if (std::optional path = findMesonTool()) { - tools.emplace_back( + if (std::optional path = findTool(toolType)) { + s_tools.emplace_back( std::make_shared(toolType, QString("System %1 at %2").arg("Meson").arg(path->toString()), *path, true)); } } else if (toolType == ToolType::Ninja) { - if (std::optional path = findNinjaTool()) { - tools.emplace_back( + if (std::optional path = findTool(toolType)) { + s_tools.emplace_back( std::make_shared(toolType, QString("System %1 at %2").arg("Ninja").arg(path->toString()), *path, true)); } @@ -76,26 +76,28 @@ void MesonTools::addTool(const Id &itemId, const QString &name, const FilePath & void MesonTools::addTool(Tool_t meson) { - auto self = instance(); - self->m_tools.emplace_back(std::move(meson)); - emit self->toolAdded(self->m_tools.back()); + s_tools.emplace_back(std::move(meson)); + emit instance()->toolAdded(s_tools.back()); } void MesonTools::setTools(std::vector &&tools) { - auto self = instance(); - std::swap(self->m_tools, tools); - fixAutoDetected(self->m_tools, ToolType::Meson); - fixAutoDetected(self->m_tools, ToolType::Ninja); + std::swap(s_tools, tools); + fixAutoDetected(ToolType::Meson); + fixAutoDetected(ToolType::Ninja); +} + +const std::vector &MesonTools::tools() +{ + return s_tools; } void MesonTools::updateTool(const Id &itemId, const QString &name, const FilePath &exe) { - auto self = instance(); - auto item = std::find_if(std::begin(self->m_tools), - std::end(self->m_tools), + auto item = std::find_if(std::begin(s_tools), + std::end(s_tools), [&itemId](const Tool_t &tool) { return tool->id() == itemId; }); - if (item != std::end(self->m_tools)) { + if (item != std::end(s_tools)) { (*item)->setExe(exe); (*item)->setName(name); } else { @@ -105,31 +107,20 @@ void MesonTools::updateTool(const Id &itemId, const QString &name, const FilePat void MesonTools::removeTool(const Id &id) { - auto self = instance(); - auto item = Utils::take(self->m_tools, [&id](const auto &item) { return item->id() == id; }); + auto item = Utils::take(s_tools, [&id](const auto &item) { return item->id() == id; }); QTC_ASSERT(item, return ); - emit self->toolRemoved(*item); + emit instance()->toolRemoved(*item); } -std::shared_ptr MesonTools::ninjaWrapper(const Id &id) +std::shared_ptr MesonTools::toolById(const Id &id, ToolType toolType) { - return tool(id, MesonTools::instance()->m_tools, ToolType::Ninja); + return findTool(id, toolType); } -std::shared_ptr MesonTools::mesonWrapper(const Id &id) +MesonTools *MesonTools::instance() { - return tool(id, MesonTools::instance()->m_tools, ToolType::Meson); + static MesonTools inst; + return &inst; } -std::shared_ptr MesonTools::autoDetectedNinja() -{ - return autoDetected(MesonTools::instance()->m_tools, ToolType::Ninja); -} - -std::shared_ptr MesonTools::autoDetectedMeson() -{ - return autoDetected(MesonTools::instance()->m_tools, ToolType::Meson); -} - -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/mesontools.h b/src/plugins/mesonprojectmanager/mesontools.h index db8ecc18777..e625c8b59a7 100644 --- a/src/plugins/mesonprojectmanager/mesontools.h +++ b/src/plugins/mesonprojectmanager/mesontools.h @@ -5,12 +5,9 @@ #include "toolwrapper.h" -#include - #include -namespace MesonProjectManager { -namespace Internal { +namespace MesonProjectManager::Internal { class MesonTools : public QObject { @@ -32,31 +29,21 @@ public: static void setTools(std::vector &&tools); - static inline const std::vector &tools() { return instance()->m_tools; } + static const std::vector &tools(); static void updateTool(const Utils::Id &itemId, const QString &name, const Utils::FilePath &exe); static void removeTool(const Utils::Id &id); - static std::shared_ptr ninjaWrapper(const Utils::Id &id); - static std::shared_ptr mesonWrapper(const Utils::Id &id); + static std::shared_ptr toolById(const Utils::Id &id, ToolType toolType); - static std::shared_ptr autoDetectedNinja(); - static std::shared_ptr autoDetectedMeson(); + static std::shared_ptr autoDetectedTool(ToolType toolType); Q_SIGNAL void toolAdded(const Tool_t &tool); Q_SIGNAL void toolRemoved(const Tool_t &tool); - static MesonTools *instance() - { - static MesonTools inst; - return &inst; - } - -private: - std::vector m_tools; + static MesonTools *instance(); }; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp index 6e6b64fba10..c806a7524c8 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesoninfoparser.cpp @@ -34,7 +34,7 @@ static const QList projectList{ { \ QTemporaryFile _intro_file; \ _intro_file.open(); \ - const auto tool = findMesonTool(); \ + const auto tool = findTool(ToolType::Meson); \ QVERIFY(tool.has_value()); \ const ToolWrapper _meson(ToolType::Meson, "name", *tool); \ run_meson(_meson.introspect(Utils::FilePath::fromString(_source_dir)), &_intro_file); \ @@ -53,7 +53,7 @@ private slots: Utils::LauncherInterface::setPathToLauncher(qApp->applicationDirPath() + '/' + QLatin1String(TEST_RELATIVE_LIBEXEC_PATH)); - const auto path = findMesonTool(); + const auto path = findTool(ToolType::Meson); if (!path) QSKIP("Meson not found"); } @@ -76,7 +76,7 @@ private slots: { QTemporaryDir build_dir{"test-meson"}; FilePath buildDir = FilePath::fromString(build_dir.path()); - const auto tool = findMesonTool(); + const auto tool = findTool(ToolType::Meson); QVERIFY(tool.has_value()); ToolWrapper meson(ToolType::Meson, "name", *tool); run_meson(meson.setup(FilePath::fromString(src_dir), buildDir)); diff --git a/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp b/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp index 8ed199dfa00..f9ecf7ae4e4 100644 --- a/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp +++ b/src/plugins/mesonprojectmanager/tests/testmesonwrapper.cpp @@ -30,21 +30,21 @@ private slots: Utils::LauncherInterface::setPathToLauncher(qApp->applicationDirPath() + '/' + QLatin1String(TEST_RELATIVE_LIBEXEC_PATH)); - const auto path = findMesonTool(); + const auto path = findTool(ToolType::Meson); if (!path) QSKIP("Meson not found"); } void shouldFindMesonFromPATH() { - const auto path = findMesonTool(); + const auto path = findTool(ToolType::Meson); QVERIFY(path); QVERIFY(path->exists()); } void shouldReportMesonVersion() { - ToolWrapper meson(ToolType::Meson, "name", *findMesonTool()); + ToolWrapper meson(ToolType::Meson, "name", *findTool(ToolType::Meson)); QVERIFY(meson.isValid()); QVERIFY(meson.version().major == 0); QVERIFY(meson.version().minor >= 50); @@ -65,7 +65,7 @@ private slots: { QFETCH(QString, src_dir); QTemporaryDir build_dir{"test-meson"}; - const ToolWrapper meson(ToolType::Meson, "name", *findMesonTool()); + const ToolWrapper meson(ToolType::Meson, "name", *findTool(ToolType::Meson)); QVERIFY(run_meson(meson.setup(Utils::FilePath::fromString(src_dir), Utils::FilePath::fromString(build_dir.path())))); QVERIFY( @@ -86,7 +86,7 @@ private slots: { QFETCH(QString, src_dir); QTemporaryDir build_dir{"test-meson"}; - const ToolWrapper meson(ToolType::Meson, "name", *findMesonTool()); + const ToolWrapper meson(ToolType::Meson, "name", *findTool(ToolType::Meson)); QVERIFY(run_meson(meson.setup(Utils::FilePath::fromString(src_dir), Utils::FilePath::fromString(build_dir.path())))); QVERIFY(run_meson(meson.configure(Utils::FilePath::fromString(src_dir), diff --git a/src/plugins/mesonprojectmanager/toolkitaspectwidget.cpp b/src/plugins/mesonprojectmanager/toolkitaspectwidget.cpp index d5c058b61cf..41da7967e4c 100644 --- a/src/plugins/mesonprojectmanager/toolkitaspectwidget.cpp +++ b/src/plugins/mesonprojectmanager/toolkitaspectwidget.cpp @@ -138,11 +138,7 @@ void MesonToolKitAspectImpl::loadTools() void MesonToolKitAspectImpl::setToDefault() { - const MesonTools::Tool_t autoDetected = [this] { - if (m_type == ToolType::Meson) - return MesonTools::autoDetectedMeson(); - return MesonTools::autoDetectedNinja(); - }(); + const MesonTools::Tool_t autoDetected = MesonTools::autoDetectedTool(m_type); if (autoDetected) { const auto index = indexOf(autoDetected->id()); @@ -172,7 +168,7 @@ Id MesonToolKitAspect::mesonToolId(const Kit *kit) std::shared_ptr MesonToolKitAspect::mesonTool(const Kit *kit) { - return MesonTools::mesonWrapper(MesonToolKitAspect::mesonToolId(kit)); + return MesonTools::toolById(MesonToolKitAspect::mesonToolId(kit), ToolType::Meson); } bool MesonToolKitAspect::isValid(const Kit *kit) @@ -208,7 +204,7 @@ public: { const auto tool = MesonToolKitAspect::mesonTool(k); if (!tool) { - const auto autoDetected = MesonTools::autoDetectedMeson(); + const auto autoDetected = MesonTools::autoDetectedTool(ToolType::Meson); if (autoDetected) MesonToolKitAspect::setMesonTool(k, autoDetected->id()); } @@ -253,7 +249,7 @@ Id NinjaToolKitAspect::ninjaToolId(const Kit *kit) std::shared_ptr NinjaToolKitAspect::ninjaTool(const Kit *kit) { - return MesonTools::ninjaWrapper(NinjaToolKitAspect::ninjaToolId(kit)); + return MesonTools::toolById(NinjaToolKitAspect::ninjaToolId(kit), ToolType::Ninja); } bool NinjaToolKitAspect::isValid(const Kit *kit) @@ -289,7 +285,7 @@ public: { const auto tool = NinjaToolKitAspect::ninjaTool(k); if (!tool) { - const auto autoDetected = MesonTools::autoDetectedNinja(); + const auto autoDetected = MesonTools::autoDetectedTool(ToolType::Ninja); if (autoDetected) NinjaToolKitAspect::setNinjaTool(k, autoDetected->id()); } diff --git a/src/plugins/mesonprojectmanager/toolwrapper.cpp b/src/plugins/mesonprojectmanager/toolwrapper.cpp index 9a14c53cc05..99238663158 100644 --- a/src/plugins/mesonprojectmanager/toolwrapper.cpp +++ b/src/plugins/mesonprojectmanager/toolwrapper.cpp @@ -102,17 +102,6 @@ Store ToolWrapper::toVariantMap() const return data; } -static std::optional findTool(const QStringList &exeNames) -{ - Environment systemEnvironment = Environment::systemEnvironment(); - for (const auto &exe : exeNames) { - const FilePath exe_path = systemEnvironment.searchInPath(exe); - if (exe_path.exists()) - return exe_path; - } - return std::nullopt; -} - template void impl_option_cat(QStringList &list, const First &first) { @@ -212,14 +201,25 @@ bool isSetup(const Utils::FilePath &buildPath) Constants::MESON_INTRO_BUILDSYSTEM_FILES); } -std::optional findMesonTool() +static std::optional findToolHelper(const QStringList &exeNames) { - return findTool({"meson.py", "meson"}); + Environment systemEnvironment = Environment::systemEnvironment(); + for (const auto &exe : exeNames) { + const FilePath exe_path = systemEnvironment.searchInPath(exe); + if (exe_path.exists()) + return exe_path; + } + return std::nullopt; } -std::optional findNinjaTool() +std::optional findTool(ToolType toolType) { - return findTool({"ninja", "ninja-build"}); + if (toolType == ToolType::Meson) + return findToolHelper({"meson.py", "meson"}); + if (toolType == ToolType::Ninja) + return findToolHelper({"ninja", "ninja-build"}); + QTC_CHECK(false); + return {}; } } // namespace Internal diff --git a/src/plugins/mesonprojectmanager/toolwrapper.h b/src/plugins/mesonprojectmanager/toolwrapper.h index fa9a821df39..85589d1a199 100644 --- a/src/plugins/mesonprojectmanager/toolwrapper.h +++ b/src/plugins/mesonprojectmanager/toolwrapper.h @@ -81,8 +81,7 @@ bool run_meson(const Command &command, QIODevice *output = nullptr); bool isSetup(const Utils::FilePath &buildPath); -std::optional findMesonTool(); -std::optional findNinjaTool(); +std::optional findTool(ToolType toolType); } // namespace Internal } // namespace MesonProjectManager