diff --git a/src/plugins/mesonprojectmanager/CMakeLists.txt b/src/plugins/mesonprojectmanager/CMakeLists.txt index a9e46077418..d56f77c20e4 100644 --- a/src/plugins/mesonprojectmanager/CMakeLists.txt +++ b/src/plugins/mesonprojectmanager/CMakeLists.txt @@ -14,8 +14,6 @@ add_qtc_plugin(MesonProjectManager infoparser.h kitdata.h kithelper.h - machinefilemanager.cpp - machinefilemanager.h mesonactionsmanager.cpp mesonactionsmanager.h mesonbuildconfiguration.cpp diff --git a/src/plugins/mesonprojectmanager/kithelper.h b/src/plugins/mesonprojectmanager/kithelper.h index 965dad6563e..00db098251a 100644 --- a/src/plugins/mesonprojectmanager/kithelper.h +++ b/src/plugins/mesonprojectmanager/kithelper.h @@ -12,77 +12,3 @@ #include #include -namespace MesonProjectManager { -namespace Internal { - -namespace KitHelper { -namespace details { - -inline QString expand(const ProjectExplorer::Kit *kit, const QString ¯o) -{ - return kit->macroExpander()->expand(macro); -} - -} // namespace details - -inline QString cCompilerPath(const ProjectExplorer::Kit *kit) -{ - QTC_ASSERT(kit, return {}); - return details::expand(kit, "%{Compiler:Executable:C}"); -} - -inline QString cxxCompilerPath(const ProjectExplorer::Kit *kit) -{ - QTC_ASSERT(kit, return {}); - return details::expand(kit, "%{Compiler:Executable:Cxx}"); -} - -inline QString qmakePath(const ProjectExplorer::Kit *kit) -{ - return details::expand(kit, "%{Qt:qmakeExecutable}"); -} - -inline QString cmakePath(const ProjectExplorer::Kit *kit) -{ - return details::expand(kit, "%{CMake:Executable:FilePath}"); -} - -inline QString qtVersion(const ProjectExplorer::Kit *kit) -{ - QTC_ASSERT(kit, return {}); - return details::expand(kit, "%{Qt:Version}"); -} - -inline KitData kitData(const ProjectExplorer::Kit *kit) -{ - QTC_ASSERT(kit, return {}); - KitData data; - data.cCompilerPath = cCompilerPath(kit); - data.cxxCompilerPath = cxxCompilerPath(kit); - data.cmakePath = cmakePath(kit); - data.qmakePath = qmakePath(kit); - data.qtVersionStr = qtVersion(kit); - data.qtVersion = Utils::QtMajorVersion::None; - auto version = Version::fromString(data.qtVersionStr); - if (version.isValid) { - switch (version.major) { - case 4: - data.qtVersion = Utils::QtMajorVersion::Qt4; - break; - case 5: - data.qtVersion = Utils::QtMajorVersion::Qt5; - break; - case 6: - data.qtVersion = Utils::QtMajorVersion::Qt6; - break; - default: - data.qtVersion = Utils::QtMajorVersion::Unknown; - } - } - return data; -} - -} // namespace KitHelper - -} // namespace Internal -} // namespace MesonProjectManager diff --git a/src/plugins/mesonprojectmanager/machinefilemanager.cpp b/src/plugins/mesonprojectmanager/machinefilemanager.cpp deleted file mode 100644 index c340d7170e2..00000000000 --- a/src/plugins/mesonprojectmanager/machinefilemanager.cpp +++ /dev/null @@ -1,114 +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 "machinefilemanager.h" - -#include "kitdata.h" -#include "kithelper.h" - -#include - -#include -#include -#include -#include - -#include -#include - -#include - -using namespace ProjectExplorer; -using namespace Utils; - -namespace MesonProjectManager::Internal { - -const char MACHINE_FILE_PREFIX[] = "Meson-MachineFile-"; -const char MACHINE_FILE_EXT[] = ".ini"; - -static FilePath machineFilesDir() -{ - return Core::ICore::userResourcePath("Meson-machine-files"); -} - -MachineFileManager::MachineFileManager() -{ - connect(KitManager::instance(), &KitManager::kitAdded, - this, &MachineFileManager::addMachineFile); - connect(KitManager::instance(), &KitManager::kitUpdated, - this, &MachineFileManager::updateMachineFile); - connect(KitManager::instance(), &KitManager::kitRemoved, - this, &MachineFileManager::removeMachineFile); - connect(KitManager::instance(), &KitManager::kitsLoaded, - this, &MachineFileManager::cleanupMachineFiles); -} - -FilePath MachineFileManager::machineFile(const Kit *kit) -{ - QTC_ASSERT(kit, return {}); - auto baseName - = QString("%1%2%3").arg(MACHINE_FILE_PREFIX).arg(kit->id().toString()).arg(MACHINE_FILE_EXT); - baseName = baseName.remove('{').remove('}'); - return machineFilesDir().pathAppended(baseName); -} - -void MachineFileManager::addMachineFile(const Kit *kit) -{ - FilePath filePath = machineFile(kit); - QTC_ASSERT(!filePath.isEmpty(), return ); - auto kitData = KitHelper::kitData(kit); - - auto entry = [](const QString &key, const QString &value) { - return QString("%1 = '%2'\n").arg(key).arg(value).toUtf8(); - }; - - QByteArray ba = "[binaries]\n"; - ba += entry("c", kitData.cCompilerPath); - ba += entry("cpp", kitData.cxxCompilerPath); - ba += entry("qmake", kitData.qmakePath); - if (kitData.qtVersion == QtMajorVersion::Qt4) - ba += entry("qmake-qt4", kitData.qmakePath); - else if (kitData.qtVersion == QtMajorVersion::Qt5) - ba += entry("qmake-qt5", kitData.qmakePath); - else if (kitData.qtVersion == QtMajorVersion::Qt6) - ba += entry("qmake-qt6", kitData.qmakePath); - ba += entry("cmake", kitData.cmakePath); - - filePath.writeFileContents(ba); -} - -void MachineFileManager::removeMachineFile(const Kit *kit) -{ - FilePath filePath = machineFile(kit); - if (filePath.exists()) - filePath.removeFile(); -} - -void MachineFileManager::updateMachineFile(const Kit *kit) -{ - addMachineFile(kit); -} - -void MachineFileManager::cleanupMachineFiles() -{ - FilePath dir = machineFilesDir(); - dir.ensureWritableDir(); - - const FileFilter filter = {{QString("%1*%2").arg(MACHINE_FILE_PREFIX).arg(MACHINE_FILE_EXT)}}; - const FilePaths machineFiles = dir.dirEntries(filter); - - FilePaths expected; - for (Kit const *kit : KitManager::kits()) { - const FilePath fname = machineFile(kit); - expected.push_back(fname); - if (!machineFiles.contains(fname)) - addMachineFile(kit); - } - - for (const FilePath &file : machineFiles) { - if (!expected.contains(file)) - file.removeFile(); - } -} - -} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/machinefilemanager.h b/src/plugins/mesonprojectmanager/machinefilemanager.h deleted file mode 100644 index 5a3a9a9bd71..00000000000 --- a/src/plugins/mesonprojectmanager/machinefilemanager.h +++ /dev/null @@ -1,26 +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 - -namespace ProjectExplorer { class Kit; } - -namespace MesonProjectManager::Internal { - -class MachineFileManager final : public QObject -{ -public: - MachineFileManager(); - - static Utils::FilePath machineFile(const ProjectExplorer::Kit *kit); - -private: - void addMachineFile(const ProjectExplorer::Kit *kit); - void removeMachineFile(const ProjectExplorer::Kit *kit); - void updateMachineFile(const ProjectExplorer::Kit *kit); - void cleanupMachineFiles(); -}; - -} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp b/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp index d140a468e34..5f1a3b96c25 100644 --- a/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp +++ b/src/plugins/mesonprojectmanager/mesonbuildsystem.cpp @@ -4,7 +4,8 @@ #include "mesonbuildsystem.h" #include "kithelper.h" -#include "machinefilemanager.h" +#include "kitdata.h" +#include "kithelper.h" #include "mesonbuildconfiguration.h" #include "mesonprojectmanagertr.h" #include "mesontoolkitaspect.h" @@ -16,6 +17,18 @@ #include #include +#include + +#include +#include +#include +#include + +#include +#include + +#include + #include #include @@ -37,13 +50,136 @@ }; using namespace ProjectExplorer; +using namespace Utils; + +namespace MesonProjectManager::Internal { -namespace MesonProjectManager { -namespace Internal { static Q_LOGGING_CATEGORY(mesonBuildSystemLog, "qtc.meson.buildsystem", QtWarningMsg); +const char MACHINE_FILE_PREFIX[] = "Meson-MachineFile-"; +const char MACHINE_FILE_EXT[] = ".ini"; + +static KitData createKitData(const Kit *kit) +{ + QTC_ASSERT(kit, return {}); + + MacroExpander *expander = kit->macroExpander(); + + KitData data; + data.cCompilerPath = expander->expand(QString("%{Compiler:Executable:C}")); + data.cxxCompilerPath = expander->expand(QString("%{Compiler:Executable:Cxx}")); + data.cmakePath = expander->expand(QString("%{CMake:Executable:FilePath}")); + data.qmakePath = expander->expand(QString("%{Qt:qmakeExecutable}")); + data.qtVersionStr = expander->expand(QString("%{Qt:Version}")); + data.qtVersion = Utils::QtMajorVersion::None; + auto version = Version::fromString(data.qtVersionStr); + if (version.isValid) { + switch (version.major) { + case 4: + data.qtVersion = Utils::QtMajorVersion::Qt4; + break; + case 5: + data.qtVersion = Utils::QtMajorVersion::Qt5; + break; + case 6: + data.qtVersion = Utils::QtMajorVersion::Qt6; + break; + default: + data.qtVersion = Utils::QtMajorVersion::Unknown; + } + } + return data; +} + +static FilePath machineFilesDir() +{ + return Core::ICore::userResourcePath("Meson-machine-files"); +} + +FilePath MachineFileManager::machineFile(const Kit *kit) +{ + QTC_ASSERT(kit, return {}); + auto baseName + = QString("%1%2%3").arg(MACHINE_FILE_PREFIX).arg(kit->id().toString()).arg(MACHINE_FILE_EXT); + baseName = baseName.remove('{').remove('}'); + return machineFilesDir().pathAppended(baseName); +} + +MachineFileManager::MachineFileManager() +{ + connect(KitManager::instance(), &KitManager::kitAdded, + this, &MachineFileManager::addMachineFile); + connect(KitManager::instance(), &KitManager::kitUpdated, + this, &MachineFileManager::updateMachineFile); + connect(KitManager::instance(), &KitManager::kitRemoved, + this, &MachineFileManager::removeMachineFile); + connect(KitManager::instance(), &KitManager::kitsLoaded, + this, &MachineFileManager::cleanupMachineFiles); +} + +void MachineFileManager::addMachineFile(const Kit *kit) +{ + FilePath filePath = machineFile(kit); + QTC_ASSERT(!filePath.isEmpty(), return ); + auto kitData = createKitData(kit); + + auto entry = [](const QString &key, const QString &value) { + return QString("%1 = '%2'\n").arg(key).arg(value).toUtf8(); + }; + + QByteArray ba = "[binaries]\n"; + ba += entry("c", kitData.cCompilerPath); + ba += entry("cpp", kitData.cxxCompilerPath); + ba += entry("qmake", kitData.qmakePath); + if (kitData.qtVersion == QtMajorVersion::Qt4) + ba += entry("qmake-qt4", kitData.qmakePath); + else if (kitData.qtVersion == QtMajorVersion::Qt5) + ba += entry("qmake-qt5", kitData.qmakePath); + else if (kitData.qtVersion == QtMajorVersion::Qt6) + ba += entry("qmake-qt6", kitData.qmakePath); + ba += entry("cmake", kitData.cmakePath); + + filePath.writeFileContents(ba); +} + +void MachineFileManager::removeMachineFile(const Kit *kit) +{ + FilePath filePath = machineFile(kit); + if (filePath.exists()) + filePath.removeFile(); +} + +void MachineFileManager::updateMachineFile(const Kit *kit) +{ + addMachineFile(kit); +} + +void MachineFileManager::cleanupMachineFiles() +{ + FilePath dir = machineFilesDir(); + dir.ensureWritableDir(); + + const FileFilter filter = {{QString("%1*%2").arg(MACHINE_FILE_PREFIX).arg(MACHINE_FILE_EXT)}}; + const FilePaths machineFiles = dir.dirEntries(filter); + + FilePaths expected; + for (Kit const *kit : KitManager::kits()) { + const FilePath fname = machineFile(kit); + expected.push_back(fname); + if (!machineFiles.contains(fname)) + addMachineFile(kit); + } + + for (const FilePath &file : machineFiles) { + if (!expected.contains(file)) + file.removeFile(); + } +} + +// MesonBuildSystem + MesonBuildSystem::MesonBuildSystem(MesonBuildConfiguration *bc) - : ProjectExplorer::BuildSystem{bc} + : BuildSystem{bc} , m_parser{MesonToolKitAspect::mesonToolId(bc->kit()), bc->environment(), project()} { init(); @@ -92,7 +228,7 @@ void MesonBuildSystem::parsingCompleted(bool success) emit buildConfiguration()->enabledChanged(); // HACK. Should not be needed. } -ProjectExplorer::Kit *MesonBuildSystem::MesonBuildSystem::kit() +Kit *MesonBuildSystem::MesonBuildSystem::kit() { return buildConfiguration()->kit(); } @@ -209,9 +345,8 @@ bool MesonBuildSystem::parseProject() void MesonBuildSystem::updateKit(ProjectExplorer::Kit *kit) { QTC_ASSERT(kit, return ); - m_kitData = KitHelper::kitData(kit); + m_kitData = createKitData(kit); m_parser.setQtVersion(m_kitData.qtVersion); } -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/mesonbuildsystem.h b/src/plugins/mesonprojectmanager/mesonbuildsystem.h index 72e2cc9a961..9851c4af447 100644 --- a/src/plugins/mesonprojectmanager/mesonbuildsystem.h +++ b/src/plugins/mesonprojectmanager/mesonbuildsystem.h @@ -13,13 +13,28 @@ #include -namespace MesonProjectManager { -namespace Internal { +namespace MesonProjectManager::Internal { class MesonBuildConfiguration; + +class MachineFileManager final : public QObject +{ +public: + MachineFileManager(); + + static Utils::FilePath machineFile(const ProjectExplorer::Kit *kit); + +private: + void addMachineFile(const ProjectExplorer::Kit *kit); + void removeMachineFile(const ProjectExplorer::Kit *kit); + void updateMachineFile(const ProjectExplorer::Kit *kit); + void cleanupMachineFiles(); +}; + class MesonBuildSystem final : public ProjectExplorer::BuildSystem { Q_OBJECT + public: MesonBuildSystem(MesonBuildConfiguration *bc); ~MesonBuildSystem() final; @@ -56,5 +71,4 @@ private: KitData m_kitData; }; -} // namespace Internal -} // namespace MesonProjectManager +} // MesonProjectManager::Internal diff --git a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs index 1c0ae3f9d4d..552029cf639 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs +++ b/src/plugins/mesonprojectmanager/mesonprojectmanager.qbs @@ -28,8 +28,6 @@ Project { "toolwrapper.h", "kitdata.h", "kithelper.h", - "machinefilemanager.cpp", - "machinefilemanager.h", "mesonactionsmanager.cpp", "mesonactionsmanager.h", "buildoptions.h", diff --git a/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp b/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp index 87beb589bbd..56d945f04b7 100644 --- a/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp +++ b/src/plugins/mesonprojectmanager/mesonprojectplugin.cpp @@ -3,9 +3,9 @@ #include "mesonprojectplugin.h" -#include "machinefilemanager.h" #include "mesonactionsmanager.h" #include "mesonbuildconfiguration.h" +#include "mesonbuildsystem.h" #include "mesonproject.h" #include "mesonrunconfiguration.h" #include "mesontoolkitaspect.h"