From c748f199e40698ff8280b87718a3a4375c1a2917 Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Sat, 21 Mar 2020 01:15:40 +0100 Subject: baremetal: Fix detecting older sdcc compiler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ubuntu Bionic has slightly older compiler version (3.5.0) which doesn't have macros that are used to detect compiler version. But it has the "__SDCC" macro containing the value "3_5_0". Use that as a fallback. Change-Id: I0bac78b684e64f11d00f8d915f806f7662d99766 Reviewed-by: AndrĂ© Hartmann Reviewed-by: Denis Shienkov Reviewed-by: Christian Kandeler --- share/qbs/modules/cpp/sdcc.js | 22 ++++++++++++++++++---- src/app/qbs-setup-toolchains/sdccprobe.cpp | 27 +++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/share/qbs/modules/cpp/sdcc.js b/share/qbs/modules/cpp/sdcc.js index 70d0506b9..147fa160f 100644 --- a/share/qbs/modules/cpp/sdcc.js +++ b/share/qbs/modules/cpp/sdcc.js @@ -90,10 +90,24 @@ function guessEndianness(macros) { } function guessVersion(macros) { - return { major: parseInt(macros["__SDCC_VERSION_MAJOR"], 10), - minor: parseInt(macros["__SDCC_VERSION_MINOR"], 10), - patch: parseInt(macros["__SDCC_VERSION_PATCH"], 10), - found: macros["SDCC"] } + if ("__SDCC_VERSION_MAJOR" in macros + && "__SDCC_VERSION_MINOR" in macros + && "__SDCC_VERSION_PATCH" in macros) { + return { major: parseInt(macros["__SDCC_VERSION_MAJOR"], 10), + minor: parseInt(macros["__SDCC_VERSION_MINOR"], 10), + patch: parseInt(macros["__SDCC_VERSION_PATCH"], 10), + found: macros["SDCC"] } + } else if ("__SDCC" in macros) { + var versions = macros["__SDCC"].split("_"); + if (versions.length === 3) { + return { + major: parseInt(versions[0], 10), + minor: parseInt(versions[1], 10), + patch: parseInt(versions[2], 10), + found: macros["SDCC"] }; + } + } + return { found: false }; } function dumpMacros(compilerFilePath, architecture) { diff --git a/src/app/qbs-setup-toolchains/sdccprobe.cpp b/src/app/qbs-setup-toolchains/sdccprobe.cpp index 3eb37cfd3..977d834c4 100644 --- a/src/app/qbs-setup-toolchains/sdccprobe.cpp +++ b/src/app/qbs-setup-toolchains/sdccprobe.cpp @@ -151,6 +151,21 @@ static std::vector createSdccProfileHelper( return profiles; } +static Version dumpOldSddcCompilerVersion(const QByteArray ¯oDump) +{ + const auto keyToken = QByteArrayLiteral("__SDCC "); + const int startIndex = macroDump.indexOf(keyToken); + if (startIndex == -1) + return Version{}; + const int endIndex = macroDump.indexOf('\n', startIndex); + if (endIndex == -1) + return Version{}; + const auto keyLength = keyToken.length(); + return Version::fromString(QString::fromLatin1( + macroDump.mid(startIndex + keyLength, + endIndex - startIndex - keyLength).replace('_', '.'))); +} + static Version dumpSdccCompilerVersion(const QFileInfo &compiler) { const QByteArray dump = dumpSdccMacros(compiler); @@ -161,10 +176,14 @@ static Version dumpSdccCompilerVersion(const QFileInfo &compiler) const int minor = extractVersion(dump, "__SDCC_VERSION_MINOR "); const int patch = extractVersion(dump, "__SDCC_VERSION_PATCH "); if (major < 0 || minor < 0 || patch < 0) { - qbsWarning() << Tr::tr("No '__SDCC_VERSION_xxx' token was found " - "in the compiler dump:\n%1") - .arg(QString::fromUtf8(dump)); - return Version{}; + const auto version = dumpOldSddcCompilerVersion(dump); + if (!version.isValid()) { + qbsWarning() << Tr::tr("No '__SDCC_VERSION_xxx' or '__SDCC' token was found " + "in the compiler dump:\n%1") + .arg(QString::fromUtf8(dump)); + return Version{}; + } + return version; } return Version{major, minor, patch}; -- cgit v1.2.1