aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/qbs/modules/cpp/gcc.js43
1 files changed, 37 insertions, 6 deletions
diff --git a/share/qbs/modules/cpp/gcc.js b/share/qbs/modules/cpp/gcc.js
index 82f5c5834..b01331915 100644
--- a/share/qbs/modules/cpp/gcc.js
+++ b/share/qbs/modules/cpp/gcc.js
@@ -204,7 +204,7 @@ function escapeLinkerFlags(product, inputs, linkerFlags) {
return linkerFlags;
}
-function linkerFlags(project, product, inputs, output) {
+function linkerFlags(project, product, inputs, output, linkerPath) {
var libraryPaths = product.cpp.libraryPaths;
var distributionLibraryPaths = product.cpp.distributionLibraryPaths;
var libraryDependencies = collectLibraryDependencies(product);
@@ -245,6 +245,13 @@ function linkerFlags(project, product, inputs, output) {
["--as-needed"]));
}
+ if (isLegacyQnxSdk(product)) {
+ ["c", "cpp"].map(function (tag) {
+ if (linkerPath === product.cpp.compilerPathByLanguage[tag])
+ args = args.concat(qnxLangArgs(product, tag));
+ });
+ }
+
var targetLinkerFlags = product.cpp.targetLinkerFlags;
if (targetLinkerFlags)
args = args.concat(escapeLinkerFlags(product, inputs, targetLinkerFlags));
@@ -432,6 +439,12 @@ function languageTagFromFileExtension(toolchain, fileName) {
return m[fileName.substring(i + 1)];
}
+// Older versions of the QNX SDK have C and C++ compilers whose filenames differ only by case,
+// which won't work in case insensitive environments like Win32+NTFS, HFS+ and APFS
+function isLegacyQnxSdk(config) {
+ return config.qbs.toolchain.contains("qcc") && config.qnx && !config.qnx.qnx7;
+}
+
function effectiveCompilerInfo(toolchain, input, output) {
var compilerPath, language;
var tag = ModUtils.fileTagForTargetLanguage(input.fileTags.concat(output.fileTags));
@@ -442,8 +455,14 @@ function effectiveCompilerInfo(toolchain, input, output) {
var compilerPathByLanguage = input.cpp.compilerPathByLanguage;
if (compilerPathByLanguage)
compilerPath = compilerPathByLanguage[tag];
- if (!compilerPath || tag !== languageTagFromFileExtension(toolchain, input.fileName))
- language = languageName(tag) + (pchOutput ? '-header' : '');
+ if (!compilerPath
+ || tag !== languageTagFromFileExtension(toolchain, input.fileName)
+ || isLegacyQnxSdk(input)) {
+ if (input.qbs.toolchain.contains("qcc"))
+ language = qnxLangArgs(input, tag);
+ else
+ language = ["-x", languageName(tag) + (pchOutput ? '-header' : '')];
+ }
if (!compilerPath)
// fall back to main compiler
compilerPath = input.cpp.compilerPath;
@@ -454,6 +473,18 @@ function effectiveCompilerInfo(toolchain, input, output) {
};
}
+
+function qnxLangArgs(config, tag) {
+ switch (tag) {
+ case "c":
+ return ["-lang-c"];
+ case "cpp":
+ return ["-lang-c++"];
+ default:
+ return [];
+ }
+}
+
function compilerFlags(project, product, input, output) {
var i;
@@ -565,8 +596,8 @@ function compilerFlags(project, product, input, output) {
}
if (compilerInfo.language)
- // Only push '-x language' if we have to.
- args.push("-x", compilerInfo.language);
+ // Only push language arguments if we have to.
+ Array.prototype.push.apply(args, compilerInfo.language);
args = args.concat(ModUtils.moduleProperty(input, 'platformFlags'),
ModUtils.moduleProperty(input, 'flags'),
@@ -910,7 +941,7 @@ function prepareLinker(project, product, inputs, outputs, input, output) {
var linkerPath = effectiveLinkerPath(product, inputs)
- var args = linkerFlags(project, product, inputs, primaryOutput)
+ var args = linkerFlags(project, product, inputs, primaryOutput, linkerPath);
var wrapperArgsLength = 0;
var wrapperArgs = product.cpp.linkerWrapper;
if (wrapperArgs && wrapperArgs.length > 0) {