aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2019-03-19 16:23:32 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2019-04-10 12:31:41 +0000
commit77218b44b1b12c2b18e4655e114ec0323285e303 (patch)
tree9825e2ed7aca806e3da1702120aed7d9b6dab9c0 /src
parent62e07306481373d9d9b6b656d855b204aa6964f3 (diff)
bare-metal: Add SDCC toolchain support
This commit adds a basic support for the SDCC compiler: * http://sdcc.sourceforge.net/ As this compiler support multiple architectures, then it is impossible to uniquely identify the current architecture by dumping of the pre-defined macros (because its content depends on a target flag). In this case the cpp.architecture will contains a default architecture (which is dumped with an omitted target flag). To use it with Qt Creator, it is enough to add there a desired Kit with a custom SDCC C/C++ compiler, and then set the following in the Kit's Qbs profile settings: * Key: qbs.toolchainType * Value: sdcc To create the SDCC profile it is enougth to use the following command: qbs setup-toolchains --type sdcc <path/to/sdcc/compiler/binary> <profile name> A toolchain type can be omitted; in this case the QBS will tries to detect the toolchain type from the specified compiler name. Also it is possible to auto-detect the SDCC toolchain from the PATH environment using the following command: qbs setup-toolchain --detect At current time are supported only the 8051 (aka MCS51) architecture; other architectures can be added later. Change-Id: I8cc239d62e35472ab667e054a64a1e59c2d548bd Reviewed-by: Richard Weickelt <richard@weickelt.de> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/app/qbs-setup-toolchains/probe.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/app/qbs-setup-toolchains/probe.cpp b/src/app/qbs-setup-toolchains/probe.cpp
index 6deac36ee..af46d451b 100644
--- a/src/app/qbs-setup-toolchains/probe.cpp
+++ b/src/app/qbs-setup-toolchains/probe.cpp
@@ -132,6 +132,18 @@ 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"))
@@ -150,6 +162,8 @@ static QStringList toolchainTypeFromCompilerName(const QString &compilerName)
return canonicalToolchain(QStringLiteral("iar"));
if (isKeilCompiler(compilerName))
return canonicalToolchain(QStringLiteral("keil"));
+ if (isSdccCompiler(compilerName))
+ return canonicalToolchain(QStringLiteral("sdcc"));
return {};
}
@@ -331,6 +345,35 @@ 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;
@@ -407,6 +450,25 @@ 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;
@@ -425,6 +487,7 @@ void probe(Settings *settings)
mingwProbe(settings, profiles);
iarProbe(settings, profiles);
keilProbe(settings, profiles);
+ sdccProbe(settings, profiles);
if (profiles.empty()) {
qStderr << Tr::tr("Could not detect any toolchains. No profile created.") << endl;
@@ -463,6 +526,8 @@ void createProfile(const QString &profileName, const QString &toolchainType,
createIarProfile(compiler, settings, profileName);
else if (toolchainTypes.contains(QLatin1String("keil")))
createKeilProfile(compiler, settings, profileName);
+ else if (toolchainTypes.contains(QLatin1String("sdcc")))
+ createSdccProfile(compiler, settings, profileName);
else
throw qbs::ErrorInfo(Tr::tr("Cannot create profile: Unknown toolchain type."));
}