diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2019-07-23 15:45:29 +0300 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2019-07-31 13:12:01 +0000 |
commit | 86747ff36bb162764fd8c2f741a1674d16b0b3cd (patch) | |
tree | ebc9323f57c601ae49af9cff9fe0674fd71bb6ca | |
parent | 2363f13f8fbd001a3544acb2a600010893e4cf80 (diff) |
baremetal: Share common generators code
Common code which are used for the 'iarew' and 'keiluv'
generators was moved to the corelib/generators library.
Besides, this code also can be used in future for the
XML-based generators.
Change-Id: I79a21e3e078d563600d7f365785731fe9e847045
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
106 files changed, 1885 insertions, 1740 deletions
diff --git a/src/lib/corelib/corelib.qbs b/src/lib/corelib/corelib.qbs index a9ca5131a..92d7eb052 100644 --- a/src/lib/corelib/corelib.qbs +++ b/src/lib/corelib/corelib.qbs @@ -198,7 +198,24 @@ QbsLibrary { "generatableprojectiterator.h", "generator.cpp", "generatordata.cpp", + "generatorutils.cpp", + "generatorutils.h", + "generatorversioninfo.cpp", + "generatorversioninfo.h", "igeneratableprojectvisitor.h", + "ixmlnodevisitor.h", + "xmlproject.cpp", + "xmlproject.h", + "xmlprojectwriter.cpp", + "xmlprojectwriter.h", + "xmlproperty.cpp", + "xmlproperty.h", + "xmlpropertygroup.cpp", + "xmlpropertygroup.h", + "xmlworkspace.cpp", + "xmlworkspace.h", + "xmlworkspacewriter.cpp", + "xmlworkspacewriter.h", ] } Group { diff --git a/src/lib/corelib/generators/generators.pri b/src/lib/corelib/generators/generators.pri index 093e45f40..e9730d895 100644 --- a/src/lib/corelib/generators/generators.pri +++ b/src/lib/corelib/generators/generators.pri @@ -3,13 +3,31 @@ include(../../../install_prefix.pri) SOURCES += \ $$PWD/generatableprojectiterator.cpp \ $$PWD/generator.cpp \ - $$PWD/generatordata.cpp + $$PWD/generatordata.cpp \ + $$PWD/generatorutils.cpp \ + $$PWD/generatorversioninfo.cpp \ + $$PWD/xmlproject.cpp \ + $$PWD/xmlprojectwriter.cpp\ + $$PWD/xmlproperty.cpp \ + $$PWD/xmlpropertygroup.cpp \ + $$PWD/xmlworkspace.cpp \ + $$PWD/xmlworkspacewriter.cpp HEADERS += \ $$PWD/generatableprojectiterator.h \ $$PWD/generator.h \ $$PWD/generatordata.h \ - $$PWD/igeneratableprojectvisitor.h + $$PWD/generatorutils.h \ + $$PWD/generatorversioninfo.h \ + $$PWD/igeneratableprojectvisitor.h \ + $$PWD/ixmlnodevisitor.h \ + $$PWD/ixmlnodevisitor.h \ + $$PWD/xmlproject.h \ + $$PWD/xmlprojectwriter.h \ + $$PWD/xmlproperty.h \ + $$PWD/xmlpropertygroup.h \ + $$PWD/xmlworkspace.h \ + $$PWD/xmlworkspacewriter.h !qbs_no_dev_install { generators_headers.files = \ diff --git a/src/lib/corelib/generators/generatorutils.cpp b/src/lib/corelib/generators/generatorutils.cpp new file mode 100644 index 000000000..4f76eab7f --- /dev/null +++ b/src/lib/corelib/generators/generatorutils.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: http://www.qt.io/licensing +** +** This file is part of Qbs. +** +** 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 http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "generatorutils.h" + +namespace qbs { +namespace gen { +namespace utils { + +QString architectureName(Architecture arch) +{ + switch (arch) { + case Architecture::Arm: + return QStringLiteral("arm"); + case Architecture::Avr: + return QStringLiteral("avr"); + case Architecture::Mcs51: + return QStringLiteral("mcs51"); + default: + return QStringLiteral("unknown"); + } +} + +Architecture architecture(const Project &qbsProject) +{ + const auto qbsArch = qbsProject.projectConfiguration() + .value(Internal::StringConstants::qbsModule()).toMap() + .value(QStringLiteral("architecture")).toString(); + + if (qbsArch == QLatin1String("arm")) + return Architecture::Arm; + if (qbsArch == QLatin1String("avr")) + return Architecture::Avr; + if (qbsArch == QLatin1String("mcs51")) + return Architecture::Mcs51; + return Architecture::Unknown; +} + +QString buildConfigurationName(const Project &qbsProject) +{ + return qbsProject.projectConfiguration() + .value(Internal::StringConstants::qbsModule()).toMap() + .value(QStringLiteral("configurationName")).toString(); +} + +int debugInformation(const ProductData &qbsProduct) +{ + return qbsProduct.moduleProperties().getModuleProperty( + Internal::StringConstants::qbsModule(), + QStringLiteral("debugInformation")) + .toInt(); +} + +QString buildRootPath(const Project &qbsProject) +{ + QDir dir(qbsProject.projectData().buildDirectory()); + dir.cdUp(); + return dir.absolutePath(); +} + +QString relativeFilePath(const QString &baseDirectory, + const QString &fullFilePath) +{ + return QDir(baseDirectory).relativeFilePath(fullFilePath); +} + +QString binaryOutputDirectory(const QString &baseDirectory, + const ProductData &qbsProduct) +{ + return QDir(baseDirectory).relativeFilePath( + qbsProduct.buildDirectory()) + + QLatin1String("/bin"); +} + +QString objectsOutputDirectory(const QString &baseDirectory, + const ProductData &qbsProduct) +{ + return QDir(baseDirectory).relativeFilePath( + qbsProduct.buildDirectory()) + + QLatin1String("/obj"); +} + +QString listingOutputDirectory(const QString &baseDirectory, + const ProductData &qbsProduct) +{ + return QDir(baseDirectory).relativeFilePath( + qbsProduct.buildDirectory()) + + QLatin1String("/lst"); +} + +std::vector<ProductData> dependenciesOf(const ProductData &qbsProduct, + const GeneratableProject &genProject, + const QString &configurationName) +{ + std::vector<ProductData> result; + const auto depsNames = qbsProduct.dependencies(); + for (const auto &product : qAsConst(genProject.products)) { + const auto pt = product.type(); + if (!pt.contains(QLatin1String("staticlibrary"))) + continue; + const auto pn = product.name(); + if (!depsNames.contains(pn)) + continue; + result.push_back(product.data.value(configurationName)); + } + return result; +} + +QString targetBinary(const ProductData &qbsProduct) +{ + const auto type = qbsProduct.type(); + if (type.contains(QLatin1String("application"))) { + return QFileInfo(qbsProduct.targetExecutable()).fileName(); + } else if (type.contains(QLatin1String("staticlibrary"))) { + const auto artifacts = qbsProduct.targetArtifacts(); + for (const auto &artifact : artifacts) { + if (artifact.fileTags().contains(QLatin1String("staticlibrary"))) + return QFileInfo(artifact.filePath()).fileName(); + } + } + + return {}; +} + +QString targetBinaryPath(const QString &baseDirectory, + const ProductData &qbsProduct) +{ + return binaryOutputDirectory(baseDirectory, qbsProduct) + + QLatin1Char('/') + targetBinary(qbsProduct); +} + +QString cppStringModuleProperty(const PropertyMap &qbsProps, + const QString &propertyName) +{ + return qbsProps.getModuleProperty( + Internal::StringConstants::cppModule(), + propertyName).toString().trimmed(); +} + +bool cppBooleanModuleProperty(const PropertyMap &qbsProps, + const QString &propertyName) +{ + return qbsProps.getModuleProperty( + Internal::StringConstants::cppModule(), + propertyName).toBool(); +} + +int cppIntegerModuleProperty(const PropertyMap &qbsProps, + const QString &propertyName) +{ + return qbsProps.getModuleProperty( + Internal::StringConstants::cppModule(), + propertyName).toInt(); +} + +QStringList cppStringModuleProperties(const PropertyMap &qbsProps, + const QStringList &propertyNames) +{ + QStringList properties; + for (const auto &propertyName : propertyNames) { + const auto entries = qbsProps.getModuleProperty( + Internal::StringConstants::cppModule(), + propertyName).toStringList(); + for (const auto &entry : entries) + properties.push_back(entry.trimmed()); + } + return properties; +} + +QVariantList cppVariantModuleProperties(const PropertyMap &qbsProps, + const QStringList &propertyNames) +{ + QVariantList properties; + for (const auto &propertyName : propertyNames) { + properties << qbsProps.getModuleProperty( + Internal::StringConstants::cppModule(), + propertyName).toList(); + } + return properties; +} + +} // namespace utils +} // namespace gen +} // namespace qbs diff --git a/src/lib/corelib/generators/generatorutils.h b/src/lib/corelib/generators/generatorutils.h new file mode 100644 index 000000000..e13740105 --- /dev/null +++ b/src/lib/corelib/generators/generatorutils.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: http://www.qt.io/licensing +** +** This file is part of Qbs. +** +** 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 http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef GENERATORS_UTILS_H +#define GENERATORS_UTILS_H + +#include <qbs.h> + +#include <tools/qbs_export.h> +#include <tools/stringconstants.h> + +namespace qbs { +namespace gen { +namespace utils { + +enum class Architecture { + Arm, + Avr, + Mcs51, + Unknown +}; + +QBS_EXPORT QString architectureName(Architecture arch); +QBS_EXPORT Architecture architecture(const Project &qbsProject); +QBS_EXPORT QString buildConfigurationName(const Project &qbsProject); +QBS_EXPORT int debugInformation(const ProductData &qbsProduct); +QBS_EXPORT QString buildRootPath(const Project &qbsProject); +QBS_EXPORT QString relativeFilePath(const QString &baseDirectory, + const QString &fullFilePath); +QBS_EXPORT QString binaryOutputDirectory(const QString &baseDirectory, + const ProductData &qbsProduct); +QBS_EXPORT QString objectsOutputDirectory(const QString &baseDirectory, + const ProductData &qbsProduct); +QBS_EXPORT QString listingOutputDirectory(const QString &baseDirectory, + const ProductData &qbsProduct); +QBS_EXPORT std::vector<ProductData> dependenciesOf(const ProductData &qbsProduct, + const GeneratableProject &genProject, + const QString &configurationName); +QBS_EXPORT QString targetBinary(const ProductData &qbsProduct); +QBS_EXPORT QString targetBinaryPath(const QString &baseDirectory, + const ProductData &qbsProduct); +QBS_EXPORT QString cppStringModuleProperty(const PropertyMap &qbsProps, + const QString &propertyName); +QBS_EXPORT bool cppBooleanModuleProperty(const PropertyMap &qbsProps, + const QString &propertyName); +QBS_EXPORT int cppIntegerModuleProperty(const PropertyMap &qbsProps, + const QString &propertyName); +QBS_EXPORT QStringList cppStringModuleProperties(const PropertyMap &qbsProps, + const QStringList &propertyNames); +QBS_EXPORT QVariantList cppVariantModuleProperties(const PropertyMap &qbsProps, + const QStringList &propertyNames); + +template <typename T> +bool inBounds(const T &value, const T &low, const T &high) +{ + return !(value < low) && !(high < value); +} + +} // namespace utils +} // namespace gen +} // namespace qbs + +#endif // GENERATORS_UTILS_H diff --git a/src/lib/corelib/generators/generatorversioninfo.cpp b/src/lib/corelib/generators/generatorversioninfo.cpp new file mode 100644 index 000000000..3e2106b57 --- /dev/null +++ b/src/lib/corelib/generators/generatorversioninfo.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qbs. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "generatorversioninfo.h" + +namespace qbs { +namespace gen { + +VersionInfo::VersionInfo(const Version &version, + const std::set<utils::Architecture> &archs) + : m_version(version), m_archs(archs) +{ +} + +bool VersionInfo::operator<(const VersionInfo &other) const +{ + return m_version < other.m_version; +} + +bool VersionInfo::operator==(const VersionInfo &other) const +{ + return m_version == other.m_version + && m_archs == other.m_archs; +} + +Version VersionInfo::version() const +{ + return m_version; +} + +bool VersionInfo::containsArchitecture(utils::Architecture arch) const +{ + return m_archs.find(arch) != m_archs.cend(); +} + +int VersionInfo::marketingVersion() const +{ + return m_version.majorVersion(); +} + +quint32 qHash(const VersionInfo &info) +{ + return qHash(info.version().toString()); +} + +} // namespace gen +} // namespace qbs diff --git a/src/lib/corelib/generators/generatorversioninfo.h b/src/lib/corelib/generators/generatorversioninfo.h new file mode 100644 index 000000000..65bfcf685 --- /dev/null +++ b/src/lib/corelib/generators/generatorversioninfo.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qbs. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef GENERATORS_VERSION_INFO_H +#define GENERATORS_VERSION_INFO_H + +#include "generatorutils.h" + +#include <tools/qbs_export.h> +#include <tools/version.h> + +#include <set> + +namespace qbs { +namespace gen { + +class QBS_EXPORT VersionInfo +{ +public: + VersionInfo(const Version &version, + const std::set<utils::Architecture> &archs); + virtual ~VersionInfo() = default; + + bool operator<(const VersionInfo &other) const; + bool operator==(const VersionInfo &other) const; + + Version version() const; + bool containsArchitecture(utils::Architecture arch) const; + + virtual int marketingVersion() const; + +private: + Version m_version; + std::set<utils::Architecture> m_archs; +}; + +quint32 qHash(const VersionInfo &info); + +} // namespace gen +} // namespace qbs + +#endif // GENERATORS_VERSION_INFO_H diff --git a/src/plugins/generator/keiluv/ikeiluvnodevisitor.h b/src/lib/corelib/generators/ixmlnodevisitor.h index 8ba14d11f..6d62c86ed 100644 --- a/src/plugins/generator/keiluv/ikeiluvnodevisitor.h +++ b/src/lib/corelib/generators/ixmlnodevisitor.h @@ -28,38 +28,42 @@ ** ****************************************************************************/ -#ifndef QBS_IKEILUVNODEVISITOR_H -#define QBS_IKEILUVNODEVISITOR_H +#ifndef GENERATORS_XML_INODE_VISITOR_H +#define GENERATORS_XML_INODE_VISITOR_H -#include <QtCore/qxmlstream.h> +#include <tools/qbs_export.h> -#include <memory> +#include <QtCore/qxmlstream.h> namespace qbs { +namespace gen { +namespace xml { -class KeiluvProject; -class KeiluvProperty; -class KeiluvPropertyGroup; -class KeiluvWorkspace; +class Project; +class Property; +class PropertyGroup; +class Workspace; -class IKeiluvNodeVisitor +class QBS_EXPORT INodeVisitor { public: - virtual ~IKeiluvNodeVisitor() {} + virtual ~INodeVisitor() {} - virtual void visitStart(const KeiluvWorkspace *workspace) { Q_UNUSED(workspace) } - virtual void visitEnd(const KeiluvWorkspace *workspace) { Q_UNUSED(workspace) } + virtual void visitStart(const Workspace *workspace) { Q_UNUSED(workspace) } + virtual void visitEnd(const Workspace *workspace) { Q_UNUSED(workspace) } - virtual void visitStart(const KeiluvProject *project) { Q_UNUSED(project) } - virtual void visitEnd(const KeiluvProject *project) { Q_UNUSED(project) } + virtual void visitStart(const Project *project) { Q_UNUSED(project) } + virtual void visitEnd(const Project *project) { Q_UNUSED(project) } - virtual void visitStart(const KeiluvProperty *property) = 0; - virtual void visitEnd(const KeiluvProperty *property) = 0; + virtual void visitStart(const Property *property) = 0; + virtual void visitEnd(const Property *property) = 0; - virtual void visitStart(const KeiluvPropertyGroup *propertyGroup) = 0; - virtual void visitEnd(const KeiluvPropertyGroup *propertyGroup) = 0; + virtual void visitStart(const PropertyGroup *propertyGroup) = 0; + virtual void visitEnd(const PropertyGroup *propertyGroup) = 0; }; +} // namespace xml +} // namespace gen } // namespace qbs -#endif // QBS_IKEILUVNODEVISITOR_H +#endif // GENERATORS_XML_INODE_VISITOR_H diff --git a/src/plugins/generator/keiluv/keiluvproperty.cpp b/src/lib/corelib/generators/xmlproject.cpp index 057ebe1f6..becd31dda 100644 --- a/src/plugins/generator/keiluv/keiluvproperty.cpp +++ b/src/lib/corelib/generators/xmlproject.cpp @@ -28,18 +28,14 @@ ** ****************************************************************************/ -#include "ikeiluvnodevisitor.h" -#include "keiluvproperty.h" +#include "xmlproject.h" +#include "ixmlnodevisitor.h" namespace qbs { +namespace gen { +namespace xml { -KeiluvProperty::KeiluvProperty(QByteArray name, QVariant value) -{ - setName(std::move(name)); - setValue(std::move(value)); -} - -void KeiluvProperty::accept(IKeiluvNodeVisitor *visitor) const +void Project::accept(INodeVisitor *visitor) const { visitor->visitStart(this); @@ -49,4 +45,6 @@ void KeiluvProperty::accept(IKeiluvNodeVisitor *visitor) const visitor->visitEnd(this); } +} // namespace xml +} // namespace gen } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewpropertygroup.cpp b/src/lib/corelib/generators/xmlproject.h index 89d0f078c..a7f5b2b65 100644 --- a/src/plugins/generator/iarew/iarewpropertygroup.cpp +++ b/src/lib/corelib/generators/xmlproject.h @@ -28,30 +28,27 @@ ** ****************************************************************************/ -#include "iarewproperty.h" -#include "iarewpropertygroup.h" -#include "iiarewnodevisitor.h" +#ifndef GENERATORS_XML_PROJECT_H +#define GENERATORS_XML_PROJECT_H -namespace qbs { - -IarewPropertyGroup::IarewPropertyGroup(QByteArray name) -{ - setName(std::move(name)); -} +#include "xmlproperty.h" -void IarewPropertyGroup::appendProperty(QByteArray name, QVariant value) -{ - appendChild<IarewProperty>(std::move(name), std::move(value)); -} +#include <tools/qbs_export.h> -void IarewPropertyGroup::accept(IIarewNodeVisitor *visitor) const -{ - visitor->visitStart(this); +#include <memory> - for (const auto &child : children()) - child->accept(visitor); +namespace qbs { +namespace gen { +namespace xml { - visitor->visitEnd(this); -} +class QBS_EXPORT Project : public Property +{ +public: + void accept(INodeVisitor *visitor) const final; +}; +} // namespace xml +} // namespace gen } // namespace qbs + +#endif // GENERATORS_XML_PROJECT_H diff --git a/src/plugins/generator/iarew/iarewproperty.h b/src/lib/corelib/generators/xmlprojectwriter.cpp index d9c30a7f4..5b96564bd 100644 --- a/src/plugins/generator/iarew/iarewproperty.h +++ b/src/lib/corelib/generators/xmlprojectwriter.cpp @@ -28,55 +28,65 @@ ** ****************************************************************************/ -#ifndef QBS_IAREWPROPERTY_H -#define QBS_IAREWPROPERTY_H +#include "xmlproject.h" +#include "xmlprojectwriter.h" +#include "xmlproperty.h" +#include "xmlpropertygroup.h" -#include <QtCore/qvariant.h> - -#include <memory> +#include <ostream> namespace qbs { +namespace gen { +namespace xml { -class IIarewNodeVisitor; - -class IarewProperty +ProjectWriter::ProjectWriter(std::ostream *device) + : m_device(device) { - Q_DISABLE_COPY(IarewProperty) -public: - IarewProperty() = default; - explicit IarewProperty(QByteArray name, QVariant value); - virtual ~IarewProperty() = default; - - QByteArray name() const { return m_name; } - void setName(QByteArray name) { m_name = std::move(name); } + m_writer.reset(new QXmlStreamWriter(&m_buffer)); + m_writer->setAutoFormatting(true); +} - QVariant value() const { return m_value; } - void setValue(QVariant value) { m_value = std::move(value); } +bool ProjectWriter::write(const Project *project) +{ + m_buffer.clear(); + m_writer->writeStartDocument(); + project->accept(this); + m_writer->writeEndDocument(); + if (m_writer->hasError()) + return false; + m_device->write(&*std::begin(m_buffer), m_buffer.size()); + return m_device->good(); +} - template<class T> - T *appendChild(std::unique_ptr<T> child) { - const auto p = child.get(); - m_children.push_back(std::move(child)); - return p; - } +void ProjectWriter::visitStart(const Property *property) +{ + const auto value = property->value().toString(); + const auto name = QString::fromUtf8(property->name()); + m_writer->writeTextElement(name, value); +} - template<class T, class... Args> - T *appendChild(Args&&... args) { - return appendChild(std::make_unique<T>(std::forward<Args>(args)...)); - } +void ProjectWriter::visitEnd(const Property *property) +{ + Q_UNUSED(property) +} - virtual void accept(IIarewNodeVisitor *visitor) const; +void ProjectWriter::visitStart(const PropertyGroup *propertyGroup) +{ + const auto name = QString::fromUtf8(propertyGroup->name()); + m_writer->writeStartElement(name); +} -protected: - const std::vector<std::unique_ptr<IarewProperty>> &children() const - { return m_children; } +void ProjectWriter::visitEnd(const PropertyGroup *propertyGroup) +{ + Q_UNUSED(propertyGroup) + m_writer->writeEndElement(); +} -private: - QByteArray m_name; - QVariant m_value; - std::vector<std::unique_ptr<IarewProperty>> m_children; -}; +QXmlStreamWriter *ProjectWriter::writer() const +{ + return m_writer.get(); +} +} // namespace xml +} // namespace gen } // namespace qbs - -#endif // QBS_IAREWPROPERTY_H diff --git a/src/plugins/generator/iarew/iarewpropertygroup.h b/src/lib/corelib/generators/xmlprojectwriter.h index 3f2bd2718..da4100a92 100644 --- a/src/plugins/generator/iarew/iarewpropertygroup.h +++ b/src/lib/corelib/generators/xmlprojectwriter.h @@ -28,42 +28,43 @@ ** ****************************************************************************/ -#ifndef QBS_IAREWPROPERTYGROUP_H -#define QBS_IAREWPROPERTYGROUP_H +#ifndef GENERATORS_XML_PROJECT_WRITER_H +#define GENERATORS_XML_PROJECT_WRITER_H -#include "iarewproperty.h" -#include "iarewversioninfo.h" +#include "ixmlnodevisitor.h" + +#include <tools/qbs_export.h> #include <memory> namespace qbs { +namespace gen { +namespace xml { -class ProductData; -class Project; - -class IarewPropertyGroup : public IarewProperty +class QBS_EXPORT ProjectWriter : public INodeVisitor { + Q_DISABLE_COPY(ProjectWriter) public: - explicit IarewPropertyGroup(QByteArray name); + explicit ProjectWriter(std::ostream *device); + bool write(const Project *project); - void appendProperty(QByteArray name, QVariant value); +protected: + QXmlStreamWriter *writer() const; - void accept(IIarewNodeVisitor *visitor) const final; -}; +private: + void visitStart(const Property *property) final; + void visitEnd(const Property *property) final; -class IarewPropertyGroupFactory -{ -public: - virtual ~IarewPropertyGroupFactory() = default; - virtual bool canCreate(IarewUtils::Architecture architecture, - const Version &version) const = 0; + void visitStart(const PropertyGroup *propertyGroup) final; + void visitEnd(const PropertyGroup *propertyGroup) final; - virtual std::unique_ptr<IarewPropertyGroup> create( - const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps) const = 0; + std::ostream *m_device = nullptr; + QByteArray m_buffer; + std::unique_ptr<QXmlStreamWriter> m_writer; }; +} // namespace xml +} // namespace gen } // namespace qbs -#endif // QBS_IAREWPROPERTYGROUP_H +#endif // GENERATORS_XML_PROJECT_WRITER_H diff --git a/src/plugins/generator/iarew/iarewproperty.cpp b/src/lib/corelib/generators/xmlproperty.cpp index 9eb043c88..ae41eab4a 100644 --- a/src/plugins/generator/iarew/iarewproperty.cpp +++ b/src/lib/corelib/generators/xmlproperty.cpp @@ -28,18 +28,20 @@ ** ****************************************************************************/ -#include "iarewproperty.h" -#include "iiarewnodevisitor.h" +#include "ixmlnodevisitor.h" +#include "xmlproperty.h" namespace qbs { +namespace gen { +namespace xml { -IarewProperty::IarewProperty(QByteArray name, QVariant value) +Property::Property(QByteArray name, QVariant value) { setName(std::move(name)); setValue(std::move(value)); } -void IarewProperty::accept(IIarewNodeVisitor *visitor) const +void Property::accept(INodeVisitor *visitor) const { visitor->visitStart(this); @@ -49,4 +51,6 @@ void IarewProperty::accept(IIarewNodeVisitor *visitor) const visitor->visitEnd(this); } +} // namespace xml +} // namespace gen } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvproperty.h b/src/lib/corelib/generators/xmlproperty.h index a385c1314..795735881 100644 --- a/src/plugins/generator/keiluv/keiluvproperty.h +++ b/src/lib/corelib/generators/xmlproperty.h @@ -28,24 +28,28 @@ ** ****************************************************************************/ -#ifndef QBS_KEILUVPROPERTY_H -#define QBS_KEILUVPROPERTY_H +#ifndef GENERATORS_XML_PROPERTY_H +#define GENERATORS_XML_PROPERTY_H + +#include <tools/qbs_export.h> #include <QtCore/qvariant.h> #include <memory> namespace qbs { +namespace gen { +namespace xml { -class IKeiluvNodeVisitor; +class INodeVisitor; -class KeiluvProperty +class QBS_EXPORT Property { - Q_DISABLE_COPY(KeiluvProperty) + Q_DISABLE_COPY(Property) public: - KeiluvProperty() = default; - explicit KeiluvProperty(QByteArray name, QVariant value); - virtual ~KeiluvProperty() = default; + Property() = default; + explicit Property(QByteArray name, QVariant value); + virtual ~Property() = default; QByteArray name() const { return m_name; } void setName(QByteArray name) { m_name = std::move(name); } @@ -65,18 +69,20 @@ public: return appendChild(std::make_unique<T>(std::forward<Args>(args)...)); } - virtual void accept(IKeiluvNodeVisitor *visitor) const; + virtual void accept(INodeVisitor *visitor) const; protected: - const std::vector<std::unique_ptr<KeiluvProperty>> &children() const + const std::vector<std::unique_ptr<Property>> &children() const { return m_children; } private: QByteArray m_name; QVariant m_value; - std::vector<std::unique_ptr<KeiluvProperty>> m_children; + std::vector<std::unique_ptr<Property>> m_children; }; +} // namespace xml +} // namespace gen } // namespace qbs -#endif // QBS_KEILUVPROPERTY_H +#endif // GENERATORS_XML_PROPERTY_H diff --git a/src/plugins/generator/keiluv/keiluvpropertygroup.cpp b/src/lib/corelib/generators/xmlpropertygroup.cpp index 9aeaa576d..2111b9b1e 100644 --- a/src/plugins/generator/keiluv/keiluvpropertygroup.cpp +++ b/src/lib/corelib/generators/xmlpropertygroup.cpp @@ -28,30 +28,31 @@ ** ****************************************************************************/ -#include "ikeiluvnodevisitor.h" -#include "keiluvproperty.h" -#include "keiluvpropertygroup.h" +#include "ixmlnodevisitor.h" +#include "xmlpropertygroup.h" namespace qbs { +namespace gen { +namespace xml { -KeiluvPropertyGroup::KeiluvPropertyGroup(QByteArray name) +PropertyGroup::PropertyGroup(QByteArray name) { setName(std::move(name)); } -void KeiluvPropertyGroup::appendProperty(QByteArray name, QVariant value) +void PropertyGroup::appendProperty(QByteArray name, QVariant value) { - appendChild<KeiluvProperty>(std::move(name), std::move(value)); + appendChild<Property>(std::move(name), std::move(value)); } -void KeiluvPropertyGroup::appendMultiLineProperty( +void PropertyGroup::appendMultiLineProperty( QByteArray key, QStringList values, QChar sep) { const auto line = values.join(std::move(sep)); appendProperty(std::move(key), QVariant::fromValue(line)); } -void KeiluvPropertyGroup::accept(IKeiluvNodeVisitor *visitor) const +void PropertyGroup::accept(INodeVisitor *visitor) const { visitor->visitStart(this); @@ -61,4 +62,6 @@ void KeiluvPropertyGroup::accept(IKeiluvNodeVisitor *visitor) const visitor->visitEnd(this); } +} // namespace xml +} // namespace gen } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvpropertygroup.h b/src/lib/corelib/generators/xmlpropertygroup.h index bb5d608c4..e63b515fc 100644 --- a/src/plugins/generator/keiluv/keiluvpropertygroup.h +++ b/src/lib/corelib/generators/xmlpropertygroup.h @@ -28,11 +28,13 @@ ** ****************************************************************************/ -#ifndef QBS_KEILUVPROPERTYGROUP_H -#define QBS_KEILUVPROPERTYGROUP_H +#ifndef GENERATORS_XML_PROPERTY_GROUP_H +#define GENERATORS_XML_PROPERTY_GROUP_H -#include "keiluvproperty.h" -#include "keiluvversioninfo.h" +#include "generatorversioninfo.h" +#include "xmlproperty.h" + +#include <tools/qbs_export.h> #include <memory> @@ -41,31 +43,36 @@ namespace qbs { class ProductData; class Project; -class KeiluvPropertyGroup : public KeiluvProperty +namespace gen { +namespace xml { + +class QBS_EXPORT PropertyGroup : public Property { public: - explicit KeiluvPropertyGroup(QByteArray name); + explicit PropertyGroup(QByteArray name); void appendProperty(QByteArray name, QVariant value); void appendMultiLineProperty(QByteArray key, QStringList values, QChar sep = QLatin1Char(',')); - void accept(IKeiluvNodeVisitor *visitor) const final; + void accept(INodeVisitor *visitor) const final; }; -class KeiluvPropertyGroupFactory +class PropertyGroupFactory { public: - virtual ~KeiluvPropertyGroupFactory() = default; - virtual bool canCreate(KeiluvUtils::Architecture architecture, + virtual ~PropertyGroupFactory() = default; + virtual bool canCreate(utils::Architecture arch, const Version &version) const = 0; - virtual std::unique_ptr<KeiluvPropertyGroup> create( - const Project &qbsProject, - const ProductData &qbsProduct, + virtual std::unique_ptr<PropertyGroup> create( + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const = 0; }; +} // namespace xml +} // namespace gen } // namespace qbs -#endif // QBS_KEILUVPROPERTYGROUP_H +#endif // GENERATORS_XML_PROPERTY_GROUP_H diff --git a/src/lib/corelib/generators/xmlworkspace.cpp b/src/lib/corelib/generators/xmlworkspace.cpp new file mode 100644 index 000000000..8913ceffd --- /dev/null +++ b/src/lib/corelib/generators/xmlworkspace.cpp @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qbs. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "ixmlnodevisitor.h" +#include "xmlproperty.h" +#include "xmlpropertygroup.h" +#include "xmlworkspace.h" + +namespace qbs { +namespace gen { +namespace xml { + +Workspace::Workspace(const QString &workspacePath) + : m_baseDirectory(QFileInfo(workspacePath).absoluteDir()) +{ +} + +void Workspace::accept(INodeVisitor *visitor) const +{ + visitor->visitStart(this); + + for (const auto &child : children()) + child->accept(visitor); + + visitor->visitEnd(this); +} + +} // namespace xml +} // namespace gen +} // namespace qbs diff --git a/src/lib/corelib/generators/xmlworkspace.h b/src/lib/corelib/generators/xmlworkspace.h new file mode 100644 index 000000000..beab22c4a --- /dev/null +++ b/src/lib/corelib/generators/xmlworkspace.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qbs. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef GENERATORS_XML_WWORKSPACE_H +#define GENERATORS_XML_WWORKSPACE_H + +#include "xmlproperty.h" + +#include <tools/qbs_export.h> + +#include <QtCore/qdir.h> + +namespace qbs { +namespace gen { +namespace xml { + +class QBS_EXPORT Workspace : public Property +{ +public: + explicit Workspace(const QString &workspacePath); + void accept(INodeVisitor *visitor) const final; + + virtual void addProject(const QString &projectPath) = 0; + +protected: + const QDir m_baseDirectory; +}; + +} // namespace xml +} // namespace gen +} // namespace qbs + +#endif // GENERATORS_XML_WWORKSPACE_H diff --git a/src/lib/corelib/generators/xmlworkspacewriter.cpp b/src/lib/corelib/generators/xmlworkspacewriter.cpp new file mode 100644 index 000000000..2358d4047 --- /dev/null +++ b/src/lib/corelib/generators/xmlworkspacewriter.cpp @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Denis Shienkov <denis.shienkov@gmail.com> +** Contact: http://www.qt.io/licensing +** +** This file is part of Qbs. +** +** 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 http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "xmlproperty.h" +#include "xmlpropertygroup.h" +#include "xmlworkspace.h" +#include "xmlworkspacewriter.h" + +#include <ostream> + +namespace qbs { +namespace gen { +namespace xml { + +WorkspaceWriter::WorkspaceWriter(std::ostream *device) + : m_device(device) +{ + m_writer.reset(new QXmlStreamWriter(&m_buffer)); + m_writer->setAutoFormatting(true); +} + +bool WorkspaceWriter::write(const Workspace *workspace) +{ + m_buffer.clear(); + m_writer->writeStartDocument(); + workspace->accept(this); + m_writer->writeEndDocument(); + if (m_writer->hasError()) + return false; + m_device->write(&*std::begin(m_buffer), m_buffer.size()); + return m_device->good(); +} + +void WorkspaceWriter::visitStart(const Property *property) +{ + const auto value = property->value().toString(); + const auto name = QString::fromUtf8(property->name()); + m_writer->writeTextElement(name, value); +} + +void WorkspaceWriter::visitEnd(const Property *property) +{ + Q_UNUSED(property) +} + +void WorkspaceWriter::visitStart(const PropertyGroup *propertyGroup) +{ + const auto name = QString::fromUtf8(propertyGroup->name()); + m_writer->writeStartElement(name); +} + +void WorkspaceWriter::visitEnd(const PropertyGroup *propertyGroup) +{ + Q_UNUSED(propertyGroup) + m_writer->writeEndElement(); +} + +QXmlStreamWriter *WorkspaceWriter::writer() const +{ + return m_writer.get(); +} + +} // namespace xml +} // namespace gen +} // namespace qbs diff --git a/src/plugins/generator/iarew/iiarewnodevisitor.h b/src/lib/corelib/generators/xmlworkspacewriter.h index c97a8b280..73e7d0686 100644 --- a/src/plugins/generator/iarew/iiarewnodevisitor.h +++ b/src/lib/corelib/generators/xmlworkspacewriter.h @@ -28,38 +28,43 @@ ** ****************************************************************************/ -#ifndef QBS_IIAREWNODEVISITOR_H -#define QBS_IIAREWNODEVISITOR_H +#ifndef GENERATORS_XML_WORKSPACE_WRITER_H +#define GENERATORS_XML_WORKSPACE_WRITER_H -#include <QtCore/qxmlstream.h> +#include "ixmlnodevisitor.h" + +#include <tools/qbs_export.h> #include <memory> namespace qbs { +namespace gen { +namespace xml { -class IarewProject; -class IarewProperty; -class IarewPropertyGroup; -class IarewWorkspace; - -class IIarewNodeVisitor +class QBS_EXPORT WorkspaceWriter : public INodeVisitor { + Q_DISABLE_COPY(WorkspaceWriter) public: - virtual ~IIarewNodeVisitor() {} + explicit WorkspaceWriter(std::ostream *device); + bool write(const Workspace *workspace); - virtual void visitStart(const IarewWorkspace *workspace) { Q_UNUSED(workspace) } - virtual void visitEnd(const IarewWorkspace *workspace) { Q_UNUSED(workspace) } +protected: + QXmlStreamWriter *writer() const; - virtual void visitStart(const IarewProject *project) { Q_UNUSED(project) } - virtual void visitEnd(const IarewProject *project) { Q_UNUSED(project) } +private: + void visitStart(const Property *property) final; + void visitEnd(const Property *property) final; - virtual void visitStart(const IarewProperty *property) = 0; - virtual void visitEnd(const IarewProperty *property) = 0; + void visitStart(const PropertyGroup *propertyGroup) final; + void visitEnd(const PropertyGroup *propertyGroup) final; - virtual void visitStart(const IarewPropertyGroup *propertyGroup) = 0; - virtual void visitEnd(const IarewPropertyGroup *propertyGroup) = 0; + std::ostream *m_device = nullptr; + QByteArray m_buffer; + std::unique_ptr<QXmlStreamWriter> m_writer; }; +} // namespace xml +} // namespace gen } // namespace qbs -#endif // QBS_IIAREWNODEVISITOR_H +#endif // GENERATORS_XML_WORKSPACE_WRITER_H diff --git a/src/plugins/generator/iarew/archs/arm/armarchiversettingsgroup_v8.cpp b/src/plugins/generator/iarew/archs/arm/armarchiversettingsgroup_v8.cpp index 50fceb40d..210c757da 100644 --- a/src/plugins/generator/iarew/archs/arm/armarchiversettingsgroup_v8.cpp +++ b/src/plugins/generator/iarew/archs/arm/armarchiversettingsgroup_v8.cpp @@ -30,7 +30,6 @@ #include "armarchiversettingsgroup_v8.h" -#include "../../iarewproperty.h" #include "../../iarewutils.h" namespace qbs { @@ -51,7 +50,7 @@ struct OutputPageOptions final const ProductData &qbsProduct) { outputFile = QLatin1String("$PROJ_DIR$/") - + IarewUtils::targetBinaryPath(baseDirectory, qbsProduct); + + gen::utils::targetBinaryPath(baseDirectory, qbsProduct); } QString outputFile; @@ -71,9 +70,9 @@ ArmArchiverSettingsGroup::ArmArchiverSettingsGroup( setName(QByteArrayLiteral("IARCHIVE")); setArchiveVersion(kArchiverArchiveVersion); setDataVersion(kArchiverDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildOutputPage(buildRootDirectory, qbsProduct); } diff --git a/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.cpp b/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.cpp index f4125b188..b7870d626 100644 --- a/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.cpp +++ b/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.cpp @@ -30,7 +30,6 @@ #include "armassemblersettingsgroup_v8.h" -#include "../../iarewproperty.h" #include "../../iarewutils.h" namespace qbs { @@ -47,8 +46,12 @@ namespace { struct LanguagePageOptions final { - enum MacroQuoteCharacter { AngleBracketsQuote, RoundBracketsQuote, - SquareBracketsQuote, FigureBracketsQuote }; + enum MacroQuoteCharacter { + AngleBracketsQuote, + RoundBracketsQuote, + SquareBracketsQuote, + FigureBracketsQuote + }; explicit LanguagePageOptions(const ProductData &qbsProduct) { @@ -80,7 +83,7 @@ struct OutputPageOptions final { explicit OutputPageOptions(const ProductData &qbsProduct) { - debugInfo = IarewUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); } int debugInfo = 0; @@ -94,11 +97,11 @@ struct PreprocessorPageOptions final const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - defineSymbols = IarewUtils::cppVariantModuleProperties( + defineSymbols = gen::utils::cppVariantModuleProperties( qbsProps, {QStringLiteral("defines")}); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList fullIncludePaths = IarewUtils::cppStringModuleProperties( + const QStringList fullIncludePaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); for (const QString &fullIncludePath : fullIncludePaths) { @@ -127,7 +130,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString warningLevel = IarewUtils::cppStringModuleProperty( + const QString warningLevel = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("warningLevel")); if (warningLevel == QLatin1String("all")) { enableWarnings = 0; @@ -159,9 +162,9 @@ ArmAssemblerSettingsGroup::ArmAssemblerSettingsGroup( setName(QByteArrayLiteral("AARM")); setArchiveVersion(kAssemblerArchiveVersion); setDataVersion(kAssemblerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildLanguagePage(qbsProduct); buildOutputPage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.h b/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.h index b37f06eb1..620dcf1f5 100644 --- a/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.h +++ b/src/plugins/generator/iarew/archs/arm/armassemblersettingsgroup_v8.h @@ -38,12 +38,14 @@ namespace iarew { namespace arm { namespace v8 { -class ArmAssemblerSettingsGroup final : public IarewSettingsPropertyGroup +class ArmAssemblerSettingsGroup final + : public IarewSettingsPropertyGroup { public: - explicit ArmAssemblerSettingsGroup(const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps); + explicit ArmAssemblerSettingsGroup( + const Project &qbsProject, + const ProductData &qbsProduct, + const std::vector<ProductData> &qbsProductDeps); private: void buildLanguagePage(const ProductData &qbsProduct); diff --git a/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.cpp b/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.cpp index 306b415de..a16e57a42 100644 --- a/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.cpp +++ b/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.cpp @@ -44,20 +44,20 @@ namespace arm { namespace v8 { ArmBuildConfigurationGroup::ArmBuildConfigurationGroup( - const Project &qbsProject, - const ProductData &qbsProduct, + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) - : IarewPropertyGroup("configuration") + : gen::xml::PropertyGroup("configuration") { // Append configuration name item. - const QString cfgName = IarewUtils::buildConfigurationName(qbsProject); + const QString cfgName = gen::utils::buildConfigurationName(qbsProject); appendProperty("name", cfgName); // Apend toolchain name group item. appendChild<IarewToolchainPropertyGroup>("ARM"); // Append debug info item. - const int debugBuild = IarewUtils::debugInformation(qbsProduct); + const int debugBuild = gen::utils::debugInformation(qbsProduct); appendProperty("debug", debugBuild); // Append settings group items. @@ -74,16 +74,17 @@ ArmBuildConfigurationGroup::ArmBuildConfigurationGroup( } bool ArmBuildConfigurationGroupFactory::canCreate( - IarewUtils::Architecture architecture, + gen::utils::Architecture arch, const Version &version) const { - return architecture == IarewUtils::Architecture::ArmArchitecture + return arch == gen::utils::Architecture::Arm && version.majorVersion() == 8; } -std::unique_ptr<IarewPropertyGroup> ArmBuildConfigurationGroupFactory::create( - const Project &qbsProject, - const ProductData &qbsProduct, +std::unique_ptr<gen::xml::PropertyGroup> +ArmBuildConfigurationGroupFactory::create( + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const { const auto group = new ArmBuildConfigurationGroup( diff --git a/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.h b/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.h index 1bc3ab549..26370c9b8 100644 --- a/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.h +++ b/src/plugins/generator/iarew/archs/arm/armbuildconfigurationgroup_v8.h @@ -31,32 +31,35 @@ #ifndef QBS_IAREWARMBUILDCONFIGURATIONGROUP_V8_H #define QBS_IAREWARMBUILDCONFIGURATIONGROUP_V8_H -#include "../../iarewpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace iarew { namespace arm { namespace v8 { -class ArmBuildConfigurationGroup final : public IarewPropertyGroup +class ArmBuildConfigurationGroup final + : public gen::xml::PropertyGroup { private: - explicit ArmBuildConfigurationGroup(const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps); + explicit ArmBuildConfigurationGroup( + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, + const std::vector<ProductData> &qbsProductDeps); friend class ArmBuildConfigurationGroupFactory; }; -class ArmBuildConfigurationGroupFactory final : public IarewPropertyGroupFactory +class ArmBuildConfigurationGroupFactory final + : public gen::xml::PropertyGroupFactory { public: - bool canCreate(IarewUtils::Architecture architecture, + bool canCreate(gen::utils::Architecture arch, const Version &version) const final; - std::unique_ptr<IarewPropertyGroup> create( - const Project &qbsProject, - const ProductData &qbsProduct, + std::unique_ptr<gen::xml::PropertyGroup> create( + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const final; }; diff --git a/src/plugins/generator/iarew/archs/arm/armcompilersettingsgroup_v8.cpp b/src/plugins/generator/iarew/archs/arm/armcompilersettingsgroup_v8.cpp index 9d15db75e..bbe5b1758 100644 --- a/src/plugins/generator/iarew/archs/arm/armcompilersettingsgroup_v8.cpp +++ b/src/plugins/generator/iarew/archs/arm/armcompilersettingsgroup_v8.cpp @@ -48,7 +48,7 @@ struct OutputPageOptions final { explicit OutputPageOptions(const ProductData &qbsProduct) { - debugInfo = IarewUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); } int debugInfo = 0; @@ -58,16 +58,22 @@ struct OutputPageOptions final struct LanguageOnePageOptions final { - enum LanguageExtension { CLanguageExtension, - CxxLanguageExtension, - AutoLanguageExtension }; - - enum CLanguageDialect { C89LanguageDialect, - C11LanguageDialect }; - - enum LanguageConformance { AllowIarExtension, - RelaxedStandard, - StrictStandard }; + enum LanguageExtension { + CLanguageExtension, + CxxLanguageExtension, + AutoLanguageExtension + }; + + enum CLanguageDialect { + C89LanguageDialect, + C11LanguageDialect + }; + + enum LanguageConformance { + AllowIarExtension, + RelaxedStandard, + StrictStandard + }; explicit LanguageOnePageOptions(const ProductData &qbsProduct) { @@ -75,7 +81,7 @@ struct LanguageOnePageOptions final // File extension based by default. languageExtension = LanguageOnePageOptions::AutoLanguageExtension; // Language dialect. - const QStringList cLanguageVersion = IarewUtils::cppStringModuleProperties( + const QStringList cLanguageVersion = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("cLanguageVersion")}); cLanguageDialect = cLanguageVersion.contains(QLatin1String("c89")) ? LanguageOnePageOptions::C89LanguageDialect @@ -115,10 +121,15 @@ struct LanguageOnePageOptions final struct LanguageTwoPageOptions final { - enum PlainCharacter { SignedCharacter, - UnsignedCharacter }; - enum FloatingPointSemantic { StrictSemantic, - RelaxedSemantic }; + enum PlainCharacter { + SignedCharacter, + UnsignedCharacter + }; + + enum FloatingPointSemantic { + StrictSemantic, + RelaxedSemantic + }; explicit LanguageTwoPageOptions(const ProductData &qbsProduct) { @@ -143,24 +154,30 @@ struct OptimizationsPageOptions final // Optimizations level radio-buttons with // combo-box on "level" widget. - enum Strategy { StrategyBalanced, - StrategySize, - StrategySpeed }; - - enum Level { LevelNone, - LevelLow, - LevelMedium, - LevelHigh }; - - enum LevelSlave { LevelSlave0, - LevelSlave1, - LevelSlave2, - LevelSlave3 }; + enum Strategy { + StrategyBalanced, + StrategySize, + StrategySpeed + }; + + enum Level { + LevelNone, + LevelLow, + LevelMedium, + LevelHigh + }; + + enum LevelSlave { + LevelSlave0, + LevelSlave1, + LevelSlave2, + LevelSlave3 + }; explicit OptimizationsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString optimization = IarewUtils::cppStringModuleProperty( + const QString optimization = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("optimization")); if (optimization == QLatin1String("none")) { optimizationStrategy = OptimizationsPageOptions::StrategyBalanced; @@ -222,11 +239,11 @@ struct PreprocessorPageOptions final const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - defineSymbols = IarewUtils::cppVariantModuleProperties( + defineSymbols = gen::utils::cppVariantModuleProperties( qbsProps, {QStringLiteral("defines")}); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList fullIncludePaths = IarewUtils::cppStringModuleProperties( + const QStringList fullIncludePaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); for (const QString &fullIncludePath : fullIncludePaths) { @@ -255,7 +272,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - treatWarningsAsErrors = IarewUtils::cppIntegerModuleProperty( + treatWarningsAsErrors = gen::utils::cppIntegerModuleProperty( qbsProps, QStringLiteral("treatWarningsAsErrors")); } @@ -266,8 +283,10 @@ struct DiagnosticsPageOptions final struct CodePageOptions final { - enum ProcessorMode { CpuArmMode, - CpuThumbMode }; + enum ProcessorMode { + CpuArmMode, + CpuThumbMode + }; explicit CodePageOptions(const ProductData &qbsProduct) { @@ -312,9 +331,9 @@ ArmCompilerSettingsGroup::ArmCompilerSettingsGroup( setName(QByteArrayLiteral("ICCARM")); setArchiveVersion(kCompilerArchiveVersion); setDataVersion(kCompilerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildOutputPage(qbsProduct); buildLanguageOnePage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/arm/armgeneralsettingsgroup_v8.cpp b/src/plugins/generator/iarew/archs/arm/armgeneralsettingsgroup_v8.cpp index 61525addd..d98dd0ebf 100644 --- a/src/plugins/generator/iarew/archs/arm/armgeneralsettingsgroup_v8.cpp +++ b/src/plugins/generator/iarew/archs/arm/armgeneralsettingsgroup_v8.cpp @@ -46,52 +46,54 @@ namespace { struct CpuCoreEntry final { - enum CpuCoreCode { Arm7tdmi = 0, - Arm7tdmis = 1, - Arm710t = 2, - Arm720t = 3, - Arm740t = 4, - Arm7ejs = 5, - Arm9tdmi = 6, - Arm920t = 7, - Arm922t = 8, - Arm940t = 9, - Arm9e = 10, - Arm9es = 11, - Arm926ejs = 12, - Arm946es = 13, - Arm966es = 14, - Arm968es = 15, - Arm10e = 16, - Arm1020e = 17, - Arm1022e = 18, - Arm1026ejs = 19, - Arm1136j = 20, - Arm1136js = 21, - Arm1176j = 24, - Arm1176js = 25, - Xscale = 32, - XscaleIr7 = 33, - CortexM0 = 34, - CortexM0Plus = 35, - CortexM1 = 36, - CortexMs1 = 37, - CortexM3 = 38, - CortexM4 = 39, - CortexM7 = 41, - CortexR4 = 42, - CortexR5 = 44, - CortexR7 = 46, - CortexR8 = 48, - CortexR52 = 49, - CortexA5 = 50, - CortexA7 = 52, - CortexA8 = 53, - CortexA9 = 54, - CortexA15 = 55, - CortexA17 = 56, - CortexM23 = 58, - CortexM33 = 59 }; + enum CpuCoreCode { + Arm7tdmi = 0, + Arm7tdmis = 1, + Arm710t = 2, + Arm720t = 3, + Arm740t = 4, + Arm7ejs = 5, + Arm9tdmi = 6, + Arm920t = 7, + Arm922t = 8, + Arm940t = 9, + Arm9e = 10, + Arm9es = 11, + Arm926ejs = 12, + Arm946es = 13, + Arm966es = 14, + Arm968es = 15, + Arm10e = 16, + Arm1020e = 17, + Arm1022e = 18, + Arm1026ejs = 19, + Arm1136j = 20, + Arm1136js = 21, + Arm1176j = 24, + Arm1176js = 25, + Xscale = 32, + XscaleIr7 = 33, + CortexM0 = 34, + CortexM0Plus = 35, + CortexM1 = 36, + CortexMs1 = 37, + CortexM3 = 38, + CortexM4 = 39, + CortexM7 = 41, + CortexR4 = 42, + CortexR5 = 44, + CortexR7 = 46, + CortexR8 = 48, + CortexR52 = 49, + CortexA5 = 50, + CortexA7 = 52, + CortexA8 = 53, + CortexA9 = 54, + CortexA15 = 55, + CortexA17 = 56, + CortexM23 = 58, + CortexM33 = 59 + }; // Required to compile in MSVC2015. CpuCoreEntry(CpuCoreCode cc, QByteArray tf) @@ -154,21 +156,24 @@ static const CpuCoreEntry cpusDict[] = { struct FpuCoreEntry final { - enum FpuRegistersCount { NoFpuRegisters, - Fpu16Registers, - Fpu32Registers }; - - enum FpuCoreCode { NoVfp = 0, - Vfp2 = 2, - Vfp3d16 = 3, - Vfp3 = 3, - Vfp4sp = 4, - Vfp4d16 = 5, - Vfp4 = 5, - Vfp5sp = 6, - Vfp5d16 = 7, - Vfp9s = 8 }; - + enum FpuRegistersCount { + NoFpuRegisters, + Fpu16Registers, + Fpu32Registers + }; + + enum FpuCoreCode { + NoVfp = 0, + Vfp2 = 2, + Vfp3d16 = 3, + Vfp3 = 3, + Vfp4sp = 4, + Vfp4d16 = 5, + Vfp4 = 5, + Vfp5sp = 6, + Vfp5d16 = 7, + Vfp9s = 8 + }; // Required to compile in MSVC2015. FpuCoreEntry(FpuCoreCode cc, FpuRegistersCount rc, @@ -198,13 +203,15 @@ static const FpuCoreEntry fpusDict[] = { struct TargetPageOptions final { - enum Endianness { LittleEndian, - BigEndian }; + enum Endianness { + LittleEndian, + BigEndian + }; explicit TargetPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList flags = IarewUtils::cppStringModuleProperties( + const QStringList flags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverFlags")}); // Detect target CPU code. const QString cpuValue = IarewUtils::flagValue( @@ -233,7 +240,7 @@ struct TargetPageOptions final targetFpuRegs = fpuIt->regsCount; } // Detect endian. - const QString prop = IarewUtils::cppStringModuleProperty( + const QString prop = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("endianness")); if (prop == QLatin1String("big")) endianness = TargetPageOptions::BigEndian; @@ -251,16 +258,20 @@ struct TargetPageOptions final struct LibraryOnePageOptions final { - enum PrintfFormatter { PrintfAutoFormatter, - PrintfFullFormatter, - PrintfLargeFormatter, - PrintfSmallFormatter, - PrintfTinyFormatter }; - - enum ScanfFormatter { ScanfAutoFormatter, - ScanfFullFormatter, - ScanfLargeFormatter, - ScanfSmallFormatter }; + enum PrintfFormatter { + PrintfAutoFormatter, + PrintfFullFormatter, + PrintfLargeFormatter, + PrintfSmallFormatter, + PrintfTinyFormatter + }; + + enum ScanfFormatter { + ScanfAutoFormatter, + ScanfFullFormatter, + ScanfLargeFormatter, + ScanfSmallFormatter + }; explicit LibraryOnePageOptions(const ProductData &qbsProduct) { @@ -304,10 +315,12 @@ struct LibraryOnePageOptions final struct LibraryTwoPageOptions final { - enum HeapType { AutomaticHeap, - AdvancedHeap, - BasicHeap, - NoFreeHeap }; + enum HeapType { + AutomaticHeap, + AdvancedHeap, + BasicHeap, + NoFreeHeap + }; explicit LibraryTwoPageOptions(const ProductData &qbsProduct) { @@ -330,16 +343,22 @@ struct LibraryTwoPageOptions final struct LibraryConfigPageOptions final { - enum RuntimeLibrary { NoLibrary, - NormalLibrary, - FullLibrary, - CustomLibrary }; - - enum ThreadSupport { NoThread, - EnableThread }; - - enum LowLevelInterface { NoInterface, - SemihostedInterface }; + enum RuntimeLibrary { + NoLibrary, + NormalLibrary, + FullLibrary, + CustomLibrary + }; + + enum ThreadSupport { + NoThread, + EnableThread + }; + + enum LowLevelInterface { + NoInterface, + SemihostedInterface + }; explicit LibraryConfigPageOptions(const QString &baseDirectory, const ProductData &qbsProduct) @@ -396,11 +415,11 @@ struct OutputPageOptions final const ProductData &qbsProduct) { binaryType = IarewUtils::outputBinaryType(qbsProduct); - binaryDirectory = IarewUtils::binaryOutputDirectory( + binaryDirectory = gen::utils::binaryOutputDirectory( baseDirectory, qbsProduct); - objectDirectory = IarewUtils::objectsOutputDirectory( + objectDirectory = gen::utils::objectsOutputDirectory( baseDirectory, qbsProduct); - listingDirectory = IarewUtils::listingOutputDirectory( + listingDirectory = gen::utils::listingOutputDirectory( baseDirectory, qbsProduct); } @@ -424,9 +443,9 @@ ArmGeneralSettingsGroup::ArmGeneralSettingsGroup( setName(QByteArrayLiteral("General")); setArchiveVersion(kGeneralArchiveVersion); setDataVersion(kGeneralDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildTargetPage(qbsProduct); buildLibraryOptionsOnePage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/arm/armlinkersettingsgroup_v8.cpp b/src/plugins/generator/iarew/archs/arm/armlinkersettingsgroup_v8.cpp index d09a456ca..1fdbce5ce 100644 --- a/src/plugins/generator/iarew/archs/arm/armlinkersettingsgroup_v8.cpp +++ b/src/plugins/generator/iarew/archs/arm/armlinkersettingsgroup_v8.cpp @@ -116,12 +116,12 @@ struct LibraryPageOptions final { const auto &qbsProps = qbsProduct.moduleProperties(); - entryPoint = IarewUtils::cppStringModuleProperty( + entryPoint = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("entryPoint")); // Add libraries search paths. const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList libraryPaths = IarewUtils::cppStringModuleProperties( + const QStringList libraryPaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("libraryPaths")}); for (const QString &libraryPath : libraryPaths) { const QFileInfo libraryPathInfo(libraryPath); @@ -141,7 +141,7 @@ struct LibraryPageOptions final // Add static libraries paths. const QStringList staticLibrariesProps = - IarewUtils::cppStringModuleProperties( + gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("staticLibraries")}); for (const QString &staticLibrary : staticLibrariesProps) { const QFileInfo staticLibraryInfo(staticLibrary); @@ -166,7 +166,7 @@ struct LibraryPageOptions final // Add static libraries from product dependencies. for (const ProductData &qbsProductDep : qbsProductDeps) { const QString depBinaryPath = QLatin1String("$PROJ_DIR$/") - + IarewUtils::targetBinaryPath(baseDirectory, + + gen::utils::targetBinaryPath(baseDirectory, qbsProductDep); staticLibraries.push_back(depBinaryPath); } @@ -191,7 +191,7 @@ struct OutputPageOptions final const auto &qbsProps = qbsProduct.moduleProperties(); const QStringList flags = IarewUtils::cppModuleLinkerFlags(qbsProps); debugInfo = !flags.contains(QLatin1String("--strip")); - outputFile = IarewUtils::targetBinary(qbsProduct); + outputFile = gen::utils::targetBinary(qbsProduct); } int debugInfo = 0; @@ -216,13 +216,15 @@ struct InputPageOptions final struct ListPageOptions final { - enum ListingAction { NoListing, - GenerateListing }; + enum ListingAction { + NoListing, + GenerateListing + }; explicit ListPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - generateMap = IarewUtils::cppBooleanModuleProperty( + generateMap = gen::utils::cppBooleanModuleProperty( qbsProps, QStringLiteral("generateMapFile")) ? ListPageOptions::GenerateListing : ListPageOptions::NoListing; @@ -286,7 +288,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - treatWarningsAsErrors = IarewUtils::cppIntegerModuleProperty( + treatWarningsAsErrors = gen::utils::cppIntegerModuleProperty( qbsProps, QStringLiteral("treatWarningsAsErrors")); } @@ -305,9 +307,9 @@ ArmLinkerSettingsGroup::ArmLinkerSettingsGroup( setName(QByteArrayLiteral("ILINK")); setArchiveVersion(kLinkerArchiveVersion); setDataVersion(kLinkerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildConfigPage(buildRootDirectory, qbsProduct); buildLibraryPage(buildRootDirectory, qbsProduct, qbsProductDeps); diff --git a/src/plugins/generator/iarew/archs/avr/avrarchiversettingsgroup_v7.cpp b/src/plugins/generator/iarew/archs/avr/avrarchiversettingsgroup_v7.cpp index 0376b1621..a3babc1d1 100644 --- a/src/plugins/generator/iarew/archs/avr/avrarchiversettingsgroup_v7.cpp +++ b/src/plugins/generator/iarew/archs/avr/avrarchiversettingsgroup_v7.cpp @@ -30,7 +30,6 @@ #include "avrarchiversettingsgroup_v7.h" -#include "../../iarewproperty.h" #include "../../iarewutils.h" namespace qbs { @@ -51,7 +50,7 @@ struct OutputPageOptions final const ProductData &qbsProduct) { outputFile = QLatin1String("$PROJ_DIR$/") - + IarewUtils::targetBinaryPath(baseDirectory, qbsProduct); + + gen::utils::targetBinaryPath(baseDirectory, qbsProduct); } QString outputFile; @@ -71,9 +70,9 @@ AvrArchiverSettingsGroup::AvrArchiverSettingsGroup( setName(QByteArrayLiteral("XAR")); setArchiveVersion(kArchiverArchiveVersion); setDataVersion(kArchiverDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildOutputPage(buildRootDirectory, qbsProduct); } diff --git a/src/plugins/generator/iarew/archs/avr/avrassemblersettingsgroup_v7.cpp b/src/plugins/generator/iarew/archs/avr/avrassemblersettingsgroup_v7.cpp index 80970087f..ecb5400ea 100644 --- a/src/plugins/generator/iarew/archs/avr/avrassemblersettingsgroup_v7.cpp +++ b/src/plugins/generator/iarew/archs/avr/avrassemblersettingsgroup_v7.cpp @@ -30,7 +30,6 @@ #include "avrassemblersettingsgroup_v7.h" -#include "../../iarewproperty.h" #include "../../iarewutils.h" namespace qbs { @@ -47,15 +46,17 @@ namespace { struct LanguagePageOptions final { - enum MacroQuoteCharacter { AngleBracketsQuote, - RoundBracketsQuote, - SquareBracketsQuote, - FigureBracketsQuote }; + enum MacroQuoteCharacter { + AngleBracketsQuote, + RoundBracketsQuote, + SquareBracketsQuote, + FigureBracketsQuote + }; explicit LanguagePageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList flags = IarewUtils::cppStringModuleProperties( + const QStringList flags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("assemblerFlags")}); enableSymbolsCaseSensitive = flags.contains(QLatin1String("-s+")); enableMultibyteSupport = flags.contains(QLatin1String("-n")); @@ -81,7 +82,7 @@ struct OutputPageOptions final { explicit OutputPageOptions(const ProductData &qbsProduct) { - debugInfo = IarewUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); } int debugInfo = 0; @@ -95,11 +96,11 @@ struct PreprocessorPageOptions final const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - defineSymbols = IarewUtils::cppVariantModuleProperties( + defineSymbols = gen::utils::cppVariantModuleProperties( qbsProps, {QStringLiteral("defines")}); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList fullIncludePaths = IarewUtils::cppStringModuleProperties( + const QStringList fullIncludePaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); for (const auto &fullIncludePath : fullIncludePaths) { @@ -128,7 +129,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString warningLevel = IarewUtils::cppStringModuleProperty( + const QString warningLevel = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("warningLevel")); if (warningLevel == QLatin1String("all")) { enableWarnings = 0; @@ -160,9 +161,9 @@ AvrAssemblerSettingsGroup::AvrAssemblerSettingsGroup( setName(QByteArrayLiteral("AAVR")); setArchiveVersion(kAssemblerArchiveVersion); setDataVersion(kAssemblerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildLanguagePage(qbsProduct); buildOutputPage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.cpp b/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.cpp index 07768c254..dbb5c6620 100644 --- a/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.cpp +++ b/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.cpp @@ -47,17 +47,17 @@ AvrBuildConfigurationGroup::AvrBuildConfigurationGroup( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) - : IarewPropertyGroup("configuration") + : gen::xml::PropertyGroup("configuration") { // Append configuration name item. - const QString cfgName = IarewUtils::buildConfigurationName(qbsProject); + const QString cfgName = gen::utils::buildConfigurationName(qbsProject); appendProperty("name", cfgName); // Apend toolchain name group item. appendChild<IarewToolchainPropertyGroup>("AVR"); // Append debug info item. - const int debugBuild = IarewUtils::debugInformation(qbsProduct); + const int debugBuild = gen::utils::debugInformation(qbsProduct); appendProperty("debug", debugBuild); // Append settings group items. @@ -74,14 +74,15 @@ AvrBuildConfigurationGroup::AvrBuildConfigurationGroup( } bool AvrBuildConfigurationGroupFactory::canCreate( - IarewUtils::Architecture architecture, + gen::utils::Architecture arch, const Version &version) const { - return architecture == IarewUtils::Architecture::AvrArchitecture + return arch == gen::utils::Architecture::Avr && version.majorVersion() == 7; } -std::unique_ptr<IarewPropertyGroup> AvrBuildConfigurationGroupFactory::create( +std::unique_ptr<gen::xml::PropertyGroup> +AvrBuildConfigurationGroupFactory::create( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const diff --git a/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.h b/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.h index f00db799e..618cef4c6 100644 --- a/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.h +++ b/src/plugins/generator/iarew/archs/avr/avrbuildconfigurationgroup_v7.h @@ -31,30 +31,34 @@ #ifndef QBS_IAREWAVRBUILDCONFIGURATIONGROUP_V7_H #define QBS_IAREWAVRBUILDCONFIGURATIONGROUP_V7_H -#include "../../iarewpropertygroup.h" +#include <generators/generatorutils.h> +#include <generators/xmlpropertygroup.h> namespace qbs { namespace iarew { namespace avr { namespace v7 { -class AvrBuildConfigurationGroup final : public IarewPropertyGroup +class AvrBuildConfigurationGroup final + : public gen::xml::PropertyGroup { private: - explicit AvrBuildConfigurationGroup(const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps); + explicit AvrBuildConfigurationGroup( + const Project &qbsProject, + const ProductData &qbsProduct, + const std::vector<ProductData> &qbsProductDeps); friend class AvrBuildConfigurationGroupFactory; }; -class AvrBuildConfigurationGroupFactory final : public IarewPropertyGroupFactory +class AvrBuildConfigurationGroupFactory final + : public gen::xml::PropertyGroupFactory { public: - bool canCreate(IarewUtils::Architecture architecture, + bool canCreate(gen::utils::Architecture arch, const Version &version) const final; - std::unique_ptr<IarewPropertyGroup> create( + std::unique_ptr<gen::xml::PropertyGroup> create( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const final; diff --git a/src/plugins/generator/iarew/archs/avr/avrcompilersettingsgroup_v7.cpp b/src/plugins/generator/iarew/archs/avr/avrcompilersettingsgroup_v7.cpp index 03f6194f9..178eaab8c 100644 --- a/src/plugins/generator/iarew/archs/avr/avrcompilersettingsgroup_v7.cpp +++ b/src/plugins/generator/iarew/archs/avr/avrcompilersettingsgroup_v7.cpp @@ -53,7 +53,7 @@ struct OutputPageOptions final moduleType = flags.contains(QLatin1String("--library_module")) ? OutputPageOptions::LibraryModule : OutputPageOptions::ProgramModule; - debugInfo = IarewUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); disableErrorMessages = flags.contains( QLatin1String("--no_ubrof_messages")); } @@ -68,19 +68,27 @@ struct OutputPageOptions final struct LanguageOnePageOptions final { - enum LanguageExtension { CLanguageExtension, - CxxLanguageExtension, - AutoLanguageExtension }; - - enum CLanguageDialect { C89LanguageDialect, - C99LanguageDialect }; - - enum CxxLanguageDialect { EmbeddedCPlusPlus, - ExtendedEmbeddedCPlusPlus }; - - enum LanguageConformance { AllowIarExtension, - RelaxedStandard, - StrictStandard }; + enum LanguageExtension { + CLanguageExtension, + CxxLanguageExtension, + AutoLanguageExtension + }; + + enum CLanguageDialect { + C89LanguageDialect, + C99LanguageDialect + }; + + enum CxxLanguageDialect { + EmbeddedCPlusPlus, + ExtendedEmbeddedCPlusPlus + }; + + enum LanguageConformance { + AllowIarExtension, + RelaxedStandard, + StrictStandard + }; explicit LanguageOnePageOptions(const ProductData &qbsProduct) { @@ -89,7 +97,7 @@ struct LanguageOnePageOptions final // File extension based by default. languageExtension = LanguageOnePageOptions::AutoLanguageExtension; // C language dialect. - const QStringList cLanguageVersion = IarewUtils::cppStringModuleProperties( + const QStringList cLanguageVersion = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("cLanguageVersion")}); if (cLanguageVersion.contains(QLatin1String("c89"))) cLanguageDialect = LanguageOnePageOptions::C89LanguageDialect; @@ -131,11 +139,15 @@ struct LanguageOnePageOptions final struct LanguageTwoPageOptions final { - enum PlainCharacter { SignedCharacter, - UnsignedCharacter }; + enum PlainCharacter { + SignedCharacter, + UnsignedCharacter + }; - enum FloatingPointSemantic { StrictSemantic, - RelaxedSemantic }; + enum FloatingPointSemantic { + StrictSemantic, + RelaxedSemantic + }; explicit LanguageTwoPageOptions(const ProductData &qbsProduct) { @@ -162,24 +174,30 @@ struct OptimizationsPageOptions final { // Optimizations level radio-buttons with // combo-box on "level" widget. - enum Strategy { StrategyBalanced, - StrategySize, - StrategySpeed }; - - enum Level { LevelNone, - LevelLow, - LevelMedium, - LevelHigh }; - - enum LevelSlave { LevelSlave0, - LevelSlave1, - LevelSlave2, - LevelSlave3 }; + enum Strategy { + StrategyBalanced, + StrategySize, + StrategySpeed + }; + + enum Level { + LevelNone, + LevelLow, + LevelMedium, + LevelHigh + }; + + enum LevelSlave { + LevelSlave0, + LevelSlave1, + LevelSlave2, + LevelSlave3 + }; explicit OptimizationsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString optimization = IarewUtils::cppStringModuleProperty( + const QString optimization = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("optimization")); if (optimization == QLatin1String("none")) { optimizationStrategy = OptimizationsPageOptions::StrategyBalanced; @@ -231,11 +249,11 @@ struct PreprocessorPageOptions final const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - defineSymbols = IarewUtils::cppVariantModuleProperties( + defineSymbols = gen::utils::cppVariantModuleProperties( qbsProps, {QStringLiteral("defines")}); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList fullIncludePaths = IarewUtils::cppStringModuleProperties( + const QStringList fullIncludePaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); for (const QString &fullIncludePath : fullIncludePaths) { @@ -264,7 +282,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - warningsAsErrors = IarewUtils::cppIntegerModuleProperty( + warningsAsErrors = gen::utils::cppIntegerModuleProperty( qbsProps, QStringLiteral("treatWarningsAsErrors")); } @@ -311,9 +329,9 @@ AvrCompilerSettingsGroup::AvrCompilerSettingsGroup( setName(QByteArrayLiteral("ICCAVR")); setArchiveVersion(kCompilerArchiveVersion); setDataVersion(kCompilerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildOutputPage(qbsProduct); buildLanguageOnePage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/avr/avrgeneralsettingsgroup_v7.cpp b/src/plugins/generator/iarew/archs/avr/avrgeneralsettingsgroup_v7.cpp index 4136864b3..ff2f303c5 100644 --- a/src/plugins/generator/iarew/archs/avr/avrgeneralsettingsgroup_v7.cpp +++ b/src/plugins/generator/iarew/archs/avr/avrgeneralsettingsgroup_v7.cpp @@ -401,15 +401,17 @@ static const TargetMcuEntry mcusDict[] = { struct TargetPageOptions final { - enum MemoryModel { TinyModel, - SmallModel, - LargeModel, - HugeModel }; + enum MemoryModel { + TinyModel, + SmallModel, + LargeModel, + HugeModel + }; explicit TargetPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList flags = IarewUtils::cppStringModuleProperties( + const QStringList flags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverFlags")}); // Detect target MCU record. const QString mcuValue = IarewUtils::flagValue( @@ -460,7 +462,7 @@ struct SystemPageOptions final explicit SystemPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList flags = IarewUtils::cppStringModuleProperties( + const QStringList flags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverLinkerFlags"), QStringLiteral("defines")}); cstackSize = IarewUtils::flagValue( @@ -477,22 +479,26 @@ struct SystemPageOptions final struct LibraryOptionsPageOptions final { - enum PrintfFormatter { PrintfAutoFormatter = 0, - PrintfFullFormatter = 1, - PrintfFullNoMultibytesFormatter = 2, - PrintfLargeFormatter = 3, - PrintfLargeNoMultibytesFormatter = 4, - PrintfSmallFormatter = 6, - PrintfSmallNoMultibytesFormatter = 7, - PrintfTinyFormatter = 8 }; - - enum ScanfFormatter { ScanfAutoFormatter = 0, - ScanfFullFormatter = 1, - ScanfFullNoMultibytesFormatter = 2, - ScanfLargeFormatter = 3, - ScanfLargeNoMultibytesFormatter = 4, - ScanfSmallFormatter = 6, - ScanfSmallNoMultibytesFormatter = 7 }; + enum PrintfFormatter { + PrintfAutoFormatter = 0, + PrintfFullFormatter = 1, + PrintfFullNoMultibytesFormatter = 2, + PrintfLargeFormatter = 3, + PrintfLargeNoMultibytesFormatter = 4, + PrintfSmallFormatter = 6, + PrintfSmallNoMultibytesFormatter = 7, + PrintfTinyFormatter = 8 + }; + + enum ScanfFormatter { + ScanfAutoFormatter = 0, + ScanfFullFormatter = 1, + ScanfFullNoMultibytesFormatter = 2, + ScanfLargeFormatter = 3, + ScanfLargeNoMultibytesFormatter = 4, + ScanfSmallFormatter = 6, + ScanfSmallNoMultibytesFormatter = 7 + }; explicit LibraryOptionsPageOptions(const ProductData &qbsProduct) { @@ -541,13 +547,15 @@ struct LibraryOptionsPageOptions final struct LibraryConfigPageOptions final { - enum RuntimeLibrary { NoLibrary, - NormalDlibLibrary, - FullDlibLibrary, - CustomDlibLibrary, - ClibLibrary, - CustomClibLibrary, - ThirdPartyLibrary }; + enum RuntimeLibrary { + NoLibrary, + NormalDlibLibrary, + FullDlibLibrary, + CustomDlibLibrary, + ClibLibrary, + CustomClibLibrary, + ThirdPartyLibrary + }; explicit LibraryConfigPageOptions(const QString &baseDirectory, const ProductData &qbsProduct) @@ -555,7 +563,7 @@ struct LibraryConfigPageOptions final const auto &qbsProps = qbsProduct.moduleProperties(); const QStringList flags = IarewUtils::cppModuleCompilerFlags(qbsProps); - const QStringList libraryPaths = IarewUtils::cppStringModuleProperties( + const QStringList libraryPaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("staticLibraries")}); const auto libraryBegin = libraryPaths.cbegin(); const auto libraryEnd = libraryPaths.cend(); @@ -639,11 +647,11 @@ struct OutputPageOptions final const ProductData &qbsProduct) { binaryType = IarewUtils::outputBinaryType(qbsProduct); - binaryDirectory = IarewUtils::binaryOutputDirectory( + binaryDirectory = gen::utils::binaryOutputDirectory( baseDirectory, qbsProduct); - objectDirectory = IarewUtils::objectsOutputDirectory( + objectDirectory = gen::utils::objectsOutputDirectory( baseDirectory, qbsProduct); - listingDirectory = IarewUtils::listingOutputDirectory( + listingDirectory = gen::utils::listingOutputDirectory( baseDirectory, qbsProduct); } @@ -667,9 +675,9 @@ AvrGeneralSettingsGroup::AvrGeneralSettingsGroup( setName(QByteArrayLiteral("General")); setArchiveVersion(kGeneralArchiveVersion); setDataVersion(kGeneralDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildTargetPage(qbsProduct); buildSystemPage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/avr/avrlinkersettingsgroup_v7.cpp b/src/plugins/generator/iarew/archs/avr/avrlinkersettingsgroup_v7.cpp index 1cf2e7302..9b86a860e 100644 --- a/src/plugins/generator/iarew/archs/avr/avrlinkersettingsgroup_v7.cpp +++ b/src/plugins/generator/iarew/archs/avr/avrlinkersettingsgroup_v7.cpp @@ -55,7 +55,7 @@ struct ConfigPageOptions final const auto &qbsProps = qbsProduct.moduleProperties(); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - entryPoint = IarewUtils::cppStringModuleProperty( + entryPoint = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("entryPoint")); // Enumerate all product linker config files @@ -101,7 +101,7 @@ struct ConfigPageOptions final } // Add libraries search paths. - const QStringList libraryPaths = IarewUtils::cppStringModuleProperties( + const QStringList libraryPaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("libraryPaths")}); for (const QString &libraryPath : libraryPaths) { const QFileInfo libraryPathInfo(libraryPath); @@ -121,7 +121,7 @@ struct ConfigPageOptions final // Add static libraries paths. const QStringList staticLibrariesProps = - IarewUtils::cppStringModuleProperties( + gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("staticLibraries")}); for (const QString &staticLibrary : staticLibrariesProps) { const QFileInfo staticLibraryInfo(staticLibrary); @@ -146,7 +146,7 @@ struct ConfigPageOptions final // Add static libraries from product dependencies. for (const ProductData &qbsProductDep : qbsProductDeps) { const QString depBinaryPath = QLatin1String("$PROJ_DIR$/") - + IarewUtils::targetBinaryPath(baseDirectory, + + gen::utils::targetBinaryPath(baseDirectory, qbsProductDep); staticLibraries.push_back(depBinaryPath); } @@ -164,7 +164,7 @@ struct OutputPageOptions final { explicit OutputPageOptions(const ProductData &qbsProduct) { - outputFile = IarewUtils::targetBinary(qbsProduct); + outputFile = gen::utils::targetBinary(qbsProduct); } QString outputFile; @@ -174,13 +174,15 @@ struct OutputPageOptions final struct ListPageOptions final { - enum ListingAction { NoListing, - GenerateListing }; + enum ListingAction { + NoListing, + GenerateListing + }; explicit ListPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - generateMap = IarewUtils::cppBooleanModuleProperty( + generateMap = gen::utils::cppBooleanModuleProperty( qbsProps, QStringLiteral("generateMapFile")) ? ListPageOptions::GenerateListing : ListPageOptions::NoListing; @@ -243,7 +245,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString warningLevel = IarewUtils::cppStringModuleProperty( + const QString warningLevel = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("warningLevel")); suppressAllWarnings = (warningLevel == QLatin1String("none")); } @@ -263,9 +265,9 @@ AvrLinkerSettingsGroup::AvrLinkerSettingsGroup( setName(QByteArrayLiteral("XLINK")); setArchiveVersion(kLinkerArchiveVersion); setDataVersion(kLinkerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildConfigPage(buildRootDirectory, qbsProduct, qbsProductDeps); buildOutputPage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51archiversettingsgroup_v10.cpp b/src/plugins/generator/iarew/archs/mcs51/mcs51archiversettingsgroup_v10.cpp index a10b46079..36978bd15 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51archiversettingsgroup_v10.cpp +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51archiversettingsgroup_v10.cpp @@ -30,7 +30,6 @@ #include "mcs51archiversettingsgroup_v10.h" -#include "../../iarewproperty.h" #include "../../iarewutils.h" namespace qbs { @@ -51,7 +50,7 @@ struct OutputPageOptions final const ProductData &qbsProduct) { outputFile = QLatin1String("$PROJ_DIR$/") - + IarewUtils::targetBinaryPath(baseDirectory, qbsProduct); + + gen::utils::targetBinaryPath(baseDirectory, qbsProduct); } QString outputFile; @@ -71,9 +70,9 @@ Mcs51ArchiverSettingsGroup::Mcs51ArchiverSettingsGroup( setName(QByteArrayLiteral("XAR")); setArchiveVersion(kArchiverArchiveVersion); setDataVersion(kArchiverDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildOutputPage(buildRootDirectory, qbsProduct); } diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51assemblersettingsgroup_v10.cpp b/src/plugins/generator/iarew/archs/mcs51/mcs51assemblersettingsgroup_v10.cpp index 80ca0fd50..5f72f20e4 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51assemblersettingsgroup_v10.cpp +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51assemblersettingsgroup_v10.cpp @@ -30,7 +30,7 @@ #include "mcs51assemblersettingsgroup_v10.h" -#include "../../iarewproperty.h" +//#include "../../iarewproperty.h" #include "../../iarewutils.h" namespace qbs { @@ -47,15 +47,17 @@ namespace { struct LanguagePageOptions final { - enum MacroQuoteCharacter { AngleBracketsQuote, - RoundBracketsQuote, - SquareBracketsQuote, - FigureBracketsQuote }; + enum MacroQuoteCharacter { + AngleBracketsQuote, + RoundBracketsQuote, + SquareBracketsQuote, + FigureBracketsQuote + }; explicit LanguagePageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList flags = IarewUtils::cppStringModuleProperties( + const QStringList flags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("assemblerFlags")}); enableSymbolsCaseSensitive = flags.contains(QLatin1String("-s+")); enableMultibyteSupport = flags.contains(QLatin1String("-n")); @@ -81,7 +83,7 @@ struct OutputPageOptions final { explicit OutputPageOptions(const ProductData &qbsProduct) { - debugInfo = IarewUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); } int debugInfo = 0; @@ -95,11 +97,11 @@ struct PreprocessorPageOptions final const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - defineSymbols = IarewUtils::cppVariantModuleProperties( + defineSymbols = gen::utils::cppVariantModuleProperties( qbsProps, {QStringLiteral("defines")}); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList fullIncludePaths = IarewUtils::cppStringModuleProperties( + const QStringList fullIncludePaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); for (const auto &fullIncludePath : fullIncludePaths) { @@ -128,7 +130,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString warningLevel = IarewUtils::cppStringModuleProperty( + const QString warningLevel = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("warningLevel")); if (warningLevel == QLatin1String("all")) { enableWarnings = 0; @@ -161,9 +163,9 @@ Mcs51AssemblerSettingsGroup::Mcs51AssemblerSettingsGroup( setName(QByteArrayLiteral("A8051")); setArchiveVersion(kAssemblerArchiveVersion); setDataVersion(kAssemblerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildLanguagePage(qbsProduct); buildOutputPage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.cpp b/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.cpp index 74cdb6d0f..ba86bc54d 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.cpp +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.cpp @@ -47,17 +47,17 @@ Mcs51BuildConfigurationGroup::Mcs51BuildConfigurationGroup( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) - : IarewPropertyGroup("configuration") + : gen::xml::PropertyGroup("configuration") { // Append configuration name item. - const QString cfgName = IarewUtils::buildConfigurationName(qbsProject); + const QString cfgName = gen::utils::buildConfigurationName(qbsProject); appendProperty("name", cfgName); // Apend toolchain name group item. appendChild<IarewToolchainPropertyGroup>("8051"); // Append debug info item. - const int debugBuild = IarewUtils::debugInformation(qbsProduct); + const int debugBuild = gen::utils::debugInformation(qbsProduct); appendProperty("debug", debugBuild); // Append settings group items. @@ -74,13 +74,15 @@ Mcs51BuildConfigurationGroup::Mcs51BuildConfigurationGroup( } bool Mcs51BuildConfigurationGroupFactory::canCreate( - IarewUtils::Architecture architecture, const Version &version) const + gen::utils::Architecture arch, + const Version &version) const { - return architecture == IarewUtils::Architecture::Mcs51Architecture + return arch == gen::utils::Architecture::Mcs51 && version.majorVersion() == 10; } -std::unique_ptr<IarewPropertyGroup> Mcs51BuildConfigurationGroupFactory::create( +std::unique_ptr<gen::xml::PropertyGroup> +Mcs51BuildConfigurationGroupFactory::create( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.h b/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.h index d8153a0f0..edd16d5d7 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.h +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51buildconfigurationgroup_v10.h @@ -31,14 +31,15 @@ #ifndef QBS_IAREWMCS51BUILDCONFIGURATIONGROUP_V10_H #define QBS_IAREWMCS51BUILDCONFIGURATIONGROUP_V10_H -#include "../../iarewpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace iarew { namespace mcs51 { namespace v10 { -class Mcs51BuildConfigurationGroup final : public IarewPropertyGroup +class Mcs51BuildConfigurationGroup final + : public gen::xml::PropertyGroup { private: explicit Mcs51BuildConfigurationGroup( @@ -49,13 +50,14 @@ private: friend class Mcs51BuildConfigurationGroupFactory; }; -class Mcs51BuildConfigurationGroupFactory final : public IarewPropertyGroupFactory +class Mcs51BuildConfigurationGroupFactory final + : public gen::xml::PropertyGroupFactory { public: - bool canCreate(IarewUtils::Architecture architecture, + bool canCreate(gen::utils::Architecture arch, const Version &version) const final; - std::unique_ptr<IarewPropertyGroup> create( + std::unique_ptr<gen::xml::PropertyGroup> create( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) const final; diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51compilersettingsgroup_v10.cpp b/src/plugins/generator/iarew/archs/mcs51/mcs51compilersettingsgroup_v10.cpp index 94b747529..bda3d090b 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51compilersettingsgroup_v10.cpp +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51compilersettingsgroup_v10.cpp @@ -46,8 +46,10 @@ namespace { struct OutputPageOptions final { - enum ModuleType { ProgramModule, - LibraryModule}; + enum ModuleType { + ProgramModule, + LibraryModule + }; explicit OutputPageOptions(const ProductData &qbsProduct) { @@ -56,7 +58,7 @@ struct OutputPageOptions final moduleType = flags.contains(QLatin1String("--library_module")) ? OutputPageOptions::LibraryModule : OutputPageOptions::ProgramModule; - debugInfo = IarewUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); } int debugInfo = 0; @@ -67,19 +69,27 @@ struct OutputPageOptions final struct LanguageOnePageOptions final { - enum LanguageExtension { CLanguageExtension, - CxxLanguageExtension, - AutoLanguageExtension }; - - enum CLanguageDialect { C89LanguageDialect, - C99LanguageDialect }; - - enum CxxLanguageDialect { EmbeddedCPlusPlus, - ExtendedEmbeddedCPlusPlus }; - - enum LanguageConformance { AllowIarExtension, - RelaxedStandard, - StrictStandard }; + enum LanguageExtension { + CLanguageExtension, + CxxLanguageExtension, + AutoLanguageExtension + }; + + enum CLanguageDialect { + C89LanguageDialect, + C99LanguageDialect + }; + + enum CxxLanguageDialect { + EmbeddedCPlusPlus, + ExtendedEmbeddedCPlusPlus + }; + + enum LanguageConformance { + AllowIarExtension, + RelaxedStandard, + StrictStandard + }; explicit LanguageOnePageOptions(const ProductData &qbsProduct) { @@ -88,7 +98,7 @@ struct LanguageOnePageOptions final // File extension based by default. languageExtension = LanguageOnePageOptions::AutoLanguageExtension; // C language dialect. - const QStringList cLanguageVersion = IarewUtils::cppStringModuleProperties( + const QStringList cLanguageVersion = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("cLanguageVersion")}); cLanguageDialect = cLanguageVersion.contains(QLatin1String("c89")) ? LanguageOnePageOptions::C89LanguageDialect @@ -129,11 +139,15 @@ struct LanguageOnePageOptions final struct LanguageTwoPageOptions final { - enum PlainCharacter { SignedCharacter, - UnsignedCharacter }; + enum PlainCharacter { + SignedCharacter, + UnsignedCharacter + }; - enum FloatingPointSemantic { StrictSemantic, - RelaxedSemantic }; + enum FloatingPointSemantic { + StrictSemantic, + RelaxedSemantic + }; explicit LanguageTwoPageOptions(const ProductData &qbsProduct) { @@ -162,24 +176,30 @@ struct OptimizationsPageOptions final { // Optimizations level radio-buttons with combo-box // on "level" widget. - enum Strategy { StrategyBalanced, - StrategySize, - StrategySpeed }; - - enum Level { LevelNone, - LevelLow, - LevelMedium, - LevelHigh }; - - enum LevelSlave { LevelSlave0, - LevelSlave1, - LevelSlave2, - LevelSlave3 }; + enum Strategy { + StrategyBalanced, + StrategySize, + StrategySpeed + }; + + enum Level { + LevelNone, + LevelLow, + LevelMedium, + LevelHigh + }; + + enum LevelSlave { + LevelSlave0, + LevelSlave1, + LevelSlave2, + LevelSlave3 + }; explicit OptimizationsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString optimization = IarewUtils::cppStringModuleProperty( + const QString optimization = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("optimization")); if (optimization == QLatin1String("none")) { optimizationStrategy = OptimizationsPageOptions::StrategyBalanced; @@ -235,11 +255,11 @@ struct PreprocessorPageOptions final const auto &qbsProps = qbsProduct.moduleProperties(); // TODO: Need to exclude the pre-defined maroses which are handled // in 'General Options'. - defineSymbols = IarewUtils::cppVariantModuleProperties( + defineSymbols = gen::utils::cppVariantModuleProperties( qbsProps, {QStringLiteral("defines")}); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - const QStringList fullIncludePaths = IarewUtils::cppStringModuleProperties( + const QStringList fullIncludePaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); const QString dlibToolkitPath = IarewUtils::dlibToolkitRootPath(qbsProduct); @@ -273,7 +293,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - warningsAsErrors = IarewUtils::cppIntegerModuleProperty( + warningsAsErrors = gen::utils::cppIntegerModuleProperty( qbsProps, QStringLiteral("treatWarningsAsErrors")); } @@ -313,9 +333,9 @@ Mcs51CompilerSettingsGroup::Mcs51CompilerSettingsGroup( setName(QByteArrayLiteral("ICC8051")); setArchiveVersion(kCompilerArchiveVersion); setDataVersion(kCompilerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildOutputPage(qbsProduct); buildLanguageOnePage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51generalsettingsgroup_v10.cpp b/src/plugins/generator/iarew/archs/mcs51/mcs51generalsettingsgroup_v10.cpp index 48a2681f0..28e051489 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51generalsettingsgroup_v10.cpp +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51generalsettingsgroup_v10.cpp @@ -46,32 +46,42 @@ namespace { struct TargetPageOptions final { - enum CpuCore { CorePlain = 1, - CoreExtended1, - CoreExtended2 }; - - enum CodeModel { CodeModelNear = 1, - CodeModelBanked, - CodeModelFar, - CodeModelBankedExtended2 }; - - enum DataModel { DataModelTiny = 0, - DataModelSmall, - DataModelLarge, - DataModelGeneric, - DataModelFarGeneric, - DataModelFar }; - - enum ConstantsMemoryPlacement { RamMemoryPlace = 0, - RomMemoryPlace, - CodeMemoryPlace }; - - enum CallingConvention { DataOverlayConvention = 0, - IDataOverlayConvention, - IDataReentrantConvention, - PDataReentrantConvention, - XDataReentrantConvention, - ExtendedStackReentrantConvention }; + enum CpuCore { + CorePlain = 1, + CoreExtended1, + CoreExtended2 + }; + + enum CodeModel { + CodeModelNear = 1, + CodeModelBanked, + CodeModelFar, + CodeModelBankedExtended2 + }; + + enum DataModel { + DataModelTiny = 0, + DataModelSmall, + DataModelLarge, + DataModelGeneric, + DataModelFarGeneric, + DataModelFar + }; + + enum ConstantsMemoryPlacement { + RamMemoryPlace = 0, + RomMemoryPlace, + CodeMemoryPlace + }; + + enum CallingConvention { + DataOverlayConvention = 0, + IDataOverlayConvention, + IDataReentrantConvention, + PDataReentrantConvention, + XDataReentrantConvention, + ExtendedStackReentrantConvention + }; explicit TargetPageOptions(const ProductData &qbsProduct) { @@ -273,9 +283,9 @@ struct StackHeapPageOptions final explicit StackHeapPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList defineSymbols = IarewUtils::cppStringModuleProperties( + const QStringList defineSymbols = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("defines")}); - const QStringList linkerFlags = IarewUtils::cppStringModuleProperties( + const QStringList linkerFlags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverLinkerFlags")}); idataStack = IarewUtils::flagValue( @@ -373,14 +383,20 @@ struct StackHeapPageOptions final struct DptrPageOptions final { - enum DptrSize { Dptr16, - Dptr24 }; + enum DptrSize { + Dptr16, + Dptr24 + }; - enum DptrVisibility { DptrShadowed, - DptrSeparate }; + enum DptrVisibility { + DptrShadowed, + DptrSeparate + }; - enum SwitchMethod { DptrIncludeMethod, - DptrMaskMethod }; + enum SwitchMethod { + DptrIncludeMethod, + DptrMaskMethod + }; explicit DptrPageOptions(const ProductData &qbsProduct) { @@ -464,9 +480,9 @@ struct DptrPageOptions final } } - const QStringList defineSymbols = IarewUtils::cppStringModuleProperties( + const QStringList defineSymbols = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("defines")}); - const QStringList linkerFlags = IarewUtils::cppStringModuleProperties( + const QStringList linkerFlags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverLinkerFlags")}); dptrPbank = IarewUtils::flagValue( @@ -557,9 +573,9 @@ struct CodeBankPageOptions final explicit CodeBankPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QStringList defineSymbols = IarewUtils::cppStringModuleProperties( + const QStringList defineSymbols = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("defines")}); - const QStringList linkerFlags = IarewUtils::cppStringModuleProperties( + const QStringList linkerFlags = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverLinkerFlags")}); banksCount = IarewUtils::flagValue( @@ -610,14 +626,18 @@ struct CodeBankPageOptions final struct LibraryOptionsPageOptions final { - enum PrintfFormatter { PrintfAutoFormatter = 0, - PrintfLargeFormatter = 3, - PrintfMediumFormatter = 5, - PrintfSmallFormatter = 6 }; - - enum ScanfFormatter { ScanfAutoFormatter = 0, - ScanfLargeFormatter = 3, - ScanfMediumFormatter = 5 }; + enum PrintfFormatter { + PrintfAutoFormatter = 0, + PrintfLargeFormatter = 3, + PrintfMediumFormatter = 5, + PrintfSmallFormatter = 6 + }; + + enum ScanfFormatter { + ScanfAutoFormatter = 0, + ScanfLargeFormatter = 3, + ScanfMediumFormatter = 5 + }; explicit LibraryOptionsPageOptions(const ProductData &qbsProduct) { @@ -664,11 +684,13 @@ struct LibraryOptionsPageOptions final struct LibraryConfigPageOptions final { - enum RuntimeLibrary { NoLibrary, - NormalDlibLibrary, - CustomDlibLibrary, - ClibLibrary, - CustomClibLibrary }; + enum RuntimeLibrary { + NoLibrary, + NormalDlibLibrary, + CustomDlibLibrary, + ClibLibrary, + CustomClibLibrary + }; explicit LibraryConfigPageOptions(const QString &baseDirectory, const ProductData &qbsProduct) @@ -676,7 +698,7 @@ struct LibraryConfigPageOptions final const auto &qbsProps = qbsProduct.moduleProperties(); const QStringList flags = IarewUtils::cppModuleCompilerFlags(qbsProps); - const QStringList libraryPaths = IarewUtils::cppStringModuleProperties( + const QStringList libraryPaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("staticLibraries")}); const auto libraryBegin = libraryPaths.cbegin(); const auto libraryEnd = libraryPaths.cend(); @@ -747,11 +769,11 @@ struct OutputPageOptions final const ProductData &qbsProduct) { binaryType = IarewUtils::outputBinaryType(qbsProduct); - binaryDirectory = IarewUtils::binaryOutputDirectory( + binaryDirectory = gen::utils::binaryOutputDirectory( baseDirectory, qbsProduct); - objectDirectory = IarewUtils::objectsOutputDirectory( + objectDirectory = gen::utils::objectsOutputDirectory( baseDirectory, qbsProduct); - listingDirectory = IarewUtils::listingOutputDirectory( + listingDirectory = gen::utils::listingOutputDirectory( baseDirectory, qbsProduct); } @@ -776,9 +798,9 @@ Mcs51GeneralSettingsGroup::Mcs51GeneralSettingsGroup( setName(QByteArrayLiteral("General")); setArchiveVersion(kGeneralArchiveVersion); setDataVersion(kGeneralDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildTargetPage(qbsProduct); buildStackHeapPage(qbsProduct); diff --git a/src/plugins/generator/iarew/archs/mcs51/mcs51linkersettingsgroup_v10.cpp b/src/plugins/generator/iarew/archs/mcs51/mcs51linkersettingsgroup_v10.cpp index 04e6f4f3d..c27fa51f2 100644 --- a/src/plugins/generator/iarew/archs/mcs51/mcs51linkersettingsgroup_v10.cpp +++ b/src/plugins/generator/iarew/archs/mcs51/mcs51linkersettingsgroup_v10.cpp @@ -54,7 +54,7 @@ struct ConfigPageOptions final const auto &qbsProps = qbsProduct.moduleProperties(); const QString toolkitPath = IarewUtils::toolkitRootPath(qbsProduct); - entryPoint = IarewUtils::cppStringModuleProperty( + entryPoint = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("entryPoint")); // Enumerate all product linker config files @@ -100,7 +100,7 @@ struct ConfigPageOptions final } // Add libraries search paths. - const QStringList libraryPaths = IarewUtils::cppStringModuleProperties( + const QStringList libraryPaths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("libraryPaths")}); for (const QString &libraryPath : libraryPaths) { const QFileInfo libraryPathInfo(libraryPath); @@ -129,7 +129,7 @@ struct OutputPageOptions final { explicit OutputPageOptions(const ProductData &qbsProduct) { - outputFile = IarewUtils::targetBinary(qbsProduct); + outputFile = gen::utils::targetBinary(qbsProduct); } QString outputFile; @@ -139,13 +139,15 @@ struct OutputPageOptions final struct ListPageOptions final { - enum ListingAction { NoListing, - GenerateListing }; + enum ListingAction { + NoListing, + GenerateListing + }; explicit ListPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - generateMap = IarewUtils::cppBooleanModuleProperty( + generateMap = gen::utils::cppBooleanModuleProperty( qbsProps, QStringLiteral("generateMapFile")) ? ListPageOptions::GenerateListing : ListPageOptions::NoListing; @@ -188,7 +190,7 @@ struct DiagnosticsPageOptions final explicit DiagnosticsPageOptions(const ProductData &qbsProduct) { const auto &qbsProps = qbsProduct.moduleProperties(); - const QString warningLevel = IarewUtils::cppStringModuleProperty( + const QString warningLevel = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("warningLevel")); suppressAllWarnings = (warningLevel == QLatin1String("none")); } @@ -211,9 +213,9 @@ Mcs51LinkerSettingsGroup::Mcs51LinkerSettingsGroup( setName(QByteArrayLiteral("XLINK")); setArchiveVersion(kLinkerArchiveVersion); setDataVersion(kLinkerDataVersion); - setDataDebugInfo(IarewUtils::debugInformation(qbsProduct)); + setDataDebugInfo(gen::utils::debugInformation(qbsProduct)); - const QString buildRootDirectory = IarewUtils::buildRootPath(qbsProject); + const QString buildRootDirectory = gen::utils::buildRootPath(qbsProject); buildConfigPage(buildRootDirectory, qbsProduct); buildOutputPage(qbsProduct); diff --git a/src/plugins/generator/iarew/iarew.pro b/src/plugins/generator/iarew/iarew.pro index 59e4be2f3..ec61f758f 100644 --- a/src/plugins/generator/iarew/iarew.pro +++ b/src/plugins/generator/iarew/iarew.pro @@ -18,8 +18,6 @@ HEADERS += \ $$PWD/iarewoptionpropertygroup.h \ $$PWD/iarewproject.h \ $$PWD/iarewprojectwriter.h \ - $$PWD/iarewproperty.h \ - $$PWD/iarewpropertygroup.h \ $$PWD/iarewsettingspropertygroup.h \ $$PWD/iarewsourcefilepropertygroup.h \ $$PWD/iarewsourcefilespropertygroup.h \ @@ -27,8 +25,7 @@ HEADERS += \ $$PWD/iarewutils.h \ $$PWD/iarewversioninfo.h \ $$PWD/iarewworkspace.h \ - $$PWD/iarewworkspacewriter.h \ - $$PWD/iiarewnodevisitor.h \ + $$PWD/iarewworkspacewriter.h SOURCES += \ $$PWD/iarewfileversionproperty.cpp \ @@ -36,8 +33,6 @@ SOURCES += \ $$PWD/iarewoptionpropertygroup.cpp \ $$PWD/iarewproject.cpp \ $$PWD/iarewprojectwriter.cpp \ - $$PWD/iarewproperty.cpp \ - $$PWD/iarewpropertygroup.cpp \ $$PWD/iarewsettingspropertygroup.cpp \ $$PWD/iarewsourcefilepropertygroup.cpp \ $$PWD/iarewsourcefilespropertygroup.cpp \ @@ -45,7 +40,7 @@ SOURCES += \ $$PWD/iarewutils.cpp \ $$PWD/iarewversioninfo.cpp \ $$PWD/iarewworkspace.cpp \ - $$PWD/iarewworkspacewriter.cpp \ + $$PWD/iarewworkspacewriter.cpp # For ARM architecture. @@ -55,7 +50,7 @@ HEADERS += \ $$PWD/archs/arm/armbuildconfigurationgroup_v8.h \ $$PWD/archs/arm/armcompilersettingsgroup_v8.h \ $$PWD/archs/arm/armgeneralsettingsgroup_v8.h \ - $$PWD/archs/arm/armlinkersettingsgroup_v8.h \ + $$PWD/archs/arm/armlinkersettingsgroup_v8.h SOURCES += \ $$PWD/archs/arm/armarchiversettingsgroup_v8.cpp \ @@ -63,7 +58,7 @@ SOURCES += \ $$PWD/archs/arm/armbuildconfigurationgroup_v8.cpp \ $$PWD/archs/arm/armcompilersettingsgroup_v8.cpp \ $$PWD/archs/arm/armgeneralsettingsgroup_v8.cpp \ - $$PWD/archs/arm/armlinkersettingsgroup_v8.cpp \ + $$PWD/archs/arm/armlinkersettingsgroup_v8.cpp # For AVR architecture. @@ -73,7 +68,7 @@ HEADERS += \ $$PWD/archs/avr/avrbuildconfigurationgroup_v7.h \ $$PWD/archs/avr/avrcompilersettingsgroup_v7.h \ $$PWD/archs/avr/avrgeneralsettingsgroup_v7.h \ - $$PWD/archs/avr/avrlinkersettingsgroup_v7.h \ + $$PWD/archs/avr/avrlinkersettingsgroup_v7.h SOURCES += \ $$PWD/archs/avr/avrarchiversettingsgroup_v7.cpp \ @@ -81,7 +76,7 @@ SOURCES += \ $$PWD/archs/avr/avrbuildconfigurationgroup_v7.cpp \ $$PWD/archs/avr/avrcompilersettingsgroup_v7.cpp \ $$PWD/archs/avr/avrgeneralsettingsgroup_v7.cpp \ - $$PWD/archs/avr/avrlinkersettingsgroup_v7.cpp \ + $$PWD/archs/avr/avrlinkersettingsgroup_v7.cpp # For MCS51 architecture. @@ -91,7 +86,7 @@ HEADERS += \ $$PWD/archs/mcs51/mcs51buildconfigurationgroup_v10.h \ $$PWD/archs/mcs51/mcs51compilersettingsgroup_v10.h \ $$PWD/archs/mcs51/mcs51generalsettingsgroup_v10.h \ - $$PWD/archs/mcs51/mcs51linkersettingsgroup_v10.h \ + $$PWD/archs/mcs51/mcs51linkersettingsgroup_v10.h SOURCES += \ $$PWD/archs/mcs51/mcs51archiversettingsgroup_v10.cpp \ @@ -99,4 +94,4 @@ SOURCES += \ $$PWD/archs/mcs51/mcs51buildconfigurationgroup_v10.cpp \ $$PWD/archs/mcs51/mcs51compilersettingsgroup_v10.cpp \ $$PWD/archs/mcs51/mcs51generalsettingsgroup_v10.cpp \ - $$PWD/archs/mcs51/mcs51linkersettingsgroup_v10.cpp \ + $$PWD/archs/mcs51/mcs51linkersettingsgroup_v10.cpp diff --git a/src/plugins/generator/iarew/iarew.qbs b/src/plugins/generator/iarew/iarew.qbs index e7d69f60b..46ab43160 100644 --- a/src/plugins/generator/iarew/iarew.qbs +++ b/src/plugins/generator/iarew/iarew.qbs @@ -21,10 +21,6 @@ QbsPlugin { "iarewproject.h", "iarewprojectwriter.cpp", "iarewprojectwriter.h", - "iarewproperty.cpp", - "iarewproperty.h", - "iarewpropertygroup.cpp", - "iarewpropertygroup.h", "iarewsettingspropertygroup.cpp", "iarewsettingspropertygroup.h", "iarewsourcefilepropertygroup.cpp", @@ -41,7 +37,6 @@ QbsPlugin { "iarewworkspace.h", "iarewworkspacewriter.cpp", "iarewworkspacewriter.h", - "iiarewnodevisitor.h", ] } Group { diff --git a/src/plugins/generator/iarew/iarewfileversionproperty.h b/src/plugins/generator/iarew/iarewfileversionproperty.h index b9116b299..d377979fa 100644 --- a/src/plugins/generator/iarew/iarewfileversionproperty.h +++ b/src/plugins/generator/iarew/iarewfileversionproperty.h @@ -31,16 +31,17 @@ #ifndef QBS_IAREWFILEVERSIONPROPERTY_H #define QBS_IAREWFILEVERSIONPROPERTY_H -#include "iarewproperty.h" +#include <generators/xmlproperty.h> namespace qbs { class IarewVersionInfo; -class IarewFileVersionProperty final : public IarewProperty +class IarewFileVersionProperty final : public gen::xml::Property { public: - explicit IarewFileVersionProperty(const IarewVersionInfo &versionInfo); + explicit IarewFileVersionProperty( + const IarewVersionInfo &versionInfo); }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewgenerator.cpp b/src/plugins/generator/iarew/iarewgenerator.cpp index ca69dcc68..e6b308182 100644 --- a/src/plugins/generator/iarew/iarewgenerator.cpp +++ b/src/plugins/generator/iarew/iarewgenerator.cpp @@ -147,11 +147,12 @@ void IarewGenerator::visitProduct(const GeneratableProject &project, Q_UNUSED(projectData); const QString projectFilePath = targetFilePath( productData, project.baseBuildDirectory().absolutePath()); - const auto targetProject = std::make_shared<IarewProject>(project, productData, - m_versionInfo); + const auto targetProject = std::make_shared<IarewProject>( + project, productData, + m_versionInfo); m_projects.insert({projectFilePath, targetProject}); - m_workspace->addProjectPath(projectFilePath); + m_workspace->addProject(projectFilePath); } } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewoptionpropertygroup.cpp b/src/plugins/generator/iarew/iarewoptionpropertygroup.cpp index e65182c68..86f12016b 100644 --- a/src/plugins/generator/iarew/iarewoptionpropertygroup.cpp +++ b/src/plugins/generator/iarew/iarewoptionpropertygroup.cpp @@ -29,27 +29,29 @@ ****************************************************************************/ #include "iarewoptionpropertygroup.h" -#include "iarewproperty.h" namespace qbs { IarewOptionPropertyGroup::IarewOptionPropertyGroup( QByteArray name, QVariant version, const QVariantList &states) - : IarewPropertyGroup(QByteArrayLiteral("option")) + : gen::xml::PropertyGroup(QByteArrayLiteral("option")) { // Append name property item. - appendChild<IarewProperty>(QByteArrayLiteral("name"), std::move(name)); + appendChild<gen::xml::Property>(QByteArrayLiteral("name"), + std::move(name)); // Append version property item. if (!version.isNull()) - appendChild<IarewProperty>(QByteArrayLiteral("version"), std::move(version)); + appendChild<gen::xml::Property>(QByteArrayLiteral("version"), + std::move(version)); // Append state property items. for (const auto &state : states) { if (state.isNull()) continue; - appendChild<IarewProperty>(QByteArrayLiteral("state"), std::move(state)); + appendChild<gen::xml::Property>(QByteArrayLiteral("state"), + std::move(state)); } } diff --git a/src/plugins/generator/iarew/iarewoptionpropertygroup.h b/src/plugins/generator/iarew/iarewoptionpropertygroup.h index e562e7f74..272ee57e4 100644 --- a/src/plugins/generator/iarew/iarewoptionpropertygroup.h +++ b/src/plugins/generator/iarew/iarewoptionpropertygroup.h @@ -31,17 +31,19 @@ #ifndef QBS_IAREWOPTIONPROPERTYGROUP_H #define QBS_IAREWOPTIONPROPERTYGROUP_H -#include "iarewpropertygroup.h" +#include <generators/xmlpropertygroup.h> -#include <QtCore/qvariant.h> +//#include <QtCore/qvariant.h> namespace qbs { -class IarewOptionPropertyGroup final : public IarewPropertyGroup +class IarewOptionPropertyGroup final + : public gen::xml::PropertyGroup { public: - explicit IarewOptionPropertyGroup(QByteArray name, QVariant version, - const QVariantList &states); + explicit IarewOptionPropertyGroup( + QByteArray name, QVariant version, + const QVariantList &states); }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewproject.cpp b/src/plugins/generator/iarew/iarewproject.cpp index ee3775798..7fbad251f 100644 --- a/src/plugins/generator/iarew/iarewproject.cpp +++ b/src/plugins/generator/iarew/iarewproject.cpp @@ -33,7 +33,6 @@ #include "iarewsourcefilespropertygroup.h" #include "iarewutils.h" #include "iarewversioninfo.h" -#include "iiarewnodevisitor.h" #include "archs/arm/armbuildconfigurationgroup_v8.h" #include "archs/avr/avrbuildconfigurationgroup_v7.h" @@ -65,28 +64,30 @@ IarewProject::IarewProject(const GeneratableProject &genProject, const int configsCount = std::max(genProject.projects.size(), genProduct.data.size()); for (auto configIndex = 0; configIndex < configsCount; ++configIndex) { - const Project qbsProject = genProject.projects.values().at(configIndex); + const qbs::Project qbsProject = genProject.projects + .values().at(configIndex); const ProductData qbsProduct = genProduct.data.values().at(configIndex); - const QString confName = IarewUtils::buildConfigurationName(qbsProject); - const std::vector<ProductData> qbsProductDeps = IarewUtils::dependenciesOf + const QString confName = gen::utils::buildConfigurationName(qbsProject); + const std::vector<ProductData> qbsProductDeps = gen::utils::dependenciesOf (qbsProduct, genProject, confName); - const auto arch = IarewUtils::architecture(qbsProject); - if (arch == IarewUtils::Architecture::UnknownArchitecture) + const auto arch = gen::utils::architecture(qbsProject); + if (arch == gen::utils::Architecture::Unknown) throw ErrorInfo(Internal::Tr::tr("Target architecture is not set," " please use the 'profile' option")); // Construct the build configuration item, which are depend from // the architecture and the version. const auto factoryEnd = m_factories.cend(); - const auto factoryIt = std::find_if(m_factories.cbegin(), factoryEnd, - [arch, versionInfo](const auto &factory) { + const auto factoryIt = std::find_if( + m_factories.cbegin(), factoryEnd, + [arch, versionInfo](const auto &factory) { return factory->canCreate(arch, versionInfo.version()); }); if (factoryIt == factoryEnd) { throw ErrorInfo(Internal::Tr::tr("Incompatible target architecture '%1'" " for IAR EW version %2xxx") - .arg(IarewUtils::architectureName(arch)) + .arg(gen::utils::architectureName(arch)) .arg(versionInfo.marketingVersion())); } auto configGroup = (*factoryIt)->create( @@ -120,14 +121,4 @@ IarewProject::IarewProject(const GeneratableProject &genProject, } } -void IarewProject::accept(IIarewNodeVisitor *visitor) const -{ - visitor->visitStart(this); - - for (const auto &child : children()) - child->accept(visitor); - - visitor->visitEnd(this); -} - } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewproject.h b/src/plugins/generator/iarew/iarewproject.h index 642407bab..567a58c55 100644 --- a/src/plugins/generator/iarew/iarewproject.h +++ b/src/plugins/generator/iarew/iarewproject.h @@ -31,10 +31,9 @@ #ifndef QBS_IAREWPROJECT_H #define QBS_IAREWPROJECT_H -#include "iarewproperty.h" -#include "iarewpropertygroup.h" - #include <generators/generatordata.h> +#include <generators/xmlproject.h> +#include <generators/xmlpropertygroup.h> #include <memory> @@ -42,16 +41,14 @@ namespace qbs { class IarewVersionInfo; -class IarewProject final : public IarewProperty +class IarewProject final : public gen::xml::Project { public: explicit IarewProject(const GeneratableProject &genProject, const GeneratableProductData &genProduct, const IarewVersionInfo &versionInfo); - void accept(IIarewNodeVisitor *visitor) const final; - private: - std::vector<std::unique_ptr<IarewPropertyGroupFactory>> m_factories; + std::vector<std::unique_ptr<gen::xml::PropertyGroupFactory>> m_factories; }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewprojectwriter.cpp b/src/plugins/generator/iarew/iarewprojectwriter.cpp index 046a2b374..a1c912a8c 100644 --- a/src/plugins/generator/iarew/iarewprojectwriter.cpp +++ b/src/plugins/generator/iarew/iarewprojectwriter.cpp @@ -28,66 +28,25 @@ ** ****************************************************************************/ -#include "iarewproject.h" #include "iarewprojectwriter.h" -#include "iarewproperty.h" -#include "iarewpropertygroup.h" - -#include <ostream> namespace qbs { IarewProjectWriter::IarewProjectWriter(std::ostream *device) - : m_device(device) -{ - m_writer.reset(new QXmlStreamWriter(&m_buffer)); - m_writer->setAutoFormatting(true); -} - -bool IarewProjectWriter::write(const IarewProject *project) + : gen::xml::ProjectWriter(device) { - m_buffer.clear(); - m_writer->writeStartDocument(); - project->accept(this); - m_writer->writeEndDocument(); - if (m_writer->hasError()) - return false; - m_device->write(&*std::begin(m_buffer), m_buffer.size()); - return m_device->good(); } -void IarewProjectWriter::visitStart(const IarewProject *project) +void IarewProjectWriter::visitStart(const gen::xml::Project *project) { Q_UNUSED(project) - m_writer->writeStartElement(QStringLiteral("project")); + writer()->writeStartElement(QStringLiteral("project")); } -void IarewProjectWriter::visitEnd(const IarewProject *project) +void IarewProjectWriter::visitEnd(const gen::xml::Project *project) { Q_UNUSED(project) - m_writer->writeEndElement(); -} - -void IarewProjectWriter::visitStart(const IarewProperty *property) -{ - const QString stringValue = property->value().toString(); - m_writer->writeTextElement(QString::fromUtf8(property->name()), stringValue); -} - -void IarewProjectWriter::visitEnd(const IarewProperty *property) -{ - Q_UNUSED(property) -} - -void IarewProjectWriter::visitStart(const IarewPropertyGroup *propertyGroup) -{ - m_writer->writeStartElement(QString::fromUtf8(propertyGroup->name())); -} - -void IarewProjectWriter::visitEnd(const IarewPropertyGroup *propertyGroup) -{ - Q_UNUSED(propertyGroup) - m_writer->writeEndElement(); + writer()->writeEndElement(); } } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewprojectwriter.h b/src/plugins/generator/iarew/iarewprojectwriter.h index db4c1c840..ae425b29e 100644 --- a/src/plugins/generator/iarew/iarewprojectwriter.h +++ b/src/plugins/generator/iarew/iarewprojectwriter.h @@ -31,32 +31,19 @@ #ifndef QBS_IAREWPROJECTWRITER_H #define QBS_IAREWPROJECTWRITER_H -#include "iiarewnodevisitor.h" +#include <generators/xmlprojectwriter.h> namespace qbs { -class IarewProject; - -class IarewProjectWriter final : public IIarewNodeVisitor +class IarewProjectWriter final : public gen::xml::ProjectWriter { Q_DISABLE_COPY(IarewProjectWriter) public: explicit IarewProjectWriter(std::ostream *device); - bool write(const IarewProject *project); private: - void visitStart(const IarewProject *project) final; - void visitEnd(const IarewProject *project) final; - - void visitStart(const IarewProperty *property) final; - void visitEnd(const IarewProperty *property) final; - - void visitStart(const IarewPropertyGroup *propertyGroup) final; - void visitEnd(const IarewPropertyGroup *propertyGroup) final; - - std::ostream *m_device = nullptr; - QByteArray m_buffer; - std::unique_ptr<QXmlStreamWriter> m_writer; + void visitStart(const gen::xml::Project *project) final; + void visitEnd(const gen::xml::Project *project) final; }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewsettingspropertygroup.cpp b/src/plugins/generator/iarew/iarewsettingspropertygroup.cpp index e51cd317a..de6fae45a 100644 --- a/src/plugins/generator/iarew/iarewsettingspropertygroup.cpp +++ b/src/plugins/generator/iarew/iarewsettingspropertygroup.cpp @@ -29,7 +29,6 @@ ****************************************************************************/ #include "iarewoptionpropertygroup.h" -#include "iarewproperty.h" #include "iarewsettingspropertygroup.h" namespace qbs { @@ -37,28 +36,30 @@ namespace qbs { constexpr int kDataWantNonLocalPropertyValue = 1; IarewSettingsPropertyGroup::IarewSettingsPropertyGroup() - : IarewPropertyGroup(QByteArrayLiteral("settings")) + : gen::xml::PropertyGroup(QByteArrayLiteral("settings")) { // Append name property item. - m_nameProperty = appendChild<IarewProperty>( + m_nameProperty = appendChild<gen::xml::Property>( QByteArrayLiteral("name"), QVariant{}); // Append archive version property item. - m_archiveVersionProperty = appendChild<IarewProperty>( + m_archiveVersionProperty = appendChild<gen::xml::Property>( QByteArrayLiteral("archiveVersion"), QVariant{}); // Append data property group item. - m_dataPropertyGroup = appendChild<IarewPropertyGroup>( + m_dataPropertyGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("data")); // Append data version property item. - m_dataVersionProperty = m_dataPropertyGroup->appendChild<IarewProperty>( + m_dataVersionProperty = m_dataPropertyGroup->appendChild< + gen::xml::Property>( QByteArrayLiteral("version"), QVariant{}); // Append data want non-local property item. - m_dataPropertyGroup->appendChild<IarewProperty>( + m_dataPropertyGroup->appendChild<gen::xml::Property>( QByteArrayLiteral("wantNonLocal"), kDataWantNonLocalPropertyValue); // Append data debug property item. - m_dataDebugProperty = m_dataPropertyGroup->appendChild<IarewProperty>( + m_dataDebugProperty = m_dataPropertyGroup->appendChild< + gen::xml::Property>( QByteArrayLiteral("debug"), QVariant{}); } @@ -72,7 +73,8 @@ QByteArray IarewSettingsPropertyGroup::name() const return m_nameProperty->value().toByteArray(); } -void IarewSettingsPropertyGroup::setArchiveVersion(int archiveVersion) +void IarewSettingsPropertyGroup::setArchiveVersion( + int archiveVersion) { m_archiveVersionProperty->setValue(archiveVersion); } @@ -92,9 +94,10 @@ void IarewSettingsPropertyGroup::setDataDebugInfo(int debugInfo) m_dataDebugProperty->setValue(debugInfo); } -void IarewSettingsPropertyGroup::addOptionsGroup(QByteArray name, - QVariant version, - const QVariantList &states) +void IarewSettingsPropertyGroup::addOptionsGroup( + QByteArray name, + QVariant version, + const QVariantList &states) { m_dataPropertyGroup->appendChild<IarewOptionPropertyGroup>( std::move(name), std::move(version), states); diff --git a/src/plugins/generator/iarew/iarewsettingspropertygroup.h b/src/plugins/generator/iarew/iarewsettingspropertygroup.h index aca90492a..79de48018 100644 --- a/src/plugins/generator/iarew/iarewsettingspropertygroup.h +++ b/src/plugins/generator/iarew/iarewsettingspropertygroup.h @@ -31,11 +31,11 @@ #ifndef QBS_IAREWSETTINGSPROPERTYGROUP_H #define QBS_IAREWSETTINGSPROPERTYGROUP_H -#include "iarewpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { -class IarewSettingsPropertyGroup : public IarewPropertyGroup +class IarewSettingsPropertyGroup : public gen::xml::PropertyGroup { public: explicit IarewSettingsPropertyGroup(); @@ -55,12 +55,12 @@ protected: private: // Don't delete all this RAW pointers explicitly! - IarewProperty *m_nameProperty = nullptr; - IarewProperty *m_archiveVersionProperty = nullptr; + gen::xml::Property *m_nameProperty = nullptr; + gen::xml::Property *m_archiveVersionProperty = nullptr; - IarewProperty *m_dataPropertyGroup = nullptr; - IarewProperty *m_dataVersionProperty = nullptr; - IarewProperty *m_dataDebugProperty = nullptr; + gen::xml::Property *m_dataPropertyGroup = nullptr; + gen::xml::Property *m_dataVersionProperty = nullptr; + gen::xml::Property *m_dataDebugProperty = nullptr; }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewsourcefilepropertygroup.cpp b/src/plugins/generator/iarew/iarewsourcefilepropertygroup.cpp index e7b09484c..33c26e8b8 100644 --- a/src/plugins/generator/iarew/iarewsourcefilepropertygroup.cpp +++ b/src/plugins/generator/iarew/iarewsourcefilepropertygroup.cpp @@ -28,8 +28,8 @@ ** ****************************************************************************/ -#include "iarewproperty.h" #include "iarewsourcefilepropertygroup.h" +#include "iarewutils.h" #include <generators/generatordata.h> @@ -40,13 +40,15 @@ namespace qbs { IarewSourceFilePropertyGroup::IarewSourceFilePropertyGroup( const GeneratableProject &genProject, const ArtifactData &sourceArtifact) - : IarewPropertyGroup(QByteArrayLiteral("file")) + : gen::xml::PropertyGroup(QByteArrayLiteral("file")) { // Create file path property item. const QString fullFilePath = sourceArtifact.filePath(); const QString relativeFilePath = IarewUtils::projectRelativeFilePath( - genProject.baseBuildDirectory().absolutePath(), fullFilePath); - appendChild<IarewProperty>(QByteArrayLiteral("name"), relativeFilePath); + genProject.baseBuildDirectory().absolutePath(), + fullFilePath); + appendChild<gen::xml::Property>(QByteArrayLiteral("name"), + relativeFilePath); } } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewsourcefilepropertygroup.h b/src/plugins/generator/iarew/iarewsourcefilepropertygroup.h index dd714929f..5f88cec27 100644 --- a/src/plugins/generator/iarew/iarewsourcefilepropertygroup.h +++ b/src/plugins/generator/iarew/iarewsourcefilepropertygroup.h @@ -31,18 +31,20 @@ #ifndef QBS_IAREWSOURCEFILEPROPERTYGROUP_H #define QBS_IAREWSOURCEFILEPROPERTYGROUP_H -#include "iarewpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { class ArtifactData; class GeneratableProject; -class IarewSourceFilePropertyGroup final : public IarewPropertyGroup +class IarewSourceFilePropertyGroup final + : public gen::xml::PropertyGroup { public: - explicit IarewSourceFilePropertyGroup(const GeneratableProject &genProject, - const ArtifactData &sourceArtifact); + explicit IarewSourceFilePropertyGroup( + const GeneratableProject &genProject, + const ArtifactData &sourceArtifact); }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewsourcefilespropertygroup.cpp b/src/plugins/generator/iarew/iarewsourcefilespropertygroup.cpp index b87693bce..adb5925b2 100644 --- a/src/plugins/generator/iarew/iarewsourcefilespropertygroup.cpp +++ b/src/plugins/generator/iarew/iarewsourcefilespropertygroup.cpp @@ -28,7 +28,6 @@ ** ****************************************************************************/ -#include "iarewproperty.h" #include "iarewsourcefilepropertygroup.h" #include "iarewsourcefilespropertygroup.h" @@ -42,14 +41,16 @@ IarewSourceFilesPropertyGroup::IarewSourceFilesPropertyGroup( const GeneratableProject &genProject, const QString &filesGroupName, const QList<ArtifactData> &sourceFiles) - : IarewPropertyGroup(QByteArrayLiteral("group")) + : gen::xml::PropertyGroup(QByteArrayLiteral("group")) { // Create group name property item. - appendChild<IarewProperty>(QByteArrayLiteral("name"), filesGroupName); + appendChild<gen::xml::Property>(QByteArrayLiteral("name"), + filesGroupName); // Create file paths property items. for (const auto &sourceFile : sourceFiles) - appendChild<IarewSourceFilePropertyGroup>(genProject, sourceFile); + appendChild<IarewSourceFilePropertyGroup>(genProject, + sourceFile); } } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewsourcefilespropertygroup.h b/src/plugins/generator/iarew/iarewsourcefilespropertygroup.h index ed6a604b0..8d8a4be0c 100644 --- a/src/plugins/generator/iarew/iarewsourcefilespropertygroup.h +++ b/src/plugins/generator/iarew/iarewsourcefilespropertygroup.h @@ -31,18 +31,18 @@ #ifndef QBS_IAREWSOURCEFILESPROPERTYGROUP_H #define QBS_IAREWSOURCEFILESPROPERTYGROUP_H -#include "iarewpropertygroup.h" - -#include <generators/generatordata.h> +#include <generators/xmlpropertygroup.h> namespace qbs { -class IarewSourceFilesPropertyGroup final : public IarewPropertyGroup +class IarewSourceFilesPropertyGroup final + : public gen::xml::PropertyGroup { public: - explicit IarewSourceFilesPropertyGroup(const GeneratableProject &genProject, - const QString &filesGroupName, - const QList<ArtifactData> &sourceFiles); + explicit IarewSourceFilesPropertyGroup( + const GeneratableProject &genProject, + const QString &filesGroupName, + const QList<ArtifactData> &sourceFiles); }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewtoolchainpropertygroup.cpp b/src/plugins/generator/iarew/iarewtoolchainpropertygroup.cpp index dc1c812e1..dba5015bf 100644 --- a/src/plugins/generator/iarew/iarewtoolchainpropertygroup.cpp +++ b/src/plugins/generator/iarew/iarewtoolchainpropertygroup.cpp @@ -29,13 +29,12 @@ ****************************************************************************/ #include "iarewtoolchainpropertygroup.h" -#include "iarewproperty.h" namespace qbs { IarewToolchainPropertyGroup::IarewToolchainPropertyGroup( const QByteArray &toolchainName) - : IarewPropertyGroup(QByteArrayLiteral("toolchain")) + : gen::xml::PropertyGroup(QByteArrayLiteral("toolchain")) { // Append toolchain name property item. appendProperty(QByteArrayLiteral("name"), toolchainName); diff --git a/src/plugins/generator/iarew/iarewtoolchainpropertygroup.h b/src/plugins/generator/iarew/iarewtoolchainpropertygroup.h index a4271b99b..e5bd6f071 100644 --- a/src/plugins/generator/iarew/iarewtoolchainpropertygroup.h +++ b/src/plugins/generator/iarew/iarewtoolchainpropertygroup.h @@ -31,14 +31,16 @@ #ifndef QBS_IAREWTOOLCHAINPROPERTYGROUP_H #define QBS_IAREWTOOLCHAINPROPERTYGROUP_H -#include "iarewpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { -class IarewToolchainPropertyGroup final : public IarewPropertyGroup +class IarewToolchainPropertyGroup final + : public gen::xml::PropertyGroup { public: - explicit IarewToolchainPropertyGroup(const QByteArray &toolchainName); + explicit IarewToolchainPropertyGroup( + const QByteArray &toolchainName); }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewutils.cpp b/src/plugins/generator/iarew/iarewutils.cpp index a24e48490..da6237df7 100644 --- a/src/plugins/generator/iarew/iarewutils.cpp +++ b/src/plugins/generator/iarew/iarewutils.cpp @@ -30,53 +30,11 @@ #include "iarewutils.h" +#include <generators/generatorutils.h> + namespace qbs { namespace IarewUtils { -QString architectureName(Architecture arch) -{ - switch (arch) { - case Architecture::ArmArchitecture: - return QStringLiteral("arm"); - case Architecture::AvrArchitecture: - return QStringLiteral("avr"); - case Architecture::Mcs51Architecture: - return QStringLiteral("mcs51"); - default: - return QStringLiteral("unknown"); - } -} - -Architecture architecture(const Project &qbsProject) -{ - const auto qbsArch = qbsProject.projectConfiguration() - .value(Internal::StringConstants::qbsModule()).toMap() - .value(QStringLiteral("architecture")).toString(); - - if (qbsArch == QLatin1String("arm")) - return Architecture::ArmArchitecture; - if (qbsArch == QLatin1String("avr")) - return Architecture::AvrArchitecture; - if (qbsArch == QLatin1String("mcs51")) - return Architecture::Mcs51Architecture; - return Architecture::UnknownArchitecture; -} - -QString buildConfigurationName(const Project &qbsProject) -{ - return qbsProject.projectConfiguration() - .value(Internal::StringConstants::qbsModule()).toMap() - .value(QStringLiteral("configurationName")).toString(); -} - -int debugInformation(const ProductData &qbsProduct) -{ - return qbsProduct.moduleProperties().getModuleProperty( - Internal::StringConstants::qbsModule(), - QStringLiteral("debugInformation")) - .toInt(); -} - QString toolkitRootPath(const ProductData &qbsProduct) { QDir dir(qbsProduct.moduleProperties() @@ -97,93 +55,18 @@ QString clibToolkitRootPath(const ProductData &qbsProduct) return toolkitRootPath(qbsProduct) + QLatin1String("/lib/clib"); } -QString buildRootPath(const Project &qbsProject) -{ - QDir dir(qbsProject.projectData().buildDirectory()); - dir.cdUp(); - return dir.absolutePath(); -} - -QString relativeFilePath(const QString &baseDirectory, - const QString &fullFilePath) -{ - return QDir(baseDirectory).relativeFilePath(fullFilePath); -} - QString toolkitRelativeFilePath(const QString &basePath, const QString &fullFilePath) { return QLatin1String("$TOOLKIT_DIR$/") - + IarewUtils::relativeFilePath(basePath, fullFilePath); + + gen::utils::relativeFilePath(basePath, fullFilePath); } QString projectRelativeFilePath(const QString &basePath, const QString &fullFilePath) { return QLatin1String("$PROJ_DIR$/") - + IarewUtils::relativeFilePath(basePath, fullFilePath); -} - -QString binaryOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - return QDir(baseDirectory).relativeFilePath(qbsProduct.buildDirectory()) - + QLatin1String("/bin"); -} - -QString objectsOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - return QDir(baseDirectory).relativeFilePath(qbsProduct.buildDirectory()) - + QLatin1String("/obj"); -} - -QString listingOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - return QDir(baseDirectory).relativeFilePath(qbsProduct.buildDirectory()) - + QLatin1String("/lst"); -} - -std::vector<ProductData> dependenciesOf(const ProductData &qbsProduct, - const GeneratableProject &genProject, - const QString configurationName) -{ - std::vector<ProductData> result; - const auto depsNames = qbsProduct.dependencies(); - for (const auto &product : qAsConst(genProject.products)) { - const auto pt = product.type(); - if (!pt.contains(QLatin1String("staticlibrary"))) - continue; - const auto pn = product.name(); - if (!depsNames.contains(pn)) - continue; - result.push_back(product.data.value(configurationName)); - } - return result; -} - -QString targetBinary(const ProductData &qbsProduct) -{ - const auto type = qbsProduct.type(); - if (type.contains(QLatin1String("application"))) { - return QFileInfo(qbsProduct.targetExecutable()).fileName(); - } else if (type.contains(QLatin1String("staticlibrary"))) { - const auto artifacts = qbsProduct.targetArtifacts(); - for (const auto &artifact : artifacts) { - if (artifact.fileTags().contains(QLatin1String("staticlibrary"))) - return QFileInfo(artifact.filePath()).fileName(); - } - } - - return {}; -} - -QString targetBinaryPath(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - return binaryOutputDirectory(baseDirectory, qbsProduct) - + QLatin1Char('/') + targetBinary(qbsProduct); + + gen::utils::relativeFilePath(basePath, fullFilePath); } OutputBinaryType outputBinaryType(const ProductData &qbsProduct) @@ -196,49 +79,6 @@ OutputBinaryType outputBinaryType(const ProductData &qbsProduct) return ApplicationOutputType; } -QString cppStringModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName) -{ - return qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), - propertyName).toString(); -} - -bool cppBooleanModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName) -{ - return qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), - propertyName).toBool(); -} - -int cppIntegerModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName) -{ - return qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), - propertyName).toInt(); -} - -QStringList cppStringModuleProperties(const PropertyMap &qbsProps, - const QStringList &propertyNames) -{ - QStringList properties; - for (const auto &propertyName : propertyNames) { - properties << qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), - propertyName).toStringList(); - } - return properties; -} - -QVariantList cppVariantModuleProperties(const PropertyMap &qbsProps, - const QStringList &propertyNames) -{ - QVariantList properties; - for (const auto &propertyName : propertyNames) { - properties << qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), - propertyName).toList(); - } - return properties; -} - QString flagValue(const QStringList &flags, const QString &flagKey) { // Seach for full 'flagKey' option matching. @@ -288,7 +128,7 @@ QVariantList flagValues(const QStringList &flags, const QString &flagKey) QStringList cppModuleCompilerFlags(const PropertyMap &qbsProps) { - return cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverFlags"), QStringLiteral("cFlags"), QStringLiteral("cppFlags"), QStringLiteral("cxxFlags"), QStringLiteral("commonCompilerFlags")}); @@ -296,13 +136,13 @@ QStringList cppModuleCompilerFlags(const PropertyMap &qbsProps) QStringList cppModuleAssemblerFlags(const PropertyMap &qbsProps) { - return cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("assemblerFlags")}); } QStringList cppModuleLinkerFlags(const PropertyMap &qbsProps) { - return cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverFlags"), QStringLiteral("driverLinkerFlags")}); } diff --git a/src/plugins/generator/iarew/iarewutils.h b/src/plugins/generator/iarew/iarewutils.h index c0adf3a9e..6599c27e3 100644 --- a/src/plugins/generator/iarew/iarewutils.h +++ b/src/plugins/generator/iarew/iarewutils.h @@ -38,20 +38,12 @@ namespace qbs { namespace IarewUtils { -enum class Architecture { - ArmArchitecture, - AvrArchitecture, - Mcs51Architecture, - UnknownArchitecture +enum OutputBinaryType { + ApplicationOutputType, + LibraryOutputType }; -QString architectureName(Architecture arch); - -Architecture architecture(const Project &qbsProject); - -QString buildConfigurationName(const Project &qbsProject); - -int debugInformation(const ProductData &qbsProduct); +OutputBinaryType outputBinaryType(const ProductData &qbsProduct); QString toolkitRootPath(const ProductData &qbsProduct); @@ -59,54 +51,12 @@ QString dlibToolkitRootPath(const ProductData &qbsProduct); QString clibToolkitRootPath(const ProductData &qbsProduct); -QString buildRootPath(const Project &qbsProject); - -QString relativeFilePath(const QString &baseDirectory, - const QString &fullFilePath); - QString toolkitRelativeFilePath(const QString &basePath, const QString &fullFilePath); QString projectRelativeFilePath(const QString &basePath, const QString &fullFilePath); -QString binaryOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct); - -QString objectsOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct); - -QString listingOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct); - -std::vector<ProductData> dependenciesOf(const ProductData &qbsProduct, - const GeneratableProject &genProject, - const QString configurationName); - -QString targetBinary(const ProductData &qbsProduct); - -QString targetBinaryPath(const QString &baseDirectory, - const ProductData &qbsProduct); - -enum OutputBinaryType { ApplicationOutputType, LibraryOutputType }; - -OutputBinaryType outputBinaryType(const ProductData &qbsProduct); - -QString cppStringModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName); - -bool cppBooleanModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName); - -int cppIntegerModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName); - -QStringList cppStringModuleProperties(const PropertyMap &qbsProps, - const QStringList &propertyNames); - -QVariantList cppVariantModuleProperties(const PropertyMap &qbsProps, - const QStringList &propertyNames); - QString flagValue(const QStringList &flags, const QString &flagKey); QVariantList flagValues(const QStringList &flags, const QString &flagKey); diff --git a/src/plugins/generator/iarew/iarewversioninfo.cpp b/src/plugins/generator/iarew/iarewversioninfo.cpp index f0293b998..7191948ad 100644 --- a/src/plugins/generator/iarew/iarewversioninfo.cpp +++ b/src/plugins/generator/iarew/iarewversioninfo.cpp @@ -39,65 +39,37 @@ #include "iarewversioninfo.h" -#include <tools/qbsassert.h> - #include <QtCore/qdebug.h> -#include <QtCore/qglobal.h> namespace qbs { -IarewVersionInfo::IarewVersionInfo(const Version &version, - const std::set<IarewUtils::Architecture> &archs) - : m_version(version), m_archs(archs) +IarewVersionInfo::IarewVersionInfo( + const Version &version, + const std::set<gen::utils::Architecture> &archs) + : gen::VersionInfo(version, archs) { } std::set<IarewVersionInfo> IarewVersionInfo::knownVersions() { static const std::set<IarewVersionInfo> known = { - {Version(8), {IarewUtils::Architecture::ArmArchitecture}}, - {Version(7), {IarewUtils::Architecture::AvrArchitecture}}, - {Version(10), {IarewUtils::Architecture::Mcs51Architecture}}, + {Version(8), {gen::utils::Architecture::Arm}}, + {Version(7), {gen::utils::Architecture::Avr}}, + {Version(10), {gen::utils::Architecture::Mcs51}}, }; return known; } -bool IarewVersionInfo::operator<(const IarewVersionInfo &other) const -{ - return m_version < other.m_version; -} - -bool IarewVersionInfo::operator==(const IarewVersionInfo &other) const -{ - return m_version == other.m_version - && m_archs == other.m_archs; -} - -Version IarewVersionInfo::version() const -{ - return m_version; -} - int IarewVersionInfo::marketingVersion() const { - const auto mv = m_version.majorVersion(); + const auto mv = gen::VersionInfo::marketingVersion(); for (const IarewVersionInfo &known : knownVersions()) { if (known.version().majorVersion() == mv) return mv; } qWarning() << QStringLiteral("Unrecognized IAR EW version: ") - << m_version.toString(); + << version().toString(); return 0; } -bool IarewVersionInfo::containsArchitecture(IarewUtils::Architecture arch) const -{ - return m_archs.find(arch) != m_archs.cend(); -} - -quint32 qHash(const IarewVersionInfo &info) -{ - return qHash(info.version().toString()); -} - } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewversioninfo.h b/src/plugins/generator/iarew/iarewversioninfo.h index e240b65eb..4fd1b1fbc 100644 --- a/src/plugins/generator/iarew/iarewversioninfo.h +++ b/src/plugins/generator/iarew/iarewversioninfo.h @@ -40,37 +40,22 @@ #ifndef QBS_IAREWVERSIONINFO_H #define QBS_IAREWVERSIONINFO_H -#include "iarewutils.h" - -#include <tools/version.h> - -#include <set> +#include <generators/generatorutils.h> +#include <generators/generatorversioninfo.h> namespace qbs { -class IarewVersionInfo final +class IarewVersionInfo final : public gen::VersionInfo { public: IarewVersionInfo(const Version &version, - const std::set<IarewUtils::Architecture> &archs); - - static std::set<IarewVersionInfo> knownVersions(); + const std::set<gen::utils::Architecture> &archs); - bool operator<(const IarewVersionInfo &other) const; - bool operator==(const IarewVersionInfo &other) const; + int marketingVersion() const final; - Version version() const; - int marketingVersion() const; - - bool containsArchitecture(IarewUtils::Architecture arch) const; - -private: - Version m_version; - std::set<IarewUtils::Architecture> m_archs; + static std::set<IarewVersionInfo> knownVersions(); }; -quint32 qHash(const IarewVersionInfo &info); - } // namespace qbs #endif // QBS_IAREWVERSIONINFO_H diff --git a/src/plugins/generator/iarew/iarewworkspace.cpp b/src/plugins/generator/iarew/iarewworkspace.cpp index 19542ebae..bfe22aea7 100644 --- a/src/plugins/generator/iarew/iarewworkspace.cpp +++ b/src/plugins/generator/iarew/iarewworkspace.cpp @@ -37,38 +37,27 @@ ** ****************************************************************************/ -#include "iarewproperty.h" -#include "iarewpropertygroup.h" #include "iarewworkspace.h" -#include "iiarewnodevisitor.h" + +#include <generators/xmlpropertygroup.h> namespace qbs { IarewWorkspace::IarewWorkspace(const QString &workspacePath) + : gen::xml::Workspace(workspacePath) { - m_baseDirectory = QFileInfo(workspacePath).absoluteDir(); - - appendChild<IarewPropertyGroup>(QByteArrayLiteral("batchBuild")); + appendChild<gen::xml::PropertyGroup>( + QByteArrayLiteral("batchBuild")); } -void IarewWorkspace::addProjectPath(const QString &projectFilePath) +void IarewWorkspace::addProject(const QString &projectFilePath) { const QString relativeProjectPath = QLatin1String("$WS_DIR$/") + m_baseDirectory.relativeFilePath(projectFilePath); - const auto projectGroup = appendChild<IarewPropertyGroup>( + const auto projectGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("project")); projectGroup->appendProperty("path", relativeProjectPath); } -void IarewWorkspace::accept(IIarewNodeVisitor *visitor) const -{ - visitor->visitStart(this); - - for (const auto &child : children()) - child->accept(visitor); - - visitor->visitEnd(this); -} - } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewworkspace.h b/src/plugins/generator/iarew/iarewworkspace.h index c357ba4ff..ea14e4174 100644 --- a/src/plugins/generator/iarew/iarewworkspace.h +++ b/src/plugins/generator/iarew/iarewworkspace.h @@ -40,22 +40,17 @@ #ifndef QBS_IAREWWORKSPACE_H #define QBS_IAREWWORKSPACE_H -#include "iarewproperty.h" +#include <generators/xmlworkspace.h> #include <QtCore/qdir.h> namespace qbs { -class IarewWorkspace final : public IarewProperty +class IarewWorkspace final : public gen::xml::Workspace { public: explicit IarewWorkspace(const QString &workspacePath); - void addProjectPath(const QString &projectPath); - - void accept(IIarewNodeVisitor *visitor) const final; - -private: - QDir m_baseDirectory; + void addProject(const QString &projectPath) final; }; } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewworkspacewriter.cpp b/src/plugins/generator/iarew/iarewworkspacewriter.cpp index bf7cdee75..8b56b7c54 100644 --- a/src/plugins/generator/iarew/iarewworkspacewriter.cpp +++ b/src/plugins/generator/iarew/iarewworkspacewriter.cpp @@ -28,66 +28,25 @@ ** ****************************************************************************/ -#include "iarewproperty.h" -#include "iarewpropertygroup.h" -#include "iarewworkspace.h" #include "iarewworkspacewriter.h" -#include <ostream> - namespace qbs { IarewWorkspaceWriter::IarewWorkspaceWriter(std::ostream *device) - : m_device(device) -{ - m_writer.reset(new QXmlStreamWriter(&m_buffer)); - m_writer->setAutoFormatting(true); -} - -bool IarewWorkspaceWriter::write(const IarewWorkspace *workspace) + : gen::xml::WorkspaceWriter(device) { - m_buffer.clear(); - m_writer->writeStartDocument(); - workspace->accept(this); - m_writer->writeEndDocument(); - if (m_writer->hasError()) - return false; - m_device->write(&*std::begin(m_buffer), m_buffer.size()); - return m_device->good(); } -void IarewWorkspaceWriter::visitStart(const IarewWorkspace *workspace) +void IarewWorkspaceWriter::visitStart(const gen::xml::Workspace *workspace) { Q_UNUSED(workspace) - m_writer->writeStartElement(QStringLiteral("workspace")); + writer()->writeStartElement(QStringLiteral("workspace")); } -void IarewWorkspaceWriter::visitEnd(const IarewWorkspace *workspace) +void IarewWorkspaceWriter::visitEnd(const gen::xml::Workspace *workspace) { Q_UNUSED(workspace) - m_writer->writeEndElement(); -} - -void IarewWorkspaceWriter::visitStart(const IarewProperty *property) -{ - const QString stringValue = property->value().toString(); - m_writer->writeTextElement(QString::fromLatin1(property->name()), stringValue); -} - -void IarewWorkspaceWriter::visitEnd(const IarewProperty *property) -{ - Q_UNUSED(property) -} - -void IarewWorkspaceWriter::visitStart(const IarewPropertyGroup *propertyGroup) -{ - m_writer->writeStartElement(QString::fromLatin1(propertyGroup->name())); -} - -void IarewWorkspaceWriter::visitEnd(const IarewPropertyGroup *propertyGroup) -{ - Q_UNUSED(propertyGroup) - m_writer->writeEndElement(); + writer()->writeEndElement(); } } // namespace qbs diff --git a/src/plugins/generator/iarew/iarewworkspacewriter.h b/src/plugins/generator/iarew/iarewworkspacewriter.h index 47457dd00..3966744fb 100644 --- a/src/plugins/generator/iarew/iarewworkspacewriter.h +++ b/src/plugins/generator/iarew/iarewworkspacewriter.h @@ -31,32 +31,19 @@ #ifndef QBS_IAREWWORKSPACEWRITER_H #define QBS_IAREWWORKSPACEWRITER_H -#include "iiarewnodevisitor.h" +#include <generators/xmlworkspacewriter.h> namespace qbs { -class IarewWorkspace; - -class IarewWorkspaceWriter final : public IIarewNodeVisitor +class IarewWorkspaceWriter final : public gen::xml::WorkspaceWriter { Q_DISABLE_COPY(IarewWorkspaceWriter) public: explicit IarewWorkspaceWriter(std::ostream *device); - bool write(const IarewWorkspace *workspace); private: - void visitStart(const IarewWorkspace *workspace) final; - void visitEnd(const IarewWorkspace *workspace) final; - - void visitStart(const IarewProperty *property) final; - void visitEnd(const IarewProperty *property) final; - - void visitStart(const IarewPropertyGroup *propertyGroup) final; - void visitEnd(const IarewPropertyGroup *propertyGroup) final; - - std::ostream *m_device = nullptr; - QByteArray m_buffer; - std::unique_ptr<QXmlStreamWriter> m_writer; + void visitStart(const gen::xml::Workspace *workspace) final; + void visitEnd(const gen::xml::Workspace *workspace) final; }; } // namespace qbs diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.cpp index e9af55743..ce013fba5 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.cpp @@ -46,24 +46,24 @@ namespace mcs51 { namespace v5 { Mcs51BuildTargetGroup::Mcs51BuildTargetGroup( - const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps) - : KeiluvPropertyGroup("Target") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, + const std::vector<qbs::ProductData> &qbsProductDeps) + : gen::xml::PropertyGroup("Target") { // Append target name item (it is a build configuration name). - const QString targetName = qbs::KeiluvUtils::buildConfigurationName( + const QString targetName = gen::utils::buildConfigurationName( qbsProject); appendProperty(QByteArrayLiteral("TargetName"), targetName); // Append toolset number group item. - appendChild<KeiluvProperty>(QByteArrayLiteral("ToolsetNumber"), - QByteArrayLiteral("0x0")); + appendChild<gen::xml::Property>(QByteArrayLiteral("ToolsetNumber"), + QByteArrayLiteral("0x0")); // Append toolset name group item. - appendChild<KeiluvProperty>(QByteArrayLiteral("ToolsetName"), - QByteArrayLiteral("MCS-51")); + appendChild<gen::xml::Property>(QByteArrayLiteral("ToolsetName"), + QByteArrayLiteral("MCS-51")); // Append target option group item. - const auto targetOptionGroup = appendChild<KeiluvPropertyGroup>( + const auto targetOptionGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("TargetOption")); targetOptionGroup->appendChild<Mcs51TargetCommonOptionsGroup>( @@ -85,17 +85,18 @@ Mcs51BuildTargetGroup::Mcs51BuildTargetGroup( } bool Mcs51BuildTargetGroupFactory::canCreate( - qbs::KeiluvUtils::Architecture architecture, + gen::utils::Architecture arch, const Version &version) const { - return architecture == qbs::KeiluvUtils::Architecture::Mcs51Architecture + return arch == gen::utils::Architecture::Mcs51 && version.majorVersion() == KeiluvConstants::kUVisionVersion; } -std::unique_ptr<KeiluvPropertyGroup> Mcs51BuildTargetGroupFactory::create( - const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps) const +std::unique_ptr<gen::xml::PropertyGroup> +Mcs51BuildTargetGroupFactory::create( + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, + const std::vector<qbs::ProductData> &qbsProductDeps) const { const auto group = new Mcs51BuildTargetGroup( qbsProject, qbsProduct, qbsProductDeps); diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.h index 3f11c489e..ef0c0ccba 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51buildtargetgroup_v5.h @@ -31,34 +31,35 @@ #ifndef QBS_KEILUVMCS51BUILDTARGETGROUP_V5_H #define QBS_KEILUVMCS51BUILDTARGETGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51BuildTargetGroup final : public KeiluvPropertyGroup +class Mcs51BuildTargetGroup final : public gen::xml::PropertyGroup { private: explicit Mcs51BuildTargetGroup( - const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, + const std::vector<qbs::ProductData> &qbsProductDeps); friend class Mcs51BuildTargetGroupFactory; }; -class Mcs51BuildTargetGroupFactory final : public KeiluvPropertyGroupFactory +class Mcs51BuildTargetGroupFactory final + : public gen::xml::PropertyGroupFactory { public: - bool canCreate(KeiluvUtils::Architecture architecture, + bool canCreate(gen::utils::Architecture arch, const Version &version) const final; - std::unique_ptr<KeiluvPropertyGroup> create( - const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps) const final; + std::unique_ptr<gen::xml::PropertyGroup> create( + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, + const std::vector<qbs::ProductData> &qbsProductDeps) const final; }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.cpp index 32760df23..3d4d33046 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.cpp @@ -30,17 +30,15 @@ #include "mcs51commonpropertygroup_v5.h" -#include "../../keiluvutils.h" - namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { Mcs51CommonPropertyGroup::Mcs51CommonPropertyGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("CommonProperty") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("CommonProperty") { Q_UNUSED(qbsProject) Q_UNUSED(qbsProduct) diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.h index 185d498d0..66dfc7a3e 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51commonpropertygroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51COMMONPROPERTYGROUP_V5_H #define QBS_KEILUVMCS51COMMONPROPERTYGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51CommonPropertyGroup final : public KeiluvPropertyGroup +class Mcs51CommonPropertyGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51CommonPropertyGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.cpp index 5f2494f8f..2175cc488 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.cpp @@ -30,17 +30,15 @@ #include "mcs51debugoptiongroup_v5.h" -#include "../../keiluvutils.h" - namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { Mcs51DebugOptionGroup::Mcs51DebugOptionGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("DebugOption") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("DebugOption") { Q_UNUSED(qbsProject) Q_UNUSED(qbsProduct) diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.h index e19f1edf8..473cf605c 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51debugoptiongroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51DEBUGOPTIONGROUP_V5_H #define QBS_KEILUVMCS51DEBUGOPTIONGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51DebugOptionGroup final : public KeiluvPropertyGroup +class Mcs51DebugOptionGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51DebugOptionGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.cpp index 26639b9bf..59aec721d 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.cpp @@ -30,17 +30,15 @@ #include "mcs51dlloptiongroup_v5.h" -#include "../../keiluvutils.h" - namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { Mcs51DllOptionGroup::Mcs51DllOptionGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("DllOption") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("DllOption") { Q_UNUSED(qbsProject) Q_UNUSED(qbsProduct) diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.h index 5144dfd72..e16833acc 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51dlloptiongroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51DLLOPTIONGROUP_V5_H #define QBS_KEILUVMCS51DLLOPTIONGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51DllOptionGroup final : public KeiluvPropertyGroup +class Mcs51DllOptionGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51DllOptionGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.cpp index 00120a56d..8d7257713 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.cpp @@ -100,9 +100,9 @@ struct AssemblerPageOptions final } // namespace Mcs51TargetAssemblerGroup::Mcs51TargetAssemblerGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("Ax51") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("Ax51") { const AssemblerPageOptions opts(qbsProject, qbsProduct); @@ -118,7 +118,7 @@ Mcs51TargetAssemblerGroup::Mcs51TargetAssemblerGroup( // Add other various controls. // Note: A sub-items order makes sense! - const auto variousControlsGroup = appendChild<KeiluvPropertyGroup>( + const auto variousControlsGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("VariousControls")); // Add 'Misc Controls' item. variousControlsGroup->appendMultiLineProperty( diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.h index 8a183c30b..f9a82304d 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetassemblergroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51TARGETASSEMBLERGROUP_V3 #define QBS_KEILUVMCS51TARGETASSEMBLERGROUP_V3 -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51TargetAssemblerGroup final : public KeiluvPropertyGroup +class Mcs51TargetAssemblerGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51TargetAssemblerGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.cpp index 00d15d34b..de1be1ef6 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.cpp @@ -32,6 +32,8 @@ #include "../../keiluvutils.h" +#include <generators/generatorutils.h> + namespace qbs { namespace keiluv { namespace mcs51 { @@ -54,22 +56,23 @@ struct CommonPageOptions final browseInfo = true; // Debug information. - debugInfo = KeiluvUtils::debugInformation(qbsProduct); + debugInfo = gen::utils::debugInformation(qbsProduct); // Output parameters. - executableName = KeiluvUtils::targetBinary(qbsProduct); + executableName = gen::utils::targetBinary(qbsProduct); // Fix output binary name if it is a library. Because // the IDE appends an additional suffix (.LIB) to end // of an output library name. if (executableName.endsWith(QLatin1String(".lib"))) executableName = qbsProduct.targetName(); - - const QString baseDirectory = KeiluvUtils::buildRootPath(qbsProject); - objectDirectory = KeiluvUtils::objectsOutputDirectory( - baseDirectory, qbsProduct); - listingDirectory = KeiluvUtils::listingOutputDirectory( - baseDirectory, qbsProduct); + const QString baseDirectory = gen::utils::buildRootPath(qbsProject); + objectDirectory = QDir::toNativeSeparators( + gen::utils::objectsOutputDirectory( + baseDirectory, qbsProduct)); + listingDirectory = QDir::toNativeSeparators( + gen::utils::listingOutputDirectory( + baseDirectory, qbsProduct)); // Target type. targetType = KeiluvUtils::outputBinaryType(qbsProduct); @@ -87,9 +90,9 @@ struct CommonPageOptions final } // namespace Mcs51TargetCommonOptionsGroup::Mcs51TargetCommonOptionsGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("TargetCommonOption") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("TargetCommonOption") { const CommonPageOptions opts(qbsProject, qbsProduct); diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.h index 7535b3373..eccd9d42d 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcommonoptionsgroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51TARGETCOMMONOPTIONSGROUP_V5_H #define QBS_KEILUVMCS51TARGETCOMMONOPTIONSGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51TargetCommonOptionsGroup final : public KeiluvPropertyGroup +class Mcs51TargetCommonOptionsGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51TargetCommonOptionsGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.cpp index 76a246508..e33c0c211 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.cpp @@ -88,7 +88,7 @@ struct CompilerPageOptions final const auto flags = qbs::KeiluvUtils::cppModuleCompilerFlags(qbsProps); // Warnings. - const QString level = qbs::KeiluvUtils::cppStringModuleProperty( + const QString level = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("warningLevel")); if (level == QLatin1String("none")) { warningLevel = WarningLevelNone; @@ -101,14 +101,14 @@ struct CompilerPageOptions final flags, QStringLiteral("WARNINGLEVEL")); bool ok = false; const auto level = warnValue.toInt(&ok); - if (ok && qbs::KeiluvUtils::inBounds( + if (ok && gen::utils::inBounds( level, int(WarningLevelNone),int(WarningLevelTwo))) { warningLevel = static_cast<WarningLevel>(level); } } // Optimizations. - const QString optimization = qbs::KeiluvUtils::cppStringModuleProperty( + const QString optimization = gen::utils::cppStringModuleProperty( qbsProps, QStringLiteral("optimization")); if (optimization == QLatin1String("fast")) { optimizationEmphasis = FavorSpeedOptimizationEmphasis; @@ -163,7 +163,7 @@ struct CompilerPageOptions final flags, QStringLiteral("FLOATFUZZY")); bool ok = false; const auto bits = bitsValue.toInt(&ok); - if (ok && qbs::KeiluvUtils::inBounds( + if (ok && gen::utils::inBounds( bits, int(NoFloatFuzzyBits), int(SevenFloatFuzzyBits))) { floatFuzzyBits = static_cast<FloatFuzzyBits>(bits); } @@ -222,9 +222,9 @@ struct CompilerPageOptions final } // namespace Mcs51TargetCompilerGroup::Mcs51TargetCompilerGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("C51") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("C51") { const CompilerPageOptions opts(qbsProject, qbsProduct); @@ -256,7 +256,7 @@ Mcs51TargetCompilerGroup::Mcs51TargetCompilerGroup( // Add other various controls. // Note: A sub-items order makes sense! - const auto variousControlsGroup = appendChild<KeiluvPropertyGroup>( + const auto variousControlsGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("VariousControls")); // Add 'Misc Controls' item. variousControlsGroup->appendMultiLineProperty( diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.h index 801f79ee6..0f1e52ce4 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetcompilergroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51TARGETCOMPILERGROUP_V5_H #define QBS_KEILUVMCS51TARGETCOMPILERGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51TargetCompilerGroup final : public KeiluvPropertyGroup +class Mcs51TargetCompilerGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51TargetCompilerGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.cpp index ec583aa29..2a05649dd 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.cpp @@ -34,17 +34,15 @@ #include "mcs51targetlinkergroup_v5.h" #include "mcs51targetmiscgroup_v5.h" -#include "../../keiluvutils.h" - namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { Mcs51TargetGroup::Mcs51TargetGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("Target51") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("Target51") { appendChild<Mcs51TargetMiscGroup>(qbsProject, qbsProduct); appendChild<Mcs51TargetCompilerGroup>(qbsProject, qbsProduct); diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.h index 989e50991..d256dfcc7 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetgroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51TARGETGROUP_V5_H #define QBS_KEILUVMCS51TARGETGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51TargetGroup final : public KeiluvPropertyGroup +class Mcs51TargetGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51TargetGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.cpp index 6e5f807a5..4d52b627a 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.cpp @@ -172,9 +172,9 @@ struct LinkerPageOptions final } // namespace Mcs51TargetLinkerGroup::Mcs51TargetLinkerGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("Lx51") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("Lx51") { const LinkerPageOptions opts(qbsProject, qbsProduct); diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.h index d9bbcea4b..d701c5e0e 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetlinkergroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51TARGETLINKERGROUP_V5_H #define QBS_KEILUVMCS51TARGETLINKERGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51TargetLinkerGroup final : public KeiluvPropertyGroup +class Mcs51TargetLinkerGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51TargetLinkerGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.cpp index 193330864..5d95d443f 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.cpp @@ -84,9 +84,9 @@ struct MiscPageOptions final } // namespace Mcs51TargetMiscGroup::Mcs51TargetMiscGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("Target51Misc") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("Target51Misc") { const MiscPageOptions opts(qbsProject, qbsProduct); diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.h index e1dfd4a56..f1680d927 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51targetmiscgroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51TARGETMISCGROUP_V5_H #define QBS_KEILUVMCS51TARGETMISCGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51TargetMiscGroup final : public KeiluvPropertyGroup +class Mcs51TargetMiscGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51TargetMiscGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.cpp b/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.cpp index 380876e51..8e8307f72 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.cpp +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.cpp @@ -30,17 +30,15 @@ #include "mcs51utilitiesgroup_v5.h" -#include "../../keiluvutils.h" - namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { Mcs51UtilitiesGroup::Mcs51UtilitiesGroup( - const Project &qbsProject, - const ProductData &qbsProduct) - : KeiluvPropertyGroup("Utilities") + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct) + : gen::xml::PropertyGroup("Utilities") { Q_UNUSED(qbsProject) Q_UNUSED(qbsProduct) diff --git a/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.h b/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.h index 4345bd981..f95ec67c4 100644 --- a/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.h +++ b/src/plugins/generator/keiluv/archs/mcs51/mcs51utilitiesgroup_v5.h @@ -31,19 +31,19 @@ #ifndef QBS_KEILUVMCS51UTILITIESGROUP_V5_H #define QBS_KEILUVMCS51UTILITIESGROUP_V5_H -#include "../../keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> namespace qbs { namespace keiluv { namespace mcs51 { namespace v5 { -class Mcs51UtilitiesGroup final : public KeiluvPropertyGroup +class Mcs51UtilitiesGroup final : public gen::xml::PropertyGroup { public: explicit Mcs51UtilitiesGroup( - const Project &qbsProject, - const ProductData &qbsProduct); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct); }; } // namespace v5 diff --git a/src/plugins/generator/keiluv/keiluv.pro b/src/plugins/generator/keiluv/keiluv.pro index 99bf44d54..d260adea1 100644 --- a/src/plugins/generator/keiluv/keiluv.pro +++ b/src/plugins/generator/keiluv/keiluv.pro @@ -13,29 +13,24 @@ SOURCES += \ # Common files. HEADERS += \ - $$PWD/ikeiluvnodevisitor.h \ $$PWD/keiluvfilesgroupspropertygroup.h \ $$PWD/keiluvgenerator.h \ $$PWD/keiluvproject.h \ $$PWD/keiluvprojectwriter.h \ - $$PWD/keiluvproperty.h \ - $$PWD/keiluvpropertygroup.h \ $$PWD/keiluvutils.h \ $$PWD/keiluvversioninfo.h \ $$PWD/keiluvworkspace.h \ - $$PWD/keiluvworkspacewriter.h \ + $$PWD/keiluvworkspacewriter.h SOURCES += \ $$PWD/keiluvfilesgroupspropertygroup.cpp \ $$PWD/keiluvgenerator.cpp \ $$PWD/keiluvproject.cpp \ $$PWD/keiluvprojectwriter.cpp \ - $$PWD/keiluvproperty.cpp \ - $$PWD/keiluvpropertygroup.cpp \ $$PWD/keiluvutils.cpp \ $$PWD/keiluvversioninfo.cpp \ $$PWD/keiluvworkspace.cpp \ - $$PWD/keiluvworkspacewriter.cpp \ + $$PWD/keiluvworkspacewriter.cpp # For MCS51 architecture. @@ -51,7 +46,7 @@ HEADERS += \ $$PWD/archs/mcs51/mcs51targetlinkergroup_v5.h \ $$PWD/archs/mcs51/mcs51targetmiscgroup_v5.h \ $$PWD/archs/mcs51/mcs51utilitiesgroup_v5.h \ - $$PWD/archs/mcs51/mcs51utils.h \ + $$PWD/archs/mcs51/mcs51utils.h SOURCES += \ $$PWD/archs/mcs51/mcs51buildtargetgroup_v5.cpp \ @@ -65,4 +60,4 @@ SOURCES += \ $$PWD/archs/mcs51/mcs51targetlinkergroup_v5.cpp \ $$PWD/archs/mcs51/mcs51targetmiscgroup_v5.cpp \ $$PWD/archs/mcs51/mcs51utilitiesgroup_v5.cpp \ - $$PWD/archs/mcs51/mcs51utils.cpp \ + $$PWD/archs/mcs51/mcs51utils.cpp diff --git a/src/plugins/generator/keiluv/keiluv.qbs b/src/plugins/generator/keiluv/keiluv.qbs index 5734f0538..62e03593c 100644 --- a/src/plugins/generator/keiluv/keiluv.qbs +++ b/src/plugins/generator/keiluv/keiluv.qbs @@ -11,7 +11,6 @@ QbsPlugin { Group { name: "KEIL UV generator common" files: [ - "ikeiluvnodevisitor.h", "keiluvfilesgroupspropertygroup.cpp", "keiluvfilesgroupspropertygroup.h", "keiluvgenerator.cpp", @@ -20,10 +19,6 @@ QbsPlugin { "keiluvproject.h", "keiluvprojectwriter.cpp", "keiluvprojectwriter.h", - "keiluvproperty.cpp", - "keiluvproperty.h", - "keiluvpropertygroup.cpp", - "keiluvpropertygroup.h", "keiluvutils.cpp", "keiluvutils.h", "keiluvversioninfo.cpp", diff --git a/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.cpp b/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.cpp index 137cabe3d..b9a234d6a 100644 --- a/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.cpp +++ b/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.cpp @@ -29,6 +29,7 @@ ****************************************************************************/ #include "keiluvfilesgroupspropertygroup.h" +#include "keiluvutils.h" #include <generators/generatordata.h> @@ -36,26 +37,28 @@ namespace qbs { -class KeiluvFilePropertyGroup final : public KeiluvPropertyGroup +class KeiluvFilePropertyGroup final : public gen::xml::PropertyGroup { public: explicit KeiluvFilePropertyGroup( const QString &fullFilePath, const QString &baseDirectory) - : KeiluvPropertyGroup("File") + : gen::xml::PropertyGroup("File") { const QFileInfo fileInfo(fullFilePath); const auto fileName = fileInfo.fileName(); const auto fileType = encodeFileType(fileInfo.suffix()); - const auto filePath = KeiluvUtils::relativeFilePath( - baseDirectory, fileInfo.absoluteFilePath()); - - appendChild<KeiluvProperty>(QByteArrayLiteral("FileName"), - fileName); - appendChild<KeiluvProperty>(QByteArrayLiteral("FileType"), - fileType); - appendChild<KeiluvProperty>(QByteArrayLiteral("FilePath"), - filePath); + const auto filePath = QDir::toNativeSeparators( + gen::utils::relativeFilePath( + baseDirectory, + fileInfo.absoluteFilePath())); + + appendChild<gen::xml::Property>(QByteArrayLiteral("FileName"), + fileName); + appendChild<gen::xml::Property>(QByteArrayLiteral("FileType"), + fileType); + appendChild<gen::xml::Property>(QByteArrayLiteral("FilePath"), + filePath); } private: @@ -92,13 +95,13 @@ private: } }; -class KeiluvFilesPropertyGroup final : public KeiluvPropertyGroup +class KeiluvFilesPropertyGroup final : public gen::xml::PropertyGroup { public: explicit KeiluvFilesPropertyGroup( const QList<ArtifactData> &sourceArtifacts, const QString &baseDirectory) - : KeiluvPropertyGroup("Files") + : gen::xml::PropertyGroup("Files") { for (const auto &artifact : sourceArtifacts) appendChild<KeiluvFilePropertyGroup>(artifact.filePath(), @@ -108,7 +111,7 @@ public: explicit KeiluvFilesPropertyGroup( const QStringList &filePaths, const QString &baseDirectory) - : KeiluvPropertyGroup("Files") + : gen::xml::PropertyGroup("Files") { for (const auto &filePath : filePaths) appendChild<KeiluvFilePropertyGroup>(filePath, @@ -116,17 +119,17 @@ public: } }; -class KeiluvFileGroupPropertyGroup final : public KeiluvPropertyGroup +class KeiluvFileGroupPropertyGroup final : public gen::xml::PropertyGroup { public: explicit KeiluvFileGroupPropertyGroup( const QString &groupName, const QList<ArtifactData> &sourceArtifacts, const QString &baseDirectory) - : KeiluvPropertyGroup("Group") + : gen::xml::PropertyGroup("Group") { - appendChild<KeiluvProperty>(QByteArrayLiteral("GroupName"), - groupName); + appendChild<gen::xml::Property>(QByteArrayLiteral("GroupName"), + groupName); appendChild<KeiluvFilesPropertyGroup>(sourceArtifacts, baseDirectory); @@ -136,10 +139,10 @@ public: const QString &groupName, const QStringList &filePaths, const QString &baseDirectory) - : KeiluvPropertyGroup("Group") + : gen::xml::PropertyGroup("Group") { - appendChild<KeiluvProperty>(QByteArrayLiteral("GroupName"), - groupName); + appendChild<gen::xml::Property>(QByteArrayLiteral("GroupName"), + groupName); appendChild<KeiluvFilesPropertyGroup>(filePaths, baseDirectory); @@ -150,9 +153,9 @@ KeiluvFilesGroupsPropertyGroup::KeiluvFilesGroupsPropertyGroup( const Project &qbsProject, const ProductData &qbsProduct, const std::vector<ProductData> &qbsProductDeps) - : KeiluvPropertyGroup(QByteArrayLiteral("Groups")) + : gen::xml::PropertyGroup(QByteArrayLiteral("Groups")) { - const auto baseDirectory = KeiluvUtils::buildRootPath(qbsProject); + const auto baseDirectory = gen::utils::buildRootPath(qbsProject); // Build source items. const auto groups = qbsProduct.groups(); diff --git a/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.h b/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.h index 6ae335875..bde86b89c 100644 --- a/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.h +++ b/src/plugins/generator/keiluv/keiluvfilesgroupspropertygroup.h @@ -31,19 +31,20 @@ #ifndef QBS_KEILUVFILESGROUPSPROPERTYGROUP_H #define QBS_KEILUVFILESGROUPSPROPERTYGROUP_H -#include "keiluvpropertygroup.h" +#include <generators/xmlpropertygroup.h> #include <generators/generatordata.h> namespace qbs { -class KeiluvFilesGroupsPropertyGroup final : public KeiluvPropertyGroup +class KeiluvFilesGroupsPropertyGroup final + : public gen::xml::PropertyGroup { public: explicit KeiluvFilesGroupsPropertyGroup( - const Project &qbsProject, - const ProductData &qbsProduct, - const std::vector<ProductData> &qbsProductDeps); + const qbs::Project &qbsProject, + const qbs::ProductData &qbsProduct, + const std::vector<qbs::ProductData> &qbsProductDeps); }; } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvgenerator.cpp b/src/plugins/generator/keiluv/keiluvgenerator.cpp index 570f7693e..657a98ad4 100644 --- a/src/plugins/generator/keiluv/keiluvgenerator.cpp +++ b/src/plugins/generator/keiluv/keiluvgenerator.cpp @@ -133,25 +133,27 @@ void KeiluvGenerator::visitProject(const GeneratableProject &project) m_workspace = std::make_shared<KeiluvWorkspace>(m_workspaceFilePath); } -void KeiluvGenerator::visitProjectData(const GeneratableProject &project, - const GeneratableProjectData &projectData) +void KeiluvGenerator::visitProjectData( + const GeneratableProject &project, + const GeneratableProjectData &projectData) { Q_UNUSED(project) Q_UNUSED(projectData) } -void KeiluvGenerator::visitProduct(const GeneratableProject &project, - const GeneratableProjectData &projectData, - const GeneratableProductData &productData) +void KeiluvGenerator::visitProduct( + const GeneratableProject &project, + const GeneratableProjectData &projectData, + const GeneratableProductData &productData) { Q_UNUSED(projectData); const QString projectFilePath = targetFilePath( productData, project.baseBuildDirectory().absolutePath()); - const auto targetProject = std::make_shared<KeiluvProject>(project, productData, - m_versionInfo); + const auto targetProject = std::make_shared<KeiluvProject>( + project, productData, m_versionInfo); m_projects.insert({projectFilePath, targetProject}); - m_workspace->addProjectPath(projectFilePath); + m_workspace->addProject(projectFilePath); } } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvproject.cpp b/src/plugins/generator/keiluv/keiluvproject.cpp index d9e256bdb..bd5e80658 100644 --- a/src/plugins/generator/keiluv/keiluvproject.cpp +++ b/src/plugins/generator/keiluv/keiluvproject.cpp @@ -28,7 +28,6 @@ ** ****************************************************************************/ -#include "ikeiluvnodevisitor.h" #include "keiluvproject.h" #include "keiluvutils.h" #include "keiluvversioninfo.h" @@ -51,9 +50,10 @@ static QString keilProjectSchema(const KeiluvVersionInfo &info) } } -KeiluvProject::KeiluvProject(const GeneratableProject &genProject, - const GeneratableProductData &genProduct, - const KeiluvVersionInfo &versionInfo) +KeiluvProject::KeiluvProject( + const qbs::GeneratableProject &genProject, + const qbs::GeneratableProductData &genProduct, + const KeiluvVersionInfo &versionInfo) { Q_ASSERT(genProject.projects.size() == genProject.commandLines.size()); Q_ASSERT(genProject.projects.size() == genProduct.data.size()); @@ -64,25 +64,27 @@ KeiluvProject::KeiluvProject(const GeneratableProject &genProject, // Construct schema version item (depends on a project version). const auto schema = keilProjectSchema(versionInfo); - appendChild<KeiluvProperty>(QByteArrayLiteral("SchemaVersion"), - schema); + appendChild<gen::xml::Property>(QByteArrayLiteral("SchemaVersion"), + schema); // Construct targets group. - const auto targetsGroup = appendChild<KeiluvPropertyGroup>( + const auto targetsGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("Targets")); // Construct all build target items. const int configsCount = std::max(genProject.projects.size(), genProduct.data.size()); for (auto configIndex = 0; configIndex < configsCount; ++configIndex) { - const Project qbsProject = genProject.projects.values().at(configIndex); - const ProductData qbsProduct = genProduct.data.values().at(configIndex); - const QString confName = KeiluvUtils::buildConfigurationName(qbsProject); - const std::vector<ProductData> qbsProductDeps = KeiluvUtils::dependenciesOf + const qbs::Project qbsProject = genProject.projects + .values().at(configIndex); + const qbs::ProductData qbsProduct = genProduct.data + .values().at(configIndex); + const QString confName = gen::utils::buildConfigurationName(qbsProject); + const std::vector<ProductData> qbsProductDeps = gen::utils::dependenciesOf (qbsProduct, genProject, confName); - const auto arch = KeiluvUtils::architecture(qbsProject); - if (arch == KeiluvUtils::Architecture::UnknownArchitecture) + const auto arch = gen::utils::architecture(qbsProject); + if (arch == gen::utils::Architecture::Unknown) throw ErrorInfo(Internal::Tr::tr("Target architecture is not set," " please use the 'profile' option")); @@ -96,7 +98,7 @@ KeiluvProject::KeiluvProject(const GeneratableProject &genProject, if (factoryIt == factoryEnd) { throw ErrorInfo(Internal::Tr::tr("Incompatible target architecture '%1'" " for KEIL UV version %2") - .arg(KeiluvUtils::architectureName(arch)) + .arg(gen::utils::architectureName(arch)) .arg(versionInfo.marketingVersion())); } @@ -106,14 +108,4 @@ KeiluvProject::KeiluvProject(const GeneratableProject &genProject, } } -void KeiluvProject::accept(IKeiluvNodeVisitor *visitor) const -{ - visitor->visitStart(this); - - for (const auto &child : children()) - child->accept(visitor); - - visitor->visitEnd(this); -} - } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvproject.h b/src/plugins/generator/keiluv/keiluvproject.h index fc9893da5..98b2815ed 100644 --- a/src/plugins/generator/keiluv/keiluvproject.h +++ b/src/plugins/generator/keiluv/keiluvproject.h @@ -31,27 +31,26 @@ #ifndef QBS_KEILUVPROJECT_H #define QBS_KEILUVPROJECT_H -#include "keiluvproperty.h" -#include "keiluvpropertygroup.h" - #include <generators/generatordata.h> +#include <generators/xmlproject.h> +#include <generators/xmlpropertygroup.h> + #include <memory> namespace qbs { class KeiluvVersionInfo; -class KeiluvProject final : public KeiluvProperty +class KeiluvProject final : public gen::xml::Project { public: - explicit KeiluvProject(const GeneratableProject &genProject, - const GeneratableProductData &genProduct, - const KeiluvVersionInfo &versionInfo); - void accept(IKeiluvNodeVisitor *visitor) const final; - + explicit KeiluvProject( + const qbs::GeneratableProject &genProject, + const qbs::GeneratableProductData &genProduct, + const KeiluvVersionInfo &versionInfo); private: - std::vector<std::unique_ptr<KeiluvPropertyGroupFactory>> m_factories; + std::vector<std::unique_ptr<gen::xml::PropertyGroupFactory>> m_factories; }; } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvprojectwriter.cpp b/src/plugins/generator/keiluv/keiluvprojectwriter.cpp index 7f63b4714..f2ae8befb 100644 --- a/src/plugins/generator/keiluv/keiluvprojectwriter.cpp +++ b/src/plugins/generator/keiluv/keiluvprojectwriter.cpp @@ -28,70 +28,31 @@ ** ****************************************************************************/ -#include "keiluvproject.h" #include "keiluvprojectwriter.h" -#include "keiluvproperty.h" -#include "keiluvpropertygroup.h" - -#include <ostream> namespace qbs { KeiluvProjectWriter::KeiluvProjectWriter(std::ostream *device) - : m_device(device) -{ - m_writer.reset(new QXmlStreamWriter(&m_buffer)); - m_writer->setAutoFormatting(true); -} - -bool KeiluvProjectWriter::write(const KeiluvProject *project) + : gen::xml::ProjectWriter(device) { - m_buffer.clear(); - m_writer->writeStartDocument(); - project->accept(this); - m_writer->writeEndDocument(); - if (m_writer->hasError()) - return false; - m_device->write(&*std::begin(m_buffer), m_buffer.size()); - return m_device->good(); } -void KeiluvProjectWriter::visitStart(const KeiluvProject *project) +void KeiluvProjectWriter::visitStart(const gen::xml::Project *project) { Q_UNUSED(project) - m_writer->writeStartElement(QStringLiteral("Project")); - m_writer->writeAttribute(QStringLiteral("xmlns:xsi"), - QStringLiteral("http://www.w3.org/2001/XMLSchema-instance")); - m_writer->writeAttribute(QStringLiteral("xsi:noNamespaceSchemaLocation"), - QStringLiteral("project_proj.xsd")); + writer()->writeStartElement(QStringLiteral("Project")); + writer()->writeAttribute( + QStringLiteral("xmlns:xsi"), + QStringLiteral("http://www.w3.org/2001/XMLSchema-instance")); + writer()->writeAttribute( + QStringLiteral("xsi:noNamespaceSchemaLocation"), + QStringLiteral("project_proj.xsd")); } -void KeiluvProjectWriter::visitEnd(const KeiluvProject *project) +void KeiluvProjectWriter::visitEnd(const gen::xml::Project *project) { Q_UNUSED(project) - m_writer->writeEndElement(); -} - -void KeiluvProjectWriter::visitStart(const KeiluvProperty *property) -{ - const QString stringValue = property->value().toString(); - m_writer->writeTextElement(QString::fromUtf8(property->name()), stringValue); -} - -void KeiluvProjectWriter::visitEnd(const KeiluvProperty *property) -{ - Q_UNUSED(property) -} - -void KeiluvProjectWriter::visitStart(const KeiluvPropertyGroup *propertyGroup) -{ - m_writer->writeStartElement(QString::fromUtf8(propertyGroup->name())); -} - -void KeiluvProjectWriter::visitEnd(const KeiluvPropertyGroup *propertyGroup) -{ - Q_UNUSED(propertyGroup) - m_writer->writeEndElement(); + writer()->writeEndElement(); } } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvprojectwriter.h b/src/plugins/generator/keiluv/keiluvprojectwriter.h index ad807e29e..ad6fd1124 100644 --- a/src/plugins/generator/keiluv/keiluvprojectwriter.h +++ b/src/plugins/generator/keiluv/keiluvprojectwriter.h @@ -31,32 +31,19 @@ #ifndef QBS_KEILUVPROJECTWRITER_H #define QBS_KEILUVPROJECTWRITER_H -#include "ikeiluvnodevisitor.h" +#include <generators/xmlprojectwriter.h> namespace qbs { -class KeiluvProject; - -class KeiluvProjectWriter final : public IKeiluvNodeVisitor +class KeiluvProjectWriter final : public gen::xml::ProjectWriter { Q_DISABLE_COPY(KeiluvProjectWriter) public: explicit KeiluvProjectWriter(std::ostream *device); - bool write(const KeiluvProject *project); private: - void visitStart(const KeiluvProject *project) final; - void visitEnd(const KeiluvProject *project) final; - - void visitStart(const KeiluvProperty *property) final; - void visitEnd(const KeiluvProperty *property) final; - - void visitStart(const KeiluvPropertyGroup *propertyGroup) final; - void visitEnd(const KeiluvPropertyGroup *propertyGroup) final; - - std::ostream *m_device = nullptr; - QByteArray m_buffer; - std::unique_ptr<QXmlStreamWriter> m_writer; + void visitStart(const gen::xml::Project *project) final; + void visitEnd(const gen::xml::Project *project) final; }; } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvutils.cpp b/src/plugins/generator/keiluv/keiluvutils.cpp index 51382dc36..8932f0f16 100644 --- a/src/plugins/generator/keiluv/keiluvutils.cpp +++ b/src/plugins/generator/keiluv/keiluvutils.cpp @@ -30,6 +30,8 @@ #include "keiluvutils.h" +#include <generators/generatorutils.h> + namespace qbs { namespace KeiluvUtils { @@ -43,100 +45,6 @@ OutputBinaryType outputBinaryType(const ProductData &qbsProduct) return ApplicationOutputType; } -QString architectureName(Architecture arch) -{ - switch (arch) { - case Architecture::Mcs51Architecture: - return QStringLiteral("mcs51"); - default: - return QStringLiteral("unknown"); - } -} - -Architecture architecture(const Project &qbsProject) -{ - const auto qbsArch = qbsProject.projectConfiguration() - .value(Internal::StringConstants::qbsModule()).toMap() - .value(QStringLiteral("architecture")).toString(); - - if (qbsArch == QLatin1String("mcs51")) - return Architecture::Mcs51Architecture; - return Architecture::UnknownArchitecture; -} - -QString buildConfigurationName(const Project &qbsProject) -{ - return qbsProject.projectConfiguration() - .value(Internal::StringConstants::qbsModule()).toMap() - .value(QStringLiteral("configurationName")).toString(); -} - -int debugInformation(const ProductData &qbsProduct) -{ - return qbsProduct.moduleProperties().getModuleProperty( - Internal::StringConstants::qbsModule(), - QStringLiteral("debugInformation")) - .toInt(); -} - -QString binaryOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - const auto path = QDir(baseDirectory).relativeFilePath( - qbsProduct.buildDirectory()) + QLatin1String("/bin"); - return QDir::toNativeSeparators(path); -} - -QString objectsOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - const auto path = QDir(baseDirectory).relativeFilePath( - qbsProduct.buildDirectory()) + QLatin1String("/obj"); - return QDir::toNativeSeparators(path); -} - -QString listingOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct) -{ - const auto path = QDir(baseDirectory).relativeFilePath( - qbsProduct.buildDirectory()) + QLatin1String("/lst"); - return QDir::toNativeSeparators(path); -} - -QString targetBinary(const ProductData &qbsProduct) -{ - const auto type = qbsProduct.type(); - if (type.contains(QLatin1String("application"))) { - return QFileInfo(qbsProduct.targetExecutable()).fileName(); - } else if (type.contains(QLatin1String("staticlibrary"))) { - const auto artifacts = qbsProduct.targetArtifacts(); - for (const auto &artifact : artifacts) { - if (artifact.fileTags().contains(QLatin1String("staticlibrary"))) - return QFileInfo(artifact.filePath()).fileName(); - } - } - - return {}; -} - -std::vector<ProductData> dependenciesOf(const ProductData &qbsProduct, - const GeneratableProject &genProject, - const QString configurationName) -{ - std::vector<ProductData> result; - const auto depsNames = qbsProduct.dependencies(); - for (const auto &product : qAsConst(genProject.products)) { - const auto pt = product.type(); - if (!pt.contains(QLatin1String("staticlibrary"))) - continue; - const auto pn = product.name(); - if (!depsNames.contains(pn)) - continue; - result.push_back(product.data.value(configurationName)); - } - return result; -} - QString toolkitRootPath(const ProductData &qbsProduct) { QDir dir(qbsProduct.moduleProperties() @@ -148,47 +56,9 @@ QString toolkitRootPath(const ProductData &qbsProduct) return QDir::toNativeSeparators(path); } -QString buildRootPath(const Project &qbsProject) -{ - QDir dir(qbsProject.projectData().buildDirectory()); - dir.cdUp(); - const auto path = dir.absolutePath(); - return QDir::toNativeSeparators(path); -} - -QString relativeFilePath(const QString &baseDirectory, - const QString &fullFilePath) -{ - const auto path = QDir(baseDirectory).relativeFilePath(fullFilePath); - return QDir::toNativeSeparators(path); -} - -QString cppStringModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName) -{ - return qbsProps.getModuleProperty(Internal::StringConstants::cppModule(), - propertyName).toString().trimmed(); -} - -QStringList cppStringModuleProperties(const PropertyMap &qbsProps, - const QStringList &propertyNames) -{ - QStringList properties; - for (const auto &propertyName : propertyNames) { - properties << qbsProps.getModuleProperty( - Internal::StringConstants::cppModule(), - propertyName).toStringList(); - } - std::transform(properties.begin(), properties.end(), properties.begin(), - [](const auto &property) { - return property.trimmed(); - }); - return properties; -} - QStringList cppModuleCompilerFlags(const PropertyMap &qbsProps) { - return cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverFlags"), QStringLiteral("cFlags"), QStringLiteral("cppFlags"), QStringLiteral("cxxFlags"), QStringLiteral("commonCompilerFlags")}); @@ -196,19 +66,19 @@ QStringList cppModuleCompilerFlags(const PropertyMap &qbsProps) QStringList cppModuleAssemblerFlags(const PropertyMap &qbsProps) { - return cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("assemblerFlags")}); } QStringList cppModuleLinkerFlags(const PropertyMap &qbsProps) { - return cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("driverLinkerFlags")}); } QStringList includes(const PropertyMap &qbsProps) { - auto paths = qbs::KeiluvUtils::cppStringModuleProperties( + auto paths = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("includePaths"), QStringLiteral("systemIncludePaths")}); // Transform include path separators to native. @@ -221,13 +91,13 @@ QStringList includes(const PropertyMap &qbsProps) QStringList defines(const PropertyMap &qbsProps) { - return qbs::KeiluvUtils::cppStringModuleProperties( + return gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("defines")}); } QStringList staticLibraries(const PropertyMap &qbsProps) { - auto libs = qbs::KeiluvUtils::cppStringModuleProperties( + auto libs = gen::utils::cppStringModuleProperties( qbsProps, {QStringLiteral("staticLibraries")}); // Transform library path separators to native. std::transform(libs.begin(), libs.end(), libs.begin(), @@ -243,7 +113,7 @@ QStringList dependencies(const std::vector<ProductData> &qbsProductDeps) for (const ProductData &qbsProductDep : qbsProductDeps) { const auto path = qbsProductDep.buildDirectory() + QLatin1String("/obj/") - + qbs::KeiluvUtils::targetBinary(qbsProductDep); + + gen::utils::targetBinary(qbsProductDep); deps.push_back(QDir::toNativeSeparators(path)); } return deps; diff --git a/src/plugins/generator/keiluv/keiluvutils.h b/src/plugins/generator/keiluv/keiluvutils.h index a1de6c543..92209dc53 100644 --- a/src/plugins/generator/keiluv/keiluvutils.h +++ b/src/plugins/generator/keiluv/keiluvutils.h @@ -38,60 +38,15 @@ namespace qbs { namespace KeiluvUtils { -enum class Architecture { - Mcs51Architecture, - UnknownArchitecture -}; - enum OutputBinaryType { ApplicationOutputType, LibraryOutputType }; -template <typename T> -bool inBounds(const T &value, const T &low, const T &high) -{ - return !(value < low) && !(high < value); -} - OutputBinaryType outputBinaryType(const ProductData &qbsProduct); -QString architectureName(Architecture arch); - -Architecture architecture(const Project &qbsProject); - -QString buildConfigurationName(const Project &qbsProject); - -int debugInformation(const ProductData &qbsProduct); - -QString binaryOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct); - -QString objectsOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct); - -QString listingOutputDirectory(const QString &baseDirectory, - const ProductData &qbsProduct); - -QString targetBinary(const ProductData &qbsProduct); - -std::vector<ProductData> dependenciesOf(const ProductData &qbsProduct, - const GeneratableProject &genProject, - const QString configurationName); - QString toolkitRootPath(const ProductData &qbsProduct); -QString buildRootPath(const Project &qbsProject); - -QString relativeFilePath(const QString &baseDirectory, - const QString &fullFilePath); - -QString cppStringModuleProperty(const PropertyMap &qbsProps, - const QString &propertyName); - -QStringList cppStringModuleProperties(const PropertyMap &qbsProps, - const QStringList &propertyNames); - QStringList cppModuleCompilerFlags(const PropertyMap &qbsProps); QStringList cppModuleAssemblerFlags(const PropertyMap &qbsProps); diff --git a/src/plugins/generator/keiluv/keiluvversioninfo.cpp b/src/plugins/generator/keiluv/keiluvversioninfo.cpp index 9d9723307..544a07aff 100644 --- a/src/plugins/generator/keiluv/keiluvversioninfo.cpp +++ b/src/plugins/generator/keiluv/keiluvversioninfo.cpp @@ -41,17 +41,14 @@ #include "archs/mcs51/mcs51utils.h" -#include <tools/qbsassert.h> - #include <QtCore/qdebug.h> -#include <QtCore/qglobal.h> namespace qbs { KeiluvVersionInfo::KeiluvVersionInfo( const Version &version, - const std::set<KeiluvUtils::Architecture> &archs) - : m_version(version), m_archs(archs) + const std::set<gen::utils::Architecture> &archs) + : gen::VersionInfo(version, archs) { } @@ -59,47 +56,21 @@ std::set<KeiluvVersionInfo> KeiluvVersionInfo::knownVersions() { static const std::set<KeiluvVersionInfo> known = { {Version(keiluv::mcs51::v5::KeiluvConstants::kUVisionVersion), - {KeiluvUtils::Architecture::Mcs51Architecture}}, + {gen::utils::Architecture::Mcs51}}, }; return known; } -bool KeiluvVersionInfo::operator<(const KeiluvVersionInfo &other) const -{ - return m_version < other.m_version; -} - -bool KeiluvVersionInfo::operator==(const KeiluvVersionInfo &other) const -{ - return m_version == other.m_version - && m_archs == other.m_archs; -} - -Version KeiluvVersionInfo::version() const -{ - return m_version; -} - int KeiluvVersionInfo::marketingVersion() const { - const auto mv = m_version.majorVersion(); + const auto mv = gen::VersionInfo::marketingVersion(); for (const KeiluvVersionInfo &known : knownVersions()) { if (known.version().majorVersion() == mv) return mv; } qWarning() << QStringLiteral("Unrecognized KEIL UV version: ") - << m_version.toString(); + << version().toString(); return 0; } -bool KeiluvVersionInfo::containsArchitecture(KeiluvUtils::Architecture arch) const -{ - return m_archs.find(arch) != m_archs.cend(); -} - -quint32 qHash(const KeiluvVersionInfo &info) -{ - return qHash(info.version().toString()); -} - } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvversioninfo.h b/src/plugins/generator/keiluv/keiluvversioninfo.h index 5bec6ac6e..a64513492 100644 --- a/src/plugins/generator/keiluv/keiluvversioninfo.h +++ b/src/plugins/generator/keiluv/keiluvversioninfo.h @@ -40,37 +40,22 @@ #ifndef QBS_KEILUVVERSIONINFO_H #define QBS_KEILUVVERSIONINFO_H -#include "keiluvutils.h" - -#include <tools/version.h> - -#include <set> +#include <generators/generatorutils.h> +#include <generators/generatorversioninfo.h> namespace qbs { -class KeiluvVersionInfo final +class KeiluvVersionInfo final : public gen::VersionInfo { public: KeiluvVersionInfo(const Version &version, - const std::set<KeiluvUtils::Architecture> &archs); - - static std::set<KeiluvVersionInfo> knownVersions(); + const std::set<gen::utils::Architecture> &archs); - bool operator<(const KeiluvVersionInfo &other) const; - bool operator==(const KeiluvVersionInfo &other) const; + int marketingVersion() const final; - Version version() const; - int marketingVersion() const; - - bool containsArchitecture(KeiluvUtils::Architecture arch) const; - -private: - Version m_version; - std::set<KeiluvUtils::Architecture> m_archs; + static std::set<KeiluvVersionInfo> knownVersions(); }; -quint32 qHash(const KeiluvVersionInfo &info); - } // namespace qbs #endif // QBS_KEILUVVERSIONINFO_H diff --git a/src/plugins/generator/keiluv/keiluvworkspace.cpp b/src/plugins/generator/keiluv/keiluvworkspace.cpp index 948929ee0..b4df92001 100644 --- a/src/plugins/generator/keiluv/keiluvworkspace.cpp +++ b/src/plugins/generator/keiluv/keiluvworkspace.cpp @@ -37,44 +37,32 @@ ** ****************************************************************************/ -#include "ikeiluvnodevisitor.h" -#include "keiluvproperty.h" -#include "keiluvpropertygroup.h" #include "keiluvworkspace.h" +#include <generators/xmlpropertygroup.h> + namespace qbs { KeiluvWorkspace::KeiluvWorkspace(const QString &workspacePath) + : gen::xml::Workspace(workspacePath) { - m_baseDirectory = QFileInfo(workspacePath).absoluteDir(); - // Construct schema version item. - appendChild<KeiluvProperty>(QByteArrayLiteral("SchemaVersion"), - QStringLiteral("1.0")); + appendChild<gen::xml::Property>(QByteArrayLiteral("SchemaVersion"), + QStringLiteral("1.0")); // Construct workspace name item. - appendChild<KeiluvProperty>(QByteArrayLiteral("WorkspaceName"), - QStringLiteral("WorkSpace")); + appendChild<gen::xml::Property>(QByteArrayLiteral("WorkspaceName"), + QStringLiteral("WorkSpace")); } -void KeiluvWorkspace::addProjectPath(const QString &projectFilePath) +void KeiluvWorkspace::addProject(const QString &projectFilePath) { - const QString relativeProjectPath = - m_baseDirectory.relativeFilePath(projectFilePath); + const QString relativeProjectPath = QDir::toNativeSeparators( + m_baseDirectory.relativeFilePath(projectFilePath)); - const auto projectGroup = appendChild<KeiluvPropertyGroup>( + const auto projectGroup = appendChild<gen::xml::PropertyGroup>( QByteArrayLiteral("project")); projectGroup->appendProperty("PathAndName", relativeProjectPath); } -void KeiluvWorkspace::accept(IKeiluvNodeVisitor *visitor) const -{ - visitor->visitStart(this); - - for (const auto &child : children()) - child->accept(visitor); - - visitor->visitEnd(this); -} - } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvworkspace.h b/src/plugins/generator/keiluv/keiluvworkspace.h index 09950efd7..2b274c99f 100644 --- a/src/plugins/generator/keiluv/keiluvworkspace.h +++ b/src/plugins/generator/keiluv/keiluvworkspace.h @@ -40,22 +40,15 @@ #ifndef QBS_KEILUVWORKSPACE_H #define QBS_KEILUVWORKSPACE_H -#include "keiluvproperty.h" - -#include <QtCore/qdir.h> +#include <generators/xmlworkspace.h> namespace qbs { -class KeiluvWorkspace final : public KeiluvProperty +class KeiluvWorkspace final : public gen::xml::Workspace { public: explicit KeiluvWorkspace(const QString &workspacePath); - void addProjectPath(const QString &projectPath); - - void accept(IKeiluvNodeVisitor *visitor) const final; - -private: - QDir m_baseDirectory; + void addProject(const QString &projectPath) final; }; } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvworkspacewriter.cpp b/src/plugins/generator/keiluv/keiluvworkspacewriter.cpp index e646a1122..9070a2542 100644 --- a/src/plugins/generator/keiluv/keiluvworkspacewriter.cpp +++ b/src/plugins/generator/keiluv/keiluvworkspacewriter.cpp @@ -28,70 +28,31 @@ ** ****************************************************************************/ -#include "keiluvproperty.h" -#include "keiluvpropertygroup.h" -#include "keiluvworkspace.h" #include "keiluvworkspacewriter.h" -#include <ostream> - namespace qbs { KeiluvWorkspaceWriter::KeiluvWorkspaceWriter(std::ostream *device) - : m_device(device) -{ - m_writer.reset(new QXmlStreamWriter(&m_buffer)); - m_writer->setAutoFormatting(true); -} - -bool KeiluvWorkspaceWriter::write(const KeiluvWorkspace *workspace) + : gen::xml::WorkspaceWriter(device) { - m_buffer.clear(); - m_writer->writeStartDocument(); - workspace->accept(this); - m_writer->writeEndDocument(); - if (m_writer->hasError()) - return false; - m_device->write(&*std::begin(m_buffer), m_buffer.size()); - return m_device->good(); } -void KeiluvWorkspaceWriter::visitStart(const KeiluvWorkspace *workspace) +void KeiluvWorkspaceWriter::visitStart(const gen::xml::Workspace *workspace) { Q_UNUSED(workspace) - m_writer->writeStartElement(QStringLiteral("ProjectWorkspace")); - m_writer->writeAttribute(QStringLiteral("xmlns:xsi"), - QStringLiteral("http://www.w3.org/2001/XMLSchema-instance")); - m_writer->writeAttribute(QStringLiteral("xsi:noNamespaceSchemaLocation"), - QStringLiteral("project_mpw.xsd")); + writer()->writeStartElement(QStringLiteral("ProjectWorkspace")); + writer()->writeAttribute( + QStringLiteral("xmlns:xsi"), + QStringLiteral("http://www.w3.org/2001/XMLSchema-instance")); + writer()->writeAttribute( + QStringLiteral("xsi:noNamespaceSchemaLocation"), + QStringLiteral("project_mpw.xsd")); } -void KeiluvWorkspaceWriter::visitEnd(const KeiluvWorkspace *workspace) +void KeiluvWorkspaceWriter::visitEnd(const gen::xml::Workspace *workspace) { Q_UNUSED(workspace) - m_writer->writeEndElement(); -} - -void KeiluvWorkspaceWriter::visitStart(const KeiluvProperty *property) -{ - const QString stringValue = property->value().toString(); - m_writer->writeTextElement(QString::fromLatin1(property->name()), stringValue); -} - -void KeiluvWorkspaceWriter::visitEnd(const KeiluvProperty *property) -{ - Q_UNUSED(property) -} - -void KeiluvWorkspaceWriter::visitStart(const KeiluvPropertyGroup *propertyGroup) -{ - m_writer->writeStartElement(QString::fromLatin1(propertyGroup->name())); -} - -void KeiluvWorkspaceWriter::visitEnd(const KeiluvPropertyGroup *propertyGroup) -{ - Q_UNUSED(propertyGroup) - m_writer->writeEndElement(); + writer()->writeEndElement(); } } // namespace qbs diff --git a/src/plugins/generator/keiluv/keiluvworkspacewriter.h b/src/plugins/generator/keiluv/keiluvworkspacewriter.h index 4b4f2dde0..56bcd1ebc 100644 --- a/src/plugins/generator/keiluv/keiluvworkspacewriter.h +++ b/src/plugins/generator/keiluv/keiluvworkspacewriter.h @@ -31,32 +31,19 @@ #ifndef QBS_KEILUVWORKSPACEWRITER_H #define QBS_KEILUVWORKSPACEWRITER_H -#include "ikeiluvnodevisitor.h" +#include <generators/xmlworkspacewriter.h> namespace qbs { -class KeiluvWorkspace; - -class KeiluvWorkspaceWriter final : public IKeiluvNodeVisitor +class KeiluvWorkspaceWriter final : public gen::xml::WorkspaceWriter { Q_DISABLE_COPY(KeiluvWorkspaceWriter) public: explicit KeiluvWorkspaceWriter(std::ostream *device); - bool write(const KeiluvWorkspace *workspace); private: - void visitStart(const KeiluvWorkspace *workspace) final; - void visitEnd(const KeiluvWorkspace *workspace) final; - - void visitStart(const KeiluvProperty *property) final; - void visitEnd(const KeiluvProperty *property) final; - - void visitStart(const KeiluvPropertyGroup *propertyGroup) final; - void visitEnd(const KeiluvPropertyGroup *propertyGroup) final; - - std::ostream *m_device = nullptr; - QByteArray m_buffer; - std::unique_ptr<QXmlStreamWriter> m_writer; + void visitStart(const gen::xml::Workspace *workspace) final; + void visitEnd(const gen::xml::Workspace *workspace) final; }; } // namespace qbs |