From 6d32d72df0879887a1a4cf1b5794550bfb0deeb5 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Tue, 14 May 2019 22:02:52 +0300 Subject: bare-metal: Implement cpp.compilerDefinesByLanguage for KEIL toolchain Change-Id: Id689c4e0290ba83e8755b6787601338a01af07c9 Reviewed-by: Christian Kandeler --- share/qbs/imports/qbs/Probes/KeilProbe.qbs | 17 ++++++++++++++++- share/qbs/modules/cpp/keil.js | 22 ++++++++++++++-------- share/qbs/modules/cpp/keil.qbs | 3 ++- 3 files changed, 32 insertions(+), 10 deletions(-) (limited to 'share') diff --git a/share/qbs/imports/qbs/Probes/KeilProbe.qbs b/share/qbs/imports/qbs/Probes/KeilProbe.qbs index 70712ab61..9862a682a 100644 --- a/share/qbs/imports/qbs/Probes/KeilProbe.qbs +++ b/share/qbs/imports/qbs/Probes/KeilProbe.qbs @@ -34,6 +34,7 @@ import "../../../modules/cpp/keil.js" as KEIL PathProbe { // Inputs property string compilerFilePath; + property stringList enableDefinesByLanguage; property string _nullDevice: qbs.nullDevice @@ -43,14 +44,28 @@ PathProbe { property int versionMajor; property int versionMinor; property int versionPatch; + property var compilerDefinesByLanguage; configure: { + compilerDefinesByLanguage = {}; + if (!File.exists(compilerFilePath)) { found = false; return; } - var macros = KEIL.dumpMacros(compilerFilePath, qbs, _nullDevice); + var languages = enableDefinesByLanguage; + if (!languages || languages.length === 0) + languages = ["c"]; + + for (var i = 0; i < languages.length; ++i) { + var tag = languages[i]; + compilerDefinesByLanguage[tag] = KEIL.dumpMacros( + compilerFilePath, tag, _nullDevice); + } + + var macros = compilerDefinesByLanguage["c"] + || compilerDefinesByLanguage["cpp"]; architecture = KEIL.guessArchitecture(macros); endianness = KEIL.guessEndianness(macros); diff --git a/share/qbs/modules/cpp/keil.js b/share/qbs/modules/cpp/keil.js index 314d84c69..fbdc0e9fb 100644 --- a/share/qbs/modules/cpp/keil.js +++ b/share/qbs/modules/cpp/keil.js @@ -81,7 +81,11 @@ function guessVersion(macros) // Note: The KEIL 8051 compiler does not support the predefined // macros dumping. So, we do it with following trick where we try // to compile a temporary file and to parse the console output. -function dumpC51CompilerMacros(compilerFilePath, qbs) { +function dumpC51CompilerMacros(compilerFilePath, tag) { + // C51 compiler support only C language. + if (tag === "cpp") + return {}; + function createDumpMacrosFile() { var td = new TemporaryDir(); var fn = FileInfo.fromNativeSeparators(td.path() + "/dump-macros.c"); @@ -107,11 +111,13 @@ function dumpC51CompilerMacros(compilerFilePath, qbs) { return map; } -function dumpArmCompilerMacros(compilerFilePath, qbs, nullDevice) { +function dumpArmCompilerMacros(compilerFilePath, tag, nullDevice) { + var args = [ "-E", "--list-macros", nullDevice ]; + if (tag === "cpp") + args.push("--cpp"); + var p = new Process(); - p.exec(compilerFilePath, - [ "-E", "--list-macros", nullDevice ], - false); + p.exec(compilerFilePath, args, false); var map = {}; p.readStdOut().trim().split(/\r?\n/g).map(function (line) { if (!line.startsWith("#define")) @@ -122,9 +128,9 @@ function dumpArmCompilerMacros(compilerFilePath, qbs, nullDevice) { return map; } -function dumpMacros(compilerFilePath, qbs, nullDevice) { - var map1 = dumpC51CompilerMacros(compilerFilePath, qbs); - var map2 = dumpArmCompilerMacros(compilerFilePath, qbs, nullDevice); +function dumpMacros(compilerFilePath, tag, nullDevice) { + var map1 = dumpC51CompilerMacros(compilerFilePath, tag, nullDevice); + var map2 = dumpArmCompilerMacros(compilerFilePath, tag, nullDevice); var map = {}; for (var attrname in map1) map[attrname] = map1[attrname]; diff --git a/share/qbs/modules/cpp/keil.qbs b/share/qbs/modules/cpp/keil.qbs index dab37801a..3d03f9112 100644 --- a/share/qbs/modules/cpp/keil.qbs +++ b/share/qbs/modules/cpp/keil.qbs @@ -50,6 +50,7 @@ CppModule { id: keilProbe condition: !_skipAllChecks compilerFilePath: compilerPath + enableDefinesByLanguage: enableCompilerDefinesByLanguage } qbs.architecture: keilProbe.found ? keilProbe.architecture : original @@ -59,7 +60,7 @@ CppModule { compilerVersionPatch: keilProbe.versionPatch endianness: keilProbe.endianness - compilerDefinesByLanguage: [] + compilerDefinesByLanguage: keilProbe.compilerDefinesByLanguage property string toolchainInstallPath: compilerPathProbe.found ? compilerPathProbe.path : undefined -- cgit v1.2.3