From c5b663c4331f639e14ce9cff42afd08b6fcf7b21 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Fri, 28 May 2021 16:32:10 +0300 Subject: baremetal: Long live COSMIC toolchain for STM8 architecture This patch adds support for Cosmic Software compiler for the bare metal platforms: * https://www.cosmicsoftware.com/download.php Note that this compiler only works on Windows host platforms. Also the COSMIC toolchain has been added to the Github CI. Fixes: QBS-1639 Change-Id: Iffba0bc550c5d168fb453c7a325b2c9be06d4195 Reviewed-by: Ivan Komissarov --- .github/workflows/main.yml | 3 +++ share/qbs/modules/cpp/cosmic.js | 29 ++++++++++++++++------ src/app/qbs-setup-toolchains/cosmicprobe.cpp | 4 ++- .../one-object-asm-application.qbs | 2 ++ .../one-object-asm-application/stm8-cosmic.s | 7 ++++++ 5 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 tests/auto/blackbox/testdata-baremetal/one-object-asm-application/stm8-cosmic.s diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c9ba6cb96..67d8b1d71 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -535,6 +535,9 @@ jobs: - name: cosmic-4_3_11-arm run: QBS_AUTOTEST_PROFILE=cosmic-4_3_11-arm scripts/test-baremetal.sh release/install-root/bin shell: bash + - name: cosmic-4_5_2-stm8 + run: QBS_AUTOTEST_PROFILE=cosmic-4_5_2-stm8 scripts/test-baremetal.sh release/install-root/bin + shell: bash test-macos: name: ${{ matrix.config.name }} diff --git a/share/qbs/modules/cpp/cosmic.js b/share/qbs/modules/cpp/cosmic.js index e11e4da28..c6a47535c 100644 --- a/share/qbs/modules/cpp/cosmic.js +++ b/share/qbs/modules/cpp/cosmic.js @@ -41,6 +41,8 @@ function compilerName(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return "cxcorm"; + else if (architecture === "stm8") + return "cxstm8"; throw "Unable to deduce compiler name for unsupported architecture: '" + architecture + "'"; } @@ -49,13 +51,15 @@ function assemblerName(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return "cacorm"; + if (architecture === "stm8") + return "castm8"; throw "Unable to deduce assembler name for unsupported architecture: '" + architecture + "'"; } function linkerName(qbs) { var architecture = qbs.architecture; - if (architecture.startsWith("arm")) + if (architecture.startsWith("arm") || architecture === "stm8") return "clnk"; throw "Unable to deduce linker name for unsupported architecture: '" + architecture + "'"; @@ -63,7 +67,7 @@ function linkerName(qbs) { function listerName(qbs) { var architecture = qbs.architecture; - if (architecture.startsWith("arm")) + if (architecture.startsWith("arm") || architecture === "stm8") return "clabs"; throw "Unable to deduce lister name for unsupported architecture: '" + architecture + "'"; @@ -71,7 +75,7 @@ function listerName(qbs) { function archiverName(qbs) { var architecture = qbs.architecture; - if (architecture.startsWith("arm")) + if (architecture.startsWith("arm") || architecture === "stm8") return "clib"; throw "Unable to deduce archiver name for unsupported architecture: '" + architecture + "'"; @@ -81,6 +85,8 @@ function staticLibrarySuffix(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return ".cxm"; + else if (architecture === "stm8") + return ".sm8"; throw "Unable to deduce static library suffix for unsupported architecture: '" + architecture + "'"; } @@ -89,13 +95,15 @@ function executableSuffix(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return ".cxm"; + else if (architecture === "stm8") + return ".sm8"; throw "Unable to deduce executable suffix for unsupported architecture: '" + architecture + "'"; } function objectSuffix(qbs) { var architecture = qbs.architecture; - if (architecture.startsWith("arm")) + if (architecture.startsWith("arm") || architecture === "stm8") return ".o"; throw "Unable to deduce object file suffix for unsupported architecture: '" + architecture + "'"; @@ -103,7 +111,7 @@ function objectSuffix(qbs) { function imageFormat(qbs) { var architecture = qbs.architecture; - if (architecture.startsWith("arm")) + if (architecture.startsWith("arm") || architecture === "stm8") return "cosmic"; throw "Unable to deduce image format for unsupported architecture: '" + architecture + "'"; @@ -113,6 +121,8 @@ function guessArchitecture(compilerFilePath) { var baseName = FileInfo.baseName(compilerFilePath); if (baseName === "cxcorm") return "arm"; + else if (baseName === "cxstm8") + return "stm8"; throw "Unable to deduce architecture for unsupported compiler: '" + baseName + "'"; } @@ -171,7 +181,7 @@ function dumpVersion(compilerFilePath) { function guessEndianness(architecture) { // There is no mention of supported endianness in the cosmic compiler. - if (architecture.startsWith("arm")) + if (architecture.startsWith("arm") || architecture === "stm8") return "big"; throw "Unable to deduce endianness for unsupported architecture: '" + architecture + "'"; @@ -179,9 +189,14 @@ function guessEndianness(architecture) { function dumpDefaultPaths(compilerFilePath, architecture) { var rootPath = FileInfo.path(compilerFilePath); + var includePath; var includePaths = []; if (architecture.startsWith("arm")) { - var includePath = FileInfo.joinPaths(rootPath, "hcorm"); + includePath = FileInfo.joinPaths(rootPath, "hcorm"); + if (File.exists(includePath)) + includePaths.push(includePath); + } else if (architecture === "stm8") { + includePath = FileInfo.joinPaths(rootPath, "hstm8"); if (File.exists(includePath)) includePaths.push(includePath); } diff --git a/src/app/qbs-setup-toolchains/cosmicprobe.cpp b/src/app/qbs-setup-toolchains/cosmicprobe.cpp index f7f66eef6..2abf10a9a 100644 --- a/src/app/qbs-setup-toolchains/cosmicprobe.cpp +++ b/src/app/qbs-setup-toolchains/cosmicprobe.cpp @@ -58,7 +58,7 @@ using Internal::HostOsInfo; static QStringList knownCosmicCompilerNames() { - return {QStringLiteral("cxcorm")}; + return {QStringLiteral("cxcorm"), QStringLiteral("cxstm8")}; } static QString guessCosmicArchitecture(const QFileInfo &compiler) @@ -66,6 +66,8 @@ static QString guessCosmicArchitecture(const QFileInfo &compiler) const auto baseName = compiler.baseName(); if (baseName == QLatin1String("cxcorm")) return QStringLiteral("arm"); + if (baseName == QLatin1String("cxstm8")) + return QStringLiteral("stm8"); return {}; } diff --git a/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/one-object-asm-application.qbs b/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/one-object-asm-application.qbs index 3eba70cab..f9e2b8ca5 100644 --- a/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/one-object-asm-application.qbs +++ b/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/one-object-asm-application.qbs @@ -5,6 +5,8 @@ BareMetalApplication { if (qbs.toolchainType === "cosmic") { if (qbs.architecture.startsWith("arm")) return true; + if (qbs.architecture === "stm8") + return true; } else if (qbs.toolchainType === "keil") { if (qbs.architecture.startsWith("arm")) return true; diff --git a/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/stm8-cosmic.s b/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/stm8-cosmic.s new file mode 100644 index 000000000..818b0d680 --- /dev/null +++ b/tests/auto/blackbox/testdata-baremetal/one-object-asm-application/stm8-cosmic.s @@ -0,0 +1,7 @@ + scross off +_main: + .dcall "2,0,_main" + ret + .scheck _main + xdef _main + end -- cgit v1.2.1