qmake/vcxproj generator: Handle C standard compiler flags

Handle the compiler flags /std:c11 and /std:c17 and turn them into the
values stdc11 and stc17 for the LanguageStandard_C tag.

Drive-by change: Add /std:c++20 to the list of known C++ standard
options.

Pick-to: 6.2 5.15
Task-number: QTBUG-89296
Change-Id: Ia575fff611bdf795406db84bd34057d008c8a383
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Joerg Bornemann 2021-08-25 11:15:31 +02:00
parent 8914f80b27
commit 5e98769602
3 changed files with 37 additions and 6 deletions

View File

@ -144,6 +144,7 @@ const char _IntermediateDirectory[] = "IntermediateDirectory";
const char _KeyContainer[] = "KeyContainer"; const char _KeyContainer[] = "KeyContainer";
const char _KeyFile[] = "KeyFile"; const char _KeyFile[] = "KeyFile";
const char _LanguageStandard[] = "LanguageStandard"; const char _LanguageStandard[] = "LanguageStandard";
const char _LanguageStandard_C[] = "LanguageStandard_C";
const char _LargeAddressAware[] = "LargeAddressAware"; const char _LargeAddressAware[] = "LargeAddressAware";
const char _LinkDLL[] = "LinkDLL"; const char _LinkDLL[] = "LinkDLL";
const char _LinkErrorReporting[] = "LinkErrorReporting"; const char _LinkErrorReporting[] = "LinkErrorReporting";
@ -1440,6 +1441,7 @@ void VCXProjectWriter::write(XmlOutput &xml, const VCCLCompilerTool &tool)
<< attrTagT(_MinimalRebuild, tool.MinimalRebuild) << attrTagT(_MinimalRebuild, tool.MinimalRebuild)
<< attrTagT(_MultiProcessorCompilation, tool.MultiProcessorCompilation) << attrTagT(_MultiProcessorCompilation, tool.MultiProcessorCompilation)
<< attrTagS(_LanguageStandard, tool.LanguageStandard) << attrTagS(_LanguageStandard, tool.LanguageStandard)
<< attrTagS(_LanguageStandard_C, tool.LanguageStandard_C)
<< attrTagS(_ObjectFileName, tool.ObjectFile) << attrTagS(_ObjectFileName, tool.ObjectFile)
<< attrTagT(_OmitDefaultLibName, tool.OmitDefaultLibName) << attrTagT(_OmitDefaultLibName, tool.OmitDefaultLibName)
<< attrTagT(_OmitFramePointers, tool.OmitFramePointers) << attrTagT(_OmitFramePointers, tool.OmitFramePointers)

View File

@ -1151,14 +1151,42 @@ bool VCCLCompilerTool::parseOption(const char* option)
ShowIncludes = _True; ShowIncludes = _True;
break; break;
} }
if (strlen(option) > 8 && second == 't' && third == 'd') { if (strlen(option) > 7 && second == 't' && third == 'd' && fourth == ':') {
const QString version = option + 8; static const QRegularExpression rex("(c(?:\\+\\+)?)(.+)");
static const QStringList knownVersions = { "14", "17", "latest" }; auto m = rex.match(option + 5);
if (knownVersions.contains(version)) { if (m.hasMatch()) {
LanguageStandard = "stdcpp" + version; QString *var = nullptr;
const QStringList *knownVersions = nullptr;
QString valuePrefix;
auto lang = m.capturedView(1);
auto version = m.capturedView(2);
if (lang == QStringLiteral("c++")) {
// Turn /std:c++17 into <LanguageStandard>stdcpp17</LanguageStandard>
static const QStringList knownCxxVersions = {
"14",
"17",
"20",
"latest"
};
var = &LanguageStandard;
knownVersions = &knownCxxVersions;
valuePrefix = "stdcpp";
} else if (lang == QStringLiteral("c")) {
// Turn /std:c17 into <LanguageStandard_C>stdc17</LanguageStandard_C>
static const QStringList knownCVersions = {
"11",
"17"
};
var = &LanguageStandard_C;
knownVersions = &knownCVersions;
valuePrefix = "stdc";
}
if (var && knownVersions->contains(version)) {
*var = valuePrefix + version;
break; break;
} }
} }
}
found = false; break; found = false; break;
case 'u': case 'u':
if (!second) if (!second)

View File

@ -527,6 +527,7 @@ public:
inlineExpansionOption InlineFunctionExpansion; inlineExpansionOption InlineFunctionExpansion;
triState KeepComments; triState KeepComments;
QString LanguageStandard; QString LanguageStandard;
QString LanguageStandard_C;
triState MinimalRebuild; triState MinimalRebuild;
QString ObjectFile; QString ObjectFile;
triState OmitDefaultLibName; triState OmitDefaultLibName;