in src/cpptools.ts [148:231]
export function parseCompileFlags(cptVersion: cpt.Version, args: string[], lang?: string): CompileFlagInformation {
const require_standard_target = (cptVersion < cpt.Version.v5);
const can_use_gnu_std = (cptVersion >= cpt.Version.v4);
const iter = args[Symbol.iterator]();
const extraDefinitions: string[] = [];
let standard: StandardVersion;
let targetArch: Architecture;
while (1) {
const { done, value } = iter.next();
if (done) {
break;
}
const lower = value.toLowerCase();
if (require_standard_target && (lower === '-m32' || lower === '-m64')) {
targetArch = parseTargetArch(lower);
} else if (require_standard_target && (lower.startsWith('-arch=') || lower.startsWith('/arch:'))) {
const target = lower.substring(6);
targetArch = parseTargetArch(target);
} else if (require_standard_target && lower === '-arch') {
const { done, value } = iter.next();
if (done) {
// TODO: add an allow list of architecture values and add telemetry
continue;
}
targetArch = parseTargetArch(value.toLowerCase());
} else if (require_standard_target && lower.startsWith('-march=')) {
const target = lower.substring(7);
targetArch = parseTargetArch(target);
} else if (require_standard_target && lower.startsWith('--target=')) {
const target = lower.substring(9);
targetArch = parseTargetArch(target);
} else if (require_standard_target && lower === '-target') {
const { done, value } = iter.next();
if (done) {
// TODO: add an allow list of architecture values and add telemetry
continue;
}
targetArch = parseTargetArch(value.toLowerCase());
} else if (value === '-D' || value === '/D') {
const { done, value } = iter.next();
if (done) {
rollbar.error(localize('unexpected.end.of.arguments', 'Unexpected end of parsing command line arguments'));
continue;
}
extraDefinitions.push(value);
} else if (value.startsWith('-D') || value.startsWith('/D')) {
const def = value.substring(2);
extraDefinitions.push(def);
} else if (value.startsWith('-std=') || lower.startsWith('-std:') || lower.startsWith('/std:')) {
const std = value.substring(5);
if (lang === 'CXX' || lang === 'OBJCXX' || lang === 'CUDA') {
const s = parseCppStandard(std, can_use_gnu_std);
if (!s) {
log.warning(localize('unknown.control.gflag.cpp', 'Unknown C++ standard control flag: {0}', value));
} else {
standard = s;
}
} else if (lang === 'C' || lang === 'OBJC') {
const s = parseCStandard(std, can_use_gnu_std);
if (!s) {
log.warning(localize('unknown.control.gflag.c', 'Unknown C standard control flag: {0}', value));
} else {
standard = s;
}
} else if (lang === undefined) {
let s = parseCppStandard(std, can_use_gnu_std);
if (!s) {
s = parseCStandard(std, can_use_gnu_std);
}
if (!s) {
log.warning(localize('unknown.control.gflag', 'Unknown standard control flag: {0}', value));
} else {
standard = s;
}
} else {
log.warning(localize('unknown language', 'Unknown language: {0}', lang));
}
}
}
if (!standard && require_standard_target) {
standard = (lang === 'C') ? 'c11' : 'c++17';
}
return { extraDefinitions, standard, targetArch };
}