McuSupport: Store macros as part of McuSdkRepository

To support extending the macros and calling the
McuTargetFactory::expandVariables function statically, the macros are
added as part of the SdkRepository.

This commit also adds helper functions to extend macros other than the
ones created from the packages.

Change-Id: Ie7d2a9ad626782eec18738bdd3472ffd202e7a36
Reviewed-by: Rainer Keller <Rainer.Keller@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Yasser Grimes
2022-10-24 18:50:27 +03:00
parent a08c49b321
commit 7938a8a80f
8 changed files with 90 additions and 24 deletions

View File

@@ -14,4 +14,18 @@ struct McuTargetDescription;
McuTarget::OS deduceOperatingSystem(const McuTargetDescription &); McuTarget::OS deduceOperatingSystem(const McuTargetDescription &);
QString removeRtosSuffix(const QString &environmentVariable); QString removeRtosSuffix(const QString &environmentVariable);
template<typename T>
class asKeyValueRange
{
public:
asKeyValueRange(T &data)
: m_data{data}
{}
auto begin() { return m_data.keyValueBegin(); }
auto end() { return m_data.keyValueEnd(); }
private:
T &m_data;
};
} // namespace McuSupport::Internal } // namespace McuSupport::Internal

View File

@@ -3,6 +3,7 @@
#include "mcusupportoptions.h" #include "mcusupportoptions.h"
#include "mcuhelpers.h"
#include "mcukitmanager.h" #include "mcukitmanager.h"
#include "mcupackage.h" #include "mcupackage.h"
#include "mcusupportconstants.h" #include "mcusupportconstants.h"
@@ -16,16 +17,49 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <debugger/debuggerkitinformation.h> #include <debugger/debuggerkitinformation.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/filepath.h>
#include <qtsupport/qtkitinformation.h> #include <qtsupport/qtkitinformation.h>
#include <qtsupport/qtversionmanager.h> #include <qtsupport/qtversionmanager.h>
#include <QMessageBox> #include <QMessageBox>
#include <QPushButton> #include <QPushButton>
#include <utility>
using namespace Utils; using namespace Utils;
namespace McuSupport::Internal { namespace McuSupport::Internal {
Macros *McuSdkRepository::globalMacros()
{
static Macros macros;
return &macros;
}
void McuSdkRepository::expandVariables()
{
auto macroExpander = getMacroExpander();
for (const auto &package : std::as_const(packages))
package->setPath(macroExpander->expand(package->path()));
}
MacroExpanderPtr McuSdkRepository::getMacroExpander()
{
auto macroExpander = std::make_shared<Utils::MacroExpander>();
//register the macros
for (const auto &package : std::as_const(packages)) {
macroExpander->registerVariable(package->cmakeVariableName().toLocal8Bit(),
package->label(),
[package] { return package->path().toString(); });
}
for (auto [key, macro] : asKeyValueRange(*globalMacros()))
macroExpander->registerVariable(key.toLocal8Bit(), "QtMCUs Macro", macro);
return macroExpander;
}
McuSupportOptions::McuSupportOptions(const SettingsHandler::Ptr &settingsHandler, QObject *parent) McuSupportOptions::McuSupportOptions(const SettingsHandler::Ptr &settingsHandler, QObject *parent)
: QObject(parent) : QObject(parent)
, qtForMCUsSdkPackage(createQtForMCUsPackage(settingsHandler)) , qtForMCUsSdkPackage(createQtForMCUsPackage(settingsHandler))
@@ -93,8 +127,15 @@ bool McuSupportOptions::isLegacyVersion(const QVersionNumber &version)
return version < newVersion; return version < newVersion;
} }
void McuSupportOptions::setQulDir(const FilePath &) void McuSupportOptions::setQulDir(const FilePath &path)
{ {
//register the Qt installation directory containing Qul dir
auto qtPath = (path / "../..").cleanPath();
if (qtPath.exists()) {
McuSdkRepository::globalMacros()->insert("QtDir", [qtPathString = qtPath.path()] {
return qtPathString;
});
}
qtForMCUsSdkPackage->updateStatus(); qtForMCUsSdkPackage->updateStatus();
if (qtForMCUsSdkPackage->isValidStatus()) if (qtForMCUsSdkPackage->isValidStatus())
sdkRepository = targetsAndPackages(qtForMCUsSdkPackage, settingsHandler); sdkRepository = targetsAndPackages(qtForMCUsSdkPackage, settingsHandler);

View File

@@ -8,6 +8,7 @@
#include "settingshandler.h" #include "settingshandler.h"
#include <utils/environmentfwd.h> #include <utils/environmentfwd.h>
#include <utils/macroexpander.h>
#include <QObject> #include <QObject>
#include <QVersionNumber> #include <QVersionNumber>
@@ -30,11 +31,19 @@ namespace Internal {
class McuAbstractPackage; class McuAbstractPackage;
using MacroExpanderPtr = std::shared_ptr<Utils::MacroExpander>;
using Macros = QHash<QString, Utils::MacroExpander::StringFunction>;
class McuSdkRepository final class McuSdkRepository final
{ {
public: public:
Targets mcuTargets; Targets mcuTargets;
Packages packages; Packages packages;
void expandVariables();
MacroExpanderPtr getMacroExpander();
static Macros *globalMacros();
}; };
class McuSupportOptions final : public QObject class McuSupportOptions final : public QObject

View File

@@ -289,7 +289,7 @@ void McuSupportOptionsWidget::apply()
bool pathsChanged = false; bool pathsChanged = false;
m_settingsHandler->setAutomaticKitCreation(m_options.automaticKitCreationEnabled()); m_settingsHandler->setAutomaticKitCreation(m_options.automaticKitCreationEnabled());
McuTargetFactory::expandVariables(m_options.sdkRepository.packages); m_options.sdkRepository.expandVariables();
QMessageBox warningPopup(QMessageBox::Icon::Warning, QMessageBox warningPopup(QMessageBox::Icon::Warning,
Tr::tr("Warning"), Tr::tr("Warning"),

View File

@@ -591,7 +591,11 @@ McuSdkRepository targetsFromDescriptions(const QList<McuTargetDescription> &desc
mcuPackages.insert(package); mcuPackages.insert(package);
} }
} }
return McuSdkRepository{mcuTargets, mcuPackages};
McuSdkRepository repo{mcuTargets, mcuPackages};
repo.expandVariables();
return repo;
} }
FilePath kitsPath(const FilePath &qtMcuSdkPath) FilePath kitsPath(const FilePath &qtMcuSdkPath)

View File

@@ -4,6 +4,7 @@
#include "mcutargetfactory.h" #include "mcutargetfactory.h"
#include "mcuhelpers.h" #include "mcuhelpers.h"
#include "mcupackage.h" #include "mcupackage.h"
#include "mcusupport_global.h"
#include "mcusupportplugin.h" #include "mcusupportplugin.h"
#include "mcusupportversiondetection.h" #include "mcusupportversiondetection.h"
#include "mcutarget.h" #include "mcutarget.h"
@@ -56,18 +57,6 @@ static void removeEmptyPackages(Packages &packages)
} }
} }
void McuTargetFactory::expandVariables(Packages &packages)
{
Utils::MacroExpander macroExpander;
for (const auto &package : packages) {
macroExpander.registerVariable(package->cmakeVariableName().toLocal8Bit(),
package->label(),
[package] { return package->path().toString(); });
}
for (const auto &package : packages)
package->setPath(macroExpander.expand(package->path()));
}
McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler) McuTargetFactory::McuTargetFactory(const SettingsHandler::Ptr &settingsHandler)
: settingsHandler{settingsHandler} : settingsHandler{settingsHandler}
{} {}
@@ -94,7 +83,6 @@ QPair<Targets, Packages> McuTargetFactory::createTargets(const McuTargetDescript
targetPackages.unite({toolchainFile}); targetPackages.unite({toolchainFile});
removeEmptyPackages(targetPackages); removeEmptyPackages(targetPackages);
expandVariables(targetPackages);
packages.unite(targetPackages); packages.unite(targetPackages);

View File

@@ -22,7 +22,6 @@ public:
Packages createPackages(const McuTargetDescription &); Packages createPackages(const McuTargetDescription &);
McuToolChainPackage *createToolchain(const McuTargetDescription::Toolchain &, const Utils::FilePath &sourceFile = Utils::FilePath()); McuToolChainPackage *createToolchain(const McuTargetDescription::Toolchain &, const Utils::FilePath &sourceFile = Utils::FilePath());
McuPackagePtr createPackage(const PackageDescription &); McuPackagePtr createPackage(const PackageDescription &);
static void expandVariables(Packages &packages);
private: private:
SettingsHandler::Ptr settingsHandler; SettingsHandler::Ptr settingsHandler;

View File

@@ -196,6 +196,11 @@ const McuTargetDescription::Platform platformDescription{id,
const Id cxxLanguageId{ProjectExplorer::Constants::CXX_LANGUAGE_ID}; const Id cxxLanguageId{ProjectExplorer::Constants::CXX_LANGUAGE_ID};
} // namespace } // namespace
//Expand variables in a tested {targets, packages} pair
auto expandTargetsAndPackages = [](Targets &targets, Packages &packages) {
McuSdkRepository{targets, packages}.expandVariables();
};
void verifyIarToolchain(const McuToolChainPackagePtr &iarToolchainPackage) void verifyIarToolchain(const McuToolChainPackagePtr &iarToolchainPackage)
{ {
ProjectExplorer::ToolChainFactory toolchainFactory; ProjectExplorer::ToolChainFactory toolchainFactory;
@@ -676,7 +681,7 @@ void McuSupportTest::test_legacy_createPackagesWithCorrespondingSettings()
{ {
QFETCH(QString, json); QFETCH(QString, json);
const McuTargetDescription description = parseDescriptionJson(json.toLocal8Bit()); const McuTargetDescription description = parseDescriptionJson(json.toLocal8Bit());
const auto [targets, packages]{ auto [targets, packages]{
targetsFromDescriptions({description}, settingsMockPtr, sdkPackagePtr, runLegacy)}; targetsFromDescriptions({description}, settingsMockPtr, sdkPackagePtr, runLegacy)};
Q_UNUSED(targets); Q_UNUSED(targets);
@@ -701,7 +706,8 @@ void McuSupportTest::test_createTargets()
true}; true};
targetDescription.toolchain.id = armGcc; targetDescription.toolchain.id = armGcc;
const auto [targets, packages]{targetFactory.createTargets(targetDescription, sdkPackagePtr)}; auto [targets, packages]{targetFactory.createTargets(targetDescription, sdkPackagePtr)};
expandTargetsAndPackages(targets, packages);
QCOMPARE(targets.size(), 1); QCOMPARE(targets.size(), 1);
const McuTargetPtr target{targets.at(0)}; const McuTargetPtr target{targets.at(0)};
@@ -1154,7 +1160,8 @@ void McuSupportTest::test_createFreeRtosPackage()
EXPECT_CALL(*settingsMockPtr, getPath(targetDescription.boardSdk.envVar, _, _)) EXPECT_CALL(*settingsMockPtr, getPath(targetDescription.boardSdk.envVar, _, _))
.WillRepeatedly(Return(FilePath::fromString(boardSdkDir))); .WillRepeatedly(Return(FilePath::fromString(boardSdkDir)));
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); auto [targets, packages]{targetFactory.createTargets(targetDescription, sdkPackagePtr)};
expandTargetsAndPackages(targets, packages);
auto freeRtos = findOrDefault(packages, [](const McuPackagePtr &pkg) { auto freeRtos = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return (pkg->cmakeVariableName() == freeRtosCMakeVar); return (pkg->cmakeVariableName() == freeRtosCMakeVar);
@@ -1379,7 +1386,8 @@ void McuSupportTest::test_resolveEnvironmentVariablesInDefaultPath()
toochainFileDescription.defaultPath = FilePath::fromUserInput(toolchainFileDefaultPath); toochainFileDescription.defaultPath = FilePath::fromUserInput(toolchainFileDefaultPath);
targetDescription.toolchain.file = toochainFileDescription; targetDescription.toolchain.file = toochainFileDescription;
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); auto [targets, packages]{targetFactory.createTargets(targetDescription, sdkPackagePtr)};
expandTargetsAndPackages(targets, packages);
auto qtForMCUPkg = findOrDefault(packages, [](const McuPackagePtr &pkg) { auto qtForMCUPkg = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return pkg->environmentVariableName() == QUL_ENV_VAR; return pkg->environmentVariableName() == QUL_ENV_VAR;
}); });
@@ -1413,7 +1421,8 @@ void McuSupportTest::test_resolveCmakeVariablesInDefaultPath()
toochainFileDescription.defaultPath = FilePath::fromUserInput(toolchainFileDefaultPath); toochainFileDescription.defaultPath = FilePath::fromUserInput(toolchainFileDefaultPath);
targetDescription.toolchain.file = toochainFileDescription; targetDescription.toolchain.file = toochainFileDescription;
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); auto [targets, packages]{targetFactory.createTargets(targetDescription, sdkPackagePtr)};
expandTargetsAndPackages(targets, packages);
auto qtForMCUPkg = findOrDefault(packages, [](const McuPackagePtr &pkg) { auto qtForMCUPkg = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return pkg->cmakeVariableName() == QUL_CMAKE_VAR; return pkg->cmakeVariableName() == QUL_CMAKE_VAR;
}); });
@@ -1541,6 +1550,7 @@ void McuSupportTest::test_createThirdPartyPackage()
.WillOnce(Return(FilePath::fromUserInput(path))); .WillOnce(Return(FilePath::fromUserInput(path)));
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr);
expandTargetsAndPackages(targets, packages);
auto thirdPartyPackage = findOrDefault(packages, [&setting](const McuPackagePtr &pkg) { auto thirdPartyPackage = findOrDefault(packages, [&setting](const McuPackagePtr &pkg) {
return (pkg->settingsKey() == setting); return (pkg->settingsKey() == setting);
@@ -1588,6 +1598,7 @@ void McuSupportTest::test_createJLink3rdPartyPackage()
.WillOnce(Return(FilePath::fromUserInput(jlinkPath))); .WillOnce(Return(FilePath::fromUserInput(jlinkPath)));
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr);
expandTargetsAndPackages(targets, packages);
auto thirdPartyPackage = findOrDefault(packages, [](const McuPackagePtr &pkg) { auto thirdPartyPackage = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return (pkg->settingsKey() == jlinkSetting); return (pkg->settingsKey() == jlinkSetting);
@@ -1653,7 +1664,6 @@ void McuSupportTest::test_nonemptyVersionDetector()
// pkgDesc.versionDetection.xmlElement left empty // pkgDesc.versionDetection.xmlElement left empty
// pkgDesc.versionDetection.xmlAttribute left empty // pkgDesc.versionDetection.xmlAttribute left empty
pkgDesc.shouldAddToSystemPath = false; pkgDesc.shouldAddToSystemPath = false;
const auto package = targetFactory.createPackage(pkgDesc); const auto package = targetFactory.createPackage(pkgDesc);
QVERIFY(package->getVersionDetector() != nullptr); QVERIFY(package->getVersionDetector() != nullptr);
QCOMPARE(typeid(*package->getVersionDetector()).name(), QCOMPARE(typeid(*package->getVersionDetector()).name(),
@@ -1686,7 +1696,8 @@ void McuSupportTest::test_emptyVersionDetector()
void McuSupportTest::test_emptyVersionDetectorFromJson() void McuSupportTest::test_emptyVersionDetectorFromJson()
{ {
const auto targetDescription = parseDescriptionJson(armgcc_mimxrt1050_evk_freertos_json); const auto targetDescription = parseDescriptionJson(armgcc_mimxrt1050_evk_freertos_json);
auto [targets, packages] = targetFactory.createTargets(targetDescription, sdkPackagePtr); auto [targets, packages]{targetFactory.createTargets(targetDescription, sdkPackagePtr)};
expandTargetsAndPackages(targets, packages);
auto freeRtos = findOrDefault(packages, [](const McuPackagePtr &pkg) { auto freeRtos = findOrDefault(packages, [](const McuPackagePtr &pkg) {
return (pkg->cmakeVariableName() == freeRtosCMakeVar); return (pkg->cmakeVariableName() == freeRtosCMakeVar);