diff options
Diffstat (limited to 'share/qbs/modules/cpp/iar.js')
-rw-r--r-- | share/qbs/modules/cpp/iar.js | 505 |
1 files changed, 318 insertions, 187 deletions
diff --git a/share/qbs/modules/cpp/iar.js b/share/qbs/modules/cpp/iar.js index f1c41fe64..d25b74324 100644 --- a/share/qbs/modules/cpp/iar.js +++ b/share/qbs/modules/cpp/iar.js @@ -38,35 +38,138 @@ var TemporaryDir = require("qbs.TemporaryDir"); var TextFile = require("qbs.TextFile"); function supportXLinker(architecture) { - return architecture === "78k" || architecture === "avr" - || architecture === "avr32" || architecture === "mcs51" - || architecture === "msp430" || architecture === "v850" - || architecture === "m68k" || architecture === "m32c" - || architecture === "r32c" || architecture === "m16c" - || architecture === "cr16"; + return architecture === "78k" + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs12" + || architecture === "hcs8" + || architecture === "m16c" + || architecture === "m32c" + || architecture === "m68k" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "r32c" + || architecture === "v850"; } function supportILinker(architecture) { return architecture.startsWith("arm") - || architecture === "rh850" || architecture === "rl78" - || architecture === "rx" || architecture === "stm8" - || architecture === "sh" || architecture === "riscv"; + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8"; } function supportXArchiver(architecture) { - return architecture === "mcs51" || architecture === "avr" - || architecture === "msp430" || architecture === "v850" - || architecture === "78k" || architecture === "avr32" - || architecture === "m68k" || architecture === "m32c" - || architecture === "r32c" || architecture === "m16c" - || architecture === "cr16"; + return architecture === "78k" + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs12" + || architecture === "hcs8" + || architecture === "m16c" + || architecture === "m32c" + || architecture === "m68k" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "r32c" + || architecture === "v850"; } function supportIArchiver(architecture) { return architecture.startsWith("arm") - || architecture === "stm8" || architecture === "rl78" - || architecture === "rx" || architecture === "rh850" - || architecture === "sh" || architecture === "riscv"; + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8"; +} + +function supportXAssembler(architecture) { + return architecture.startsWith("arm") + || architecture === "78k" + || architecture === "avr" + || architecture === "hcs12" + || architecture === "m16c" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "m32c" + || architecture === "v850"; +} + +function supportIAssembler(architecture) { + return architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs8" + || architecture === "r32c" + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8" + || architecture === "m68k"; +} + +function supportEndianness(architecture) { + return architecture.startsWith("arm") + || architecture === "rx"; +} + +function supportCppExceptions(architecture) { + return architecture.startsWith("arm") + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx"; +} + +function supportCppRtti(architecture) { + return architecture.startsWith("arm") + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx"; +} + +function supportCppWarningAboutCStyleCast(architecture) { + return architecture.startsWith("arm") + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "rh850" + || architecture === "rl78" + || architecture === "rx" + || architecture === "stm8" + || architecture === "v850"; +} + +function supportDeprecatedFeatureWarnings(architecture) { + return architecture.startsWith("arm") + || architecture === "avr" + || architecture === "cr16" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "rh850" + || architecture === "rl78" + || architecture === "rx" + || architecture === "stm8" + || architecture === "v850"; +} + +function supportCLanguageVersion(architecture) { + return architecture !== "78k"; +} + +function supportCppLanguage(compilerFilePath) { + var baseName = FileInfo.baseName(compilerFilePath); + return baseName !== "iccs08"; } // It is a 'magic' IAR-specific target architecture code. @@ -94,7 +197,11 @@ function architectureCode(architecture) { return "34"; case "cr16": return "45"; - case "rh850": case "rl78": case "rx": case "stm8": case "sh": case "riscv": + case "hcs12": + return "12"; + case "hcs8": + return "78"; + case "rh850": case "riscv": case "rl78": case "rx": case "sh": case "stm8": return ""; default: if (architecture.startsWith("arm")) @@ -107,40 +214,44 @@ function compilerName(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return "iccarm"; - else if (architecture === "mcs51") - return "icc8051"; + else if (architecture === "78k") + return "icc78k"; else if (architecture === "avr") return "iccavr"; - else if (architecture === "stm8") - return "iccstm8"; + else if (architecture === "avr32") + return "iccavr32"; + else if (architecture === "cr16") + return "icccr16c"; + else if (architecture === "hcs12") + return "icchcs12"; + else if (architecture === "hcs8") + return "iccs08"; + else if (architecture === "m16c") + return "iccm16c"; + else if (architecture === "m32c") + return "iccm32c"; + else if (architecture === "m68k") + return "icccf"; + else if (architecture === "mcs51") + return "icc8051"; else if (architecture === "msp430") return "icc430"; - else if (architecture === "v850") - return "iccv850"; - else if (architecture === "78k") - return "icc78k"; + else if (architecture === "r32c") + return "iccr32c"; + else if (architecture === "rh850") + return "iccrh850"; + else if (architecture === "riscv") + return "iccriscv"; else if (architecture === "rl78") return "iccrl78"; else if (architecture === "rx") return "iccrx"; - else if (architecture === "rh850") - return "iccrh850"; - else if (architecture === "avr32") - return "iccavr32"; else if (architecture === "sh") return "iccsh"; - else if (architecture === "riscv") - return "iccriscv"; - else if (architecture === "m68k") - return "icccf"; - else if (architecture === "m32c") - return "iccm32c"; - else if (architecture === "r32c") - return "iccr32c"; - else if (architecture === "m16c") - return "iccm16c"; - else if (architecture === "cr16") - return "icccr16c"; + else if (architecture === "stm8") + return "iccstm8"; + else if (architecture === "v850") + return "iccv850"; throw "Unable to deduce compiler name for unsupported architecture: '" + architecture + "'"; } @@ -149,40 +260,44 @@ function assemblerName(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return "iasmarm"; - else if (architecture === "rl78") - return "iasmrl78"; - else if (architecture === "rx") - return "iasmrx"; - else if (architecture === "rh850") - return "iasmrh850"; - else if (architecture === "mcs51") - return "a8051"; - else if (architecture === "avr") - return "aavr"; - else if (architecture === "stm8") - return "iasmstm8"; - else if (architecture === "msp430") - return "a430"; - else if (architecture === "v850") - return "av850"; else if (architecture === "78k") return "a78k"; + else if (architecture === "avr") + return "aavr"; else if (architecture === "avr32") return "aavr32"; - else if (architecture === "sh") - return "iasmsh"; - else if (architecture === "riscv") - return "iasmriscv"; - else if (architecture === "m68k") - return "acf"; + else if (architecture === "cr16") + return "acr16c"; + else if (architecture === "hcs12") + return "ahcs12"; + else if (architecture === "hcs8") + return "as08"; + else if (architecture === "m16c") + return "am16c"; else if (architecture === "m32c") return "am32c"; + else if (architecture === "m68k") + return "acf"; + else if (architecture === "mcs51") + return "a8051"; + else if (architecture === "msp430") + return "a430"; else if (architecture === "r32c") return "ar32c"; - else if (architecture === "m16c") - return "am16c"; - else if (architecture === "cr16") - return "acr16c"; + else if (architecture === "rh850") + return "iasmrh850"; + else if (architecture === "riscv") + return "iasmriscv"; + else if (architecture === "rl78") + return "iasmrl78"; + else if (architecture === "rx") + return "iasmrx"; + else if (architecture === "sh") + return "iasmsh"; + else if (architecture === "stm8") + return "iasmstm8"; + else if (architecture === "v850") + return "av850"; throw "Unable to deduce assembler name for unsupported architecture: '" + architecture + "'"; } @@ -253,16 +368,16 @@ function guessArmArchitecture(core) { arch += "v4m"; else if (core === "__ARM4TM__") arch += "v4tm"; - else if (core === "__ARM5__") - arch += "v5"; else if (core === "__ARM5E__") arch += "v5e"; - else if (core === "__ARM6__") - arch += "v6"; + else if (core === "__ARM5__") + arch += "v5"; else if (core === "__ARM6M__") arch += "v6m"; else if (core === "__ARM6SM__") arch += "v6sm"; + else if (core === "__ARM6__") + arch += "v6"; else if (core === "__ARM7M__") arch += "v7m"; else if (core === "__ARM7R__") @@ -271,42 +386,46 @@ function guessArmArchitecture(core) { } function guessArchitecture(macros) { - if (macros["__ICCARM__"] === "1") - return guessArmArchitecture(macros["__CORE__"]); - else if (macros["__ICC8051__"] === "1") - return "mcs51"; - else if (macros["__ICCAVR__"] === "1") - return "avr"; - else if (macros["__ICCSTM8__"] === "1") - return "stm8"; - else if (macros["__ICC430__"] === "1") + if (macros["__ICC430__"] === "1") return "msp430"; - else if (macros["__ICCRL78__"] === "1") - return "rl78"; - else if (macros["__ICCRX__"] === "1") - return "rx"; - else if (macros["__ICCRH850__"] === "1") - return "rh850"; - else if (macros["__ICCV850__"] === "1") - return "v850"; else if (macros["__ICC78K__"] === "1") return "78k"; + else if (macros["__ICC8051__"] === "1") + return "mcs51"; + else if (macros["__ICCARM__"] === "1") + return guessArmArchitecture(macros["__CORE__"]); else if (macros["__ICCAVR32__"] === "1") return "avr32"; - else if (macros["__ICCSH__"] === "1") - return "sh"; - else if (macros["__ICCRISCV__"] === "1") - return "riscv"; + else if (macros["__ICCAVR__"] === "1") + return "avr"; else if (macros["__ICCCF__"] === "1") return "m68k"; + else if (macros["__ICCCR16C__"] === "1") + return "cr16"; + else if (macros["__ICCHCS12__"] === "1") + return "hcs12"; + else if (macros["__ICCM16C__"] === "1") + return "m16c"; else if (macros["__ICCM32C__"] === "1") return "m32c"; else if (macros["__ICCR32C__"] === "1") return "r32c"; - else if (macros["__ICCM16C__"] === "1") - return "m16c"; - else if (macros["__ICCCR16C__"] === "1") - return "cr16"; + else if (macros["__ICCRH850__"] === "1") + return "rh850"; + else if (macros["__ICCRISCV__"] === "1") + return "riscv"; + else if (macros["__ICCRL78__"] === "1") + return "rl78"; + else if (macros["__ICCRX__"] === "1") + return "rx"; + else if (macros["__ICCS08__"] === "1") + return "hcs8"; + else if (macros["__ICCSH__"] === "1") + return "sh"; + else if (macros["__ICCSTM8__"] === "1") + return "stm8"; + else if (macros["__ICCV850__"] === "1") + return "v850"; } function guessEndianness(macros) { @@ -315,19 +434,31 @@ function guessEndianness(macros) { return "big" } -function guessVersion(macros, architecture) -{ +function guessVersion(macros, architecture) { var version = parseInt(macros["__VER__"], 10); if (architecture.startsWith("arm")) { return { major: parseInt(version / 1000000), minor: parseInt(version / 1000) % 1000, patch: parseInt(version) % 1000 } - } else if (architecture === "mcs51" || architecture === "avr" || architecture === "stm8" - || architecture === "msp430" || architecture === "rl78" || architecture === "rx" - || architecture === "rh850" || architecture === "v850" || architecture === "78k" - || architecture === "avr32" || architecture === "sh" || architecture === "riscv" - || architecture === "m68k" || architecture === "m32c" || architecture === "r32c" - || architecture === "m16c" || architecture === "cr16") { + } else if (architecture === "78k" + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs12" + || architecture === "hcs8" + || architecture === "m16c" + || architecture === "m32c" + || architecture === "m68k" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "r32c" + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8" + || architecture === "v850") { return { major: parseInt(version / 100), minor: parseInt(version % 100), patch: 0 } @@ -338,24 +469,25 @@ function cppLanguageOption(compilerFilePath) { var baseName = FileInfo.baseName(compilerFilePath); switch (baseName) { case "iccarm": - case "iccrl78": - case "iccrx": case "iccrh850": case "iccriscv": + case "iccrl78": + case "iccrx": return "--c++"; - case "icc8051": - case "iccavr": - case "iccstm8": case "icc430": - case "iccv850": case "icc78k": + case "icc8051": + case "iccavr": case "iccavr32": - case "iccsh": case "icccf": + case "icccr16c": + case "icchcs12": + case "iccm16c": case "iccm32c": case "iccr32c": - case "iccm16c": - case "icccr16c": + case "iccsh": + case "iccstm8": + case "iccv850": return "--ec++"; } throw "Unable to deduce C++ language option for unsupported compiler: '" @@ -369,7 +501,7 @@ function dumpMacros(compilerFilePath, tag) { var outFilePath = FileInfo.fromNativeSeparators(tempDir.path() + "/iar-macros.predef"); var args = [ inFilePath, "--predef_macros", outFilePath ]; - if (tag && tag === "cpp") + if (tag === "cpp" && supportCppLanguage(compilerFilePath)) args.push(cppLanguageOption(compilerFilePath)); var p = new Process(); @@ -378,45 +510,47 @@ function dumpMacros(compilerFilePath, tag) { return ModUtils.extractMacros(outFile.readAll()); } -function dumpDefaultPaths(compilerFilePath, tag) { +function dumpCompilerIncludePaths(compilerFilePath, tag) { + // We can dump the compiler include paths using the undocumented `--IDE3` flag, + // e.g. which also is used in the IAR extension for the VSCode. In this case the + // compiler procuces the console output in the following format: + // `$$TOOL_BEGIN $$VERSION "3" $$INC_BEGIN $$FILEPATH "<path\\to\\directory>" $$TOOL_END` + var tempDir = new TemporaryDir(); var inFilePath = FileInfo.fromNativeSeparators(tempDir.path() + "/empty-source.c"); var inFile = new TextFile(inFilePath, TextFile.WriteOnly); - var args = [ inFilePath, "--preinclude", "." ]; - if (tag === "cpp") + var args = ["--IDE3", inFilePath]; + if (tag === "cpp" && supportCppLanguage(compilerFilePath)) args.push(cppLanguageOption(compilerFilePath)); + var includePaths = []; var p = new Process(); - // This process should return an error, don't throw - // an error in this case. + // It is possible that the process can return an error code in case the + // compiler does not support the `--IDE3` flag. So, don't throw an error in this case. p.exec(compilerFilePath, args, false); - var output = p.readStdErr(); - - var includePaths = []; - var pass = 0; - for (var pos = 0; pos < output.length; ++pos) { - var searchIndex = output.indexOf("searched:", pos); - if (searchIndex === -1) - break; - var startQuoteIndex = output.indexOf('"', searchIndex + 1); - if (startQuoteIndex === -1) - break; - var endQuoteIndex = output.indexOf('"', startQuoteIndex + 1); - if (endQuoteIndex === -1) - break; - pos = endQuoteIndex + 1; - - // Ignore the first path as it is not a compiler include path. - ++pass; - if (pass === 1) - continue; + p.readStdOut().trim().split(/\r?\n/g).map(function(line) { + var m = line.match(/\$\$INC_BEGIN\s\$\$FILEPATH\s\"([^"]*)/); + if (m) { + var includePath = m[1].replace(/\\\\/g, '/'); + if (includePath) + includePaths.push(includePath); + } + }); - var path = output.substring(startQuoteIndex + 1, endQuoteIndex) - .replace(/[\s]{2,}/g, ' '); - includePaths.push(path); + if (includePaths.length === 0) { + // This can happen if the compiler does not support the `--IDE3` flag, + // e.g. IAR for S08 architecture. In this case we use fallback to the + // detection of the `inc` directory. + var includePath = FileInfo.joinPaths(FileInfo.path(compilerFilePath), "../inc/"); + includePaths.push(includePath); } + return includePaths; +} + +function dumpDefaultPaths(compilerFilePath, tag) { + var includePaths = dumpCompilerIncludePaths(compilerFilePath, tag); return { "includePaths": includePaths }; @@ -441,7 +575,7 @@ function collectLibraryDependencies(product) { if (!obj.cpp) return; function ensureArray(a) { - return Array.isArray(a) ? a : []; + return (a instanceof Array) ? a : []; } function sanitizedModuleListProperty(obj, moduleName, propertyName) { return ensureArray(ModUtils.sanitizedModuleProperty(obj, moduleName, propertyName)); @@ -521,9 +655,6 @@ function staticLibraryLinkerOutputArtifacts(product) { } function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { - // Determine which C-language we're compiling. - var tag = ModUtils.fileTagForTargetLanguage(input.fileTags.concat(outputs.obj[0].fileTags)); - var args = []; // Input. @@ -580,6 +711,7 @@ function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { } var architecture = input.qbs.architecture; + var tag = ModUtils.fileTagForTargetLanguage(input.fileTags.concat(outputs.obj[0].fileTags)); // Warning level flags. switch (input.cpp.warningLevel) { @@ -587,24 +719,21 @@ function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { args.push("--no_warnings"); break; case "all": - if (architecture !== "78k") { - if (architecture !== "avr32" && architecture !== "r32c" - && architecture !== "sh" && architecture !== "m16c") { + if (supportDeprecatedFeatureWarnings(architecture)) { args.push("--deprecated_feature_warnings=" +"+attribute_syntax," +"+preprocessor_extensions," +"+segment_pragmas"); } - if (tag === "cpp") + if (tag === "cpp" && supportCppWarningAboutCStyleCast(architecture)) args.push("--warn_about_c_style_casts"); - } break; } if (input.cpp.treatWarningsAsErrors) args.push("--warnings_are_errors"); // C language version flags. - if (tag === "c" && (architecture !== "78k")) { + if (tag === "c" && supportCLanguageVersion(architecture)) { var knownValues = ["c89"]; var cLanguageVersion = Cpp.languageVersion( input.cpp.cLanguageVersion, knownValues, "C"); @@ -620,35 +749,27 @@ function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { } // C++ language version flags. - if (tag === "cpp") { - if (architecture.startsWith("arm") - || architecture === "rl78" || architecture === "rx" - || architecture === "rh850" || architecture === "riscv") { - // Enable C++ language flags. - args.push("--c++"); - // Exceptions flags. - if (!input.cpp.enableExceptions) - args.push("--no_exceptions"); - // RTTI flags. - if (!input.cpp.enableRtti) - args.push("--no_rtti"); - } else if (architecture === "stm8" || architecture === "mcs51" - || architecture === "avr" || architecture === "msp430" - || architecture === "v850" || architecture === "78k" - || architecture === "avr32" || architecture === "sh" - || architecture === "m68k" || architecture === "m32c" - || architecture === "r32c" || architecture === "m16c" - || architecture === "cr16") { - args.push("--ec++"); - } + var compilerFilePath = input.cpp.compilerPath; + if (tag === "cpp" && supportCppLanguage(compilerFilePath)) { + // C++ language flag. + var cppOption = cppLanguageOption(compilerFilePath); + args.push(cppOption); + + // Exceptions flag. + var enableExceptions = input.cpp.enableExceptions; + if (!enableExceptions && supportCppExceptions(architecture)) + args.push("--no_exceptions"); + + // RTTI flag. + var enableRtti = input.cpp.enableRtti; + if (!enableRtti && supportCppRtti(architecture)) + args.push("--no_rtti"); } // Byte order flags. - if (architecture.startsWith("arm") || architecture === "rx") { - var endianness = input.cpp.endianness; - if (endianness) - args.push("--endian=" + endianness); - } + var endianness = input.cpp.endianness; + if (endianness && supportEndianness(architecture)) + args.push("--endian=" + endianness); // Listing files generation flag. if (input.cpp.generateCompilerListingFiles) @@ -675,6 +796,16 @@ function assemblerFlags(project, product, input, outputs, explicitlyDependsOn) { // Output. args.push("-o", outputs.obj[0].filePath); + var architecture = input.qbs.architecture; + + // The `--preinclude` flag is only supported for a certain + // set of assemblers, not for all. + if (supportIAssembler(architecture)) { + var prefixHeaders = input.cpp.prefixHeaders; + for (var i in prefixHeaders) + args.push("--preinclude", prefixHeaders[i]); + } + // Includes. var allIncludePaths = []; var systemIncludePaths = input.cpp.systemIncludePaths; @@ -690,12 +821,7 @@ function assemblerFlags(project, product, input, outputs, explicitlyDependsOn) { args.push("-r"); // Architecture specific flags. - var architecture = input.qbs.architecture; - if (architecture === "stm8" || architecture === "rl78" - || architecture === "rx" || architecture === "rh850" - || architecture === "avr32" || architecture === "sh" - || architecture === "riscv" || architecture === "m68k" - || architecture === "r32c" || architecture === "cr16") { + if (supportIAssembler(architecture)) { // Silent output generation flag. args.push("--silent"); // Warning level flags. @@ -703,13 +829,18 @@ function assemblerFlags(project, product, input, outputs, explicitlyDependsOn) { args.push("--no_warnings"); if (input.cpp.treatWarningsAsErrors) args.push("--warnings_are_errors"); - } else { + } else if (supportXAssembler(architecture)){ // Silent output generation flag. args.push("-S"); // Warning level flags. args.push("-w" + (input.cpp.warningLevel === "none" ? "-" : "+")); } + // Byte order flags. + var endianness = input.cpp.endianness; + if (endianness && supportEndianness(architecture)) + args.push("--endian=" + endianness); + // Listing files generation flag. if (input.cpp.generateAssemblerListingFiles) args.push("-l", outputs.lst[0].filePath); |