diff options
-rw-r--r-- | src/app/qbs-setup-toolchains/probe.cpp | 61 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/qbs-setup-toolchains.pro | 10 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/qbs-setup-toolchains.qbs | 2 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/sdccprobe.cpp | 170 | ||||
-rw-r--r-- | src/app/qbs-setup-toolchains/sdccprobe.h | 65 |
5 files changed, 244 insertions, 64 deletions
diff --git a/src/app/qbs-setup-toolchains/probe.cpp b/src/app/qbs-setup-toolchains/probe.cpp index af46d451b..df617da23 100644 --- a/src/app/qbs-setup-toolchains/probe.cpp +++ b/src/app/qbs-setup-toolchains/probe.cpp @@ -40,6 +40,7 @@ #include "clangclprobe.h" #include "msvcprobe.h" +#include "sdccprobe.h" #include "xcodeprobe.h" #include <logging/translator.h> @@ -132,18 +133,6 @@ static bool isKeilCompiler(const QString &compilerName) }); } -static QStringList knownSdccCompilerNames() -{ - return {QStringLiteral("sdcc")}; -} - -static bool isSdccCompiler(const QString &compilerName) -{ - return Internal::any_of(knownSdccCompilerNames(), [compilerName](const QString &knownName) { - return compilerName.contains(knownName); - }); -} - static QStringList toolchainTypeFromCompilerName(const QString &compilerName) { if (compilerName == QLatin1String("cl.exe")) @@ -345,35 +334,6 @@ static Profile createKeilProfile(const QFileInfo &compiler, Settings *settings, return profile; } -static QString guessSdccArchitecture(const QFileInfo &compiler) -{ - const auto baseName = compiler.baseName(); - if (baseName == QLatin1String("sdcc")) - return QStringLiteral("mcs51"); - return {}; -} - -static Profile createSdccProfile(const QFileInfo &compiler, Settings *settings, - QString profileName = QString()) -{ - const QString architecture = guessSdccArchitecture(compiler); - - // In case the profile is auto-detected. - if (profileName.isEmpty()) - profileName = QLatin1String("sdcc-") + architecture; - - Profile profile(profileName, settings); - profile.setValue(QStringLiteral("cpp.toolchainInstallPath"), compiler.absolutePath()); - profile.setValue(QStringLiteral("qbs.toolchainType"), QStringLiteral("sdcc")); - if (!architecture.isEmpty()) - profile.setValue(QStringLiteral("qbs.architecture"), architecture); - - qStdout << Tr::tr("Profile '%1' created for '%2'.").arg( - profile.name(), compiler.absoluteFilePath()) - << endl; - return profile; -} - static void gccProbe(Settings *settings, QList<Profile> &profiles, const QString &compilerName) { qStdout << Tr::tr("Trying to detect %1...").arg(compilerName) << endl; @@ -450,25 +410,6 @@ static void keilProbe(Settings *settings, QList<Profile> &profiles) qStdout << Tr::tr("No KEIL toolchains found.") << endl; } -static void sdccProbe(Settings *settings, QList<Profile> &profiles) -{ - qStdout << Tr::tr("Trying to detect SDCC toolchains...") << endl; - - bool isFound = false; - const auto compilerNames = knownSdccCompilerNames(); - for (const QString &compilerName : compilerNames) { - const QString sdccPath = findExecutable(HostOsInfo::appendExecutableSuffix(compilerName)); - if (!sdccPath.isEmpty()) { - const auto profile = createSdccProfile(sdccPath, settings); - profiles.push_back(profile); - isFound = true; - } - } - - if (!isFound) - qStdout << Tr::tr("No SDCC toolchains found.") << endl; -} - void probe(Settings *settings) { QList<Profile> profiles; diff --git a/src/app/qbs-setup-toolchains/qbs-setup-toolchains.pro b/src/app/qbs-setup-toolchains/qbs-setup-toolchains.pro index 79b9316ad..8cb1f2d70 100644 --- a/src/app/qbs-setup-toolchains/qbs-setup-toolchains.pro +++ b/src/app/qbs-setup-toolchains/qbs-setup-toolchains.pro @@ -3,19 +3,21 @@ include(../app.pri) TARGET = qbs-setup-toolchains HEADERS += \ - commandlineparser.h \ clangclprobe.h \ + commandlineparser.h \ msvcprobe.h \ probe.h \ - xcodeprobe.h + sdccprobe.h \ + xcodeprobe.h \ SOURCES += \ - commandlineparser.cpp \ clangclprobe.cpp \ + commandlineparser.cpp \ main.cpp \ msvcprobe.cpp \ probe.cpp \ - xcodeprobe.cpp + sdccprobe.cpp \ + xcodeprobe.cpp \ mingw { RC_FILE = qbs-setup-toolchains.rc diff --git a/src/app/qbs-setup-toolchains/qbs-setup-toolchains.qbs b/src/app/qbs-setup-toolchains/qbs-setup-toolchains.qbs index f4a521b22..6c772e8f6 100644 --- a/src/app/qbs-setup-toolchains/qbs-setup-toolchains.qbs +++ b/src/app/qbs-setup-toolchains/qbs-setup-toolchains.qbs @@ -13,6 +13,8 @@ QbsApp { "msvcprobe.h", "probe.cpp", "probe.h", + "sdccprobe.cpp", + "sdccprobe.h", "xcodeprobe.cpp", "xcodeprobe.h", ] diff --git a/src/app/qbs-setup-toolchains/sdccprobe.cpp b/src/app/qbs-setup-toolchains/sdccprobe.cpp new file mode 100644 index 000000000..00275e51d --- /dev/null +++ b/src/app/qbs-setup-toolchains/sdccprobe.cpp @@ -0,0 +1,170 @@ +/**************************************************************************** +** +** 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 "probe.h" +#include "sdccprobe.h" + +#include "../shared/logging/consolelogger.h" + +#include <logging/translator.h> + +#include <tools/hostosinfo.h> +#include <tools/profile.h> + +#include <QtCore/qfileinfo.h> +#include <QtCore/qlist.h> +#include <QtCore/qsettings.h> + +using namespace qbs; +using Internal::Tr; +using Internal::HostOsInfo; + +namespace { + +static QStringList knownSdccCompilerNames() +{ + return {QStringLiteral("sdcc")}; +} + +static QString guessSdccArchitecture(const QFileInfo &compiler) +{ + const auto baseName = compiler.baseName(); + if (baseName == QLatin1String("sdcc")) + return QStringLiteral("mcs51"); + return {}; +} + +static Profile createSdccProfileHelper(const QFileInfo &compiler, Settings *settings, + QString profileName = QString()) +{ + const QString architecture = guessSdccArchitecture(compiler); + + // In case the profile is auto-detected. + if (profileName.isEmpty()) + profileName = QLatin1String("sdcc-") + architecture; + + Profile profile(profileName, settings); + profile.setValue(QStringLiteral("cpp.toolchainInstallPath"), compiler.absolutePath()); + profile.setValue(QStringLiteral("qbs.toolchainType"), QStringLiteral("sdcc")); + if (!architecture.isEmpty()) + profile.setValue(QStringLiteral("qbs.architecture"), architecture); + + qbsInfo() << Tr::tr("Profile '%1' created for '%2'.").arg( + profile.name(), compiler.absoluteFilePath()); + return profile; +} + +static std::vector<SdccInstallInfo> installedSdccsFromPath() +{ + std::vector<SdccInstallInfo> infos; + const auto compilerNames = knownSdccCompilerNames(); + for (const QString &compilerName : compilerNames) { + const QFileInfo sdccPath( + findExecutable( + HostOsInfo::appendExecutableSuffix(compilerName))); + if (!sdccPath.exists()) + continue; + infos.push_back({sdccPath.absoluteFilePath(), {}}); + } + return infos; +} + +static std::vector<SdccInstallInfo> installedSdccsFromRegistry() +{ + std::vector<SdccInstallInfo> infos; + + if (HostOsInfo::isWindowsHost()) { + +#ifdef Q_OS_WIN64 + static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\SDCC"; +#else + static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\SDCC"; +#endif + + QSettings registry(QLatin1String(kRegistryNode), QSettings::NativeFormat); + QString rootPath = registry.value(QStringLiteral("Default")).toString(); + if (!rootPath.isEmpty()) { + // Build full compiler path. + const QFileInfo sdccPath(rootPath + QLatin1String("\\bin\\sdcc.exe")); + if (sdccPath.exists()) { + // Build compiler version. + const QString version = QStringLiteral("%1.%2.%3").arg( + registry.value(QStringLiteral("VersionMajor")).toString(), + registry.value(QStringLiteral("VersionMinor")).toString(), + registry.value(QStringLiteral("VersionRevision")).toString()); + infos.push_back({sdccPath.absoluteFilePath(), version}); + } + } + } + + return infos; +} + +} // end of anonymous namespace + +bool isSdccCompiler(const QString &compilerName) +{ + return Internal::any_of(knownSdccCompilerNames(), [compilerName]( + const QString &knownName) { + return compilerName.contains(knownName); + }); +} + +void createSdccProfile(const QFileInfo &compiler, Settings *settings, + QString profileName) +{ + createSdccProfileHelper(compiler, settings, profileName); +} + +void sdccProbe(Settings *settings, QList<Profile> &profiles) +{ + qbsInfo() << Tr::tr("Trying to detect SDCC toolchains..."); + + std::vector<SdccInstallInfo> allInfos = installedSdccsFromRegistry(); + const std::vector<SdccInstallInfo> pathInfos = installedSdccsFromPath(); + allInfos.insert(std::end(allInfos), std::begin(pathInfos), std::end(pathInfos)); + + for (const SdccInstallInfo &info : allInfos) { + const auto profile = createSdccProfileHelper(info.compilerPath, settings); + profiles.push_back(profile); + } + + if (allInfos.empty()) + qbsInfo() << Tr::tr("No SDCC toolchains found."); +} diff --git a/src/app/qbs-setup-toolchains/sdccprobe.h b/src/app/qbs-setup-toolchains/sdccprobe.h new file mode 100644 index 000000000..3cb147e4f --- /dev/null +++ b/src/app/qbs-setup-toolchains/sdccprobe.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** 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 SDCCPROBE_H +#define SDCCPROBE_H + +#include <QtCore/qlist.h> + +class QFileInfo; + +namespace qbs { +class Profile; +class Settings; +} + +struct SdccInstallInfo +{ + QString compilerPath; + QString version; +}; + +bool isSdccCompiler(const QString &compilerName); + +void createSdccProfile(const QFileInfo &compiler, qbs::Settings *settings, + QString profileName); + +void sdccProbe(qbs::Settings *settings, QList<qbs::Profile> &profiles); + +#endif // SDCCPROBE_H |