#include "compilerinfo.h" #include CompilerInfo::CompilerInfo(const QString &name): mName(name) { init(); } const QList &CompilerInfo::compilerOptions() const { return mCompilerOptionList; } const QString &CompilerInfo::name() const { return mName; } PCompilerOption CompilerInfo::getCompilerOption(const QString &key) const { return mCompilerOptions.value(key,PCompilerOption()); } bool CompilerInfo::hasCompilerOption(const QString &key) const { return mCompilerOptions.contains(key); } void CompilerInfo::addOption(const QString &key, const QString &name, const QString section, bool isC, bool isCpp, bool isLinker, const QString &setting, const CompileOptionChoiceList &choices) { PCompilerOption pOption = std::make_shared(); pOption->key = key; pOption->name = name; pOption->section = section; pOption->isC = isC; pOption->isCpp = isCpp; pOption->isLinker = isLinker; pOption->setting= setting; pOption->choices = choices; mCompilerOptions.insert(key,pOption); mCompilerOptionList.append(pOption); } void CompilerInfo::init() { prepareCompilerOptions(); } void CompilerInfo::prepareCompilerOptions() { QList> sl; // C options QString groupName = QObject::tr("C options"); addOption(CC_CMD_OPT_ANSI, QObject::tr("Support all ANSI standard C programs (-ansi)"), groupName, true, true, false, "-ansi"); addOption(CC_CMD_OPT_NO_ASM, QObject::tr("Do not recognize asm,inline or typeof as a keyword (-fno-asm)"), groupName, true, true, false, "-fno-asm"); addOption(CC_CMD_OPT_TRADITIONAL_CPP, QObject::tr("Imitate traditional C preprocessors (-traditional-cpp)"), groupName, true, true, false, "-traditional-cpp"); groupName = QObject::tr("Code Generation"); addOption(CC_CMD_OPT_DEBUG_INFO, QObject::tr("Generate debugging information (-g3)"), groupName, true, true, false, "-g3"); // Optimization sl.clear(); sl.append(QPair("Low","1")); sl.append(QPair("Med","2")); sl.append(QPair("High","3")); sl.append(QPair("Highest (fast)","fast")); sl.append(QPair("Size (s)","s")); sl.append(QPair("Debug (g)","g")); addOption(CC_CMD_OPT_OPTIMIZE, QObject::tr("Optimization level (-Ox)"), groupName, true, true, false, "-O", sl); // Language Standards sl.clear(); sl.append(QPair("ISO C90","c90")); sl.append(QPair("ISO C99","c99")); sl.append(QPair("ISO C11","c11")); sl.append(QPair("ISO C17","c17")); sl.append(QPair("ISO C++","c++98")); sl.append(QPair("ISO C++11","c++11")); sl.append(QPair("ISO C++14","c++14")); sl.append(QPair("ISO C++17","c++17")); sl.append(QPair("ISO C++20","c++2a")); sl.append(QPair("GNU C90","gnu90")); sl.append(QPair("GNU C99","gnu99")); sl.append(QPair("GNU C11","gnu11")); sl.append(QPair("GNU C17","gnu17")); sl.append(QPair("GNU C++","gnu++98")); sl.append(QPair("GNU C++11","gnu++11")); sl.append(QPair("GNU C++14","gnu++14")); sl.append(QPair("GNU C++17","gnu++17")); sl.append(QPair("GNU C++20","gnu++2a")); addOption(CC_CMD_OPT_STD, QObject::tr("Language standard (-std)"), groupName, true, true, false, "-std=", sl); // Optimization for cpu type sl.clear(); sl.append(QPair(QObject::tr("This CPU"),"native")); sl.append(QPair("i386","i386")); sl.append(QPair("i486","i486")); sl.append(QPair("i586","i586")); sl.append(QPair("i686","i686")); sl.append(QPair("Pentium","pentium")); sl.append(QPair("Pentium MMX","pentium-mmx")); sl.append(QPair("Pentium Pro","pentiumpro")); sl.append(QPair("Pentium 2","pentium2")); sl.append(QPair("Pentium 3","pentium3")); sl.append(QPair("Pentium 4","pentium4")); sl.append(QPair("Conroe","core2")); sl.append(QPair("Nehalem","corei7")); sl.append(QPair("Sandy","corei7-avx")); sl.append(QPair("K6","k6")); sl.append(QPair("K6-2","k6-2")); sl.append(QPair("K6-3","k6-3")); sl.append(QPair("Athlon","athlon")); sl.append(QPair("Athlon Tbird","athlon-tbird")); sl.append(QPair("Athlon 4","athlon-4")); sl.append(QPair("Athlon XP","athlon-xp")); sl.append(QPair("Athlon MP","athlon-mp")); sl.append(QPair("K8","k8")); sl.append(QPair("K8 Rev.E","k8-sse3")); sl.append(QPair("K10","barcelona")); sl.append(QPair("Bulldozer","bdver1")); addOption(CC_CMD_OPT_ARCH, QObject::tr("Optimize for the following machine (-march)"), groupName, true, true, false, "-march=", sl); addOption(CC_CMD_OPT_TUNE, QObject::tr("Optimize less, while maintaining full compatibility (-tune)"), groupName, true, true, false, "-mtune=", sl); // Enable use of the specific instructions sl.clear(); sl.append(QPair("MMX","mmx")); sl.append(QPair("3D Now","3dnow")); sl.append(QPair("SSE","sse")); sl.append(QPair("SSE2","sse2")); sl.append(QPair("SSE3","sse3")); sl.append(QPair("SSSE3","ssse3")); sl.append(QPair("SSE4","sse4")); sl.append(QPair("SSE4A","sse4a")); sl.append(QPair("SSE4.1","sse4.1")); sl.append(QPair("SSE4.2","sse4.2")); sl.append(QPair("AVX","avx")); sl.append(QPair("AVX2","avx2")); sl.append(QPair("FMA4","fma4")); sl.append(QPair("XOP","xop")); sl.append(QPair("AES","aes")); addOption(CC_CMD_OPT_INSTRUCTION,QObject::tr("Enable use of specific instructions (-mx)"), groupName, true, true, false, "-m", sl); // 32bit/64bit sl.clear(); sl.append(QPair("32bit","32")); sl.append(QPair("64bit","64")); addOption(CC_CMD_OPT_POINTER_SIZE, QObject::tr("Compile with the following pointer size (-mx)"), groupName, true, true, true, "-m", sl); addOption(CC_CMD_OPT_PROFILE_INFO, QObject::tr("Generate profiling info for analysis (-pg)"), groupName, true, true, true, "-pg"); // Warnings groupName = QObject::tr("Warnings"); addOption(CC_CMD_OPT_INHIBIT_ALL_WARNING, QObject::tr("Inhibit all warning messages (-w)"), groupName, true, true, false, "-w"); addOption(CC_CMD_OPT_WARNING_ALL,QObject::tr("Show most warnings (-Wall)"), groupName, true, true, false, "-Wall"); addOption(CC_CMD_OPT_WARNING_EXTRA,QObject::tr("Show some more warnings (-Wextra)"), groupName, true, true, false, "-Wextra"); addOption(CC_CMD_OPT_CHECK_ISO_CONFORMANCE, QObject::tr("Check ISO C/C++/C++0x conformance (-pedantic)"), groupName, true, true, false, "-pedantic"); addOption(CC_CMD_OPT_SYNTAX_ONLY, QObject::tr("Only check the code for syntax errors (-fsyntax-only)"), groupName, true, true, false, "-fsyntax-only"); addOption(CC_CMD_OPT_WARNING_AS_ERROR, QObject::tr("Make all warnings into errors (-Werror)"), groupName, true, true, false, "-Werror"); addOption(CC_CMD_OPT_ABORT_ON_ERROR , QObject::tr("Abort compilation on first error (-Wfatal-errors)"), groupName, true, true, false, "-Wfatal-errors"); // Output groupName = QObject::tr("Output"); addOption(CC_CMD_OPT_VERBOSE_ASM, QObject::tr("Put comments in generated assembly code (-fverbose-asm)"), groupName, true, true, false, "-fverbose-asm"); addOption(CC_CMD_OPT_ONLY_GEN_ASM_CODE, QObject::tr("Do not assemble, compile and generate the assemble code (-S)"), groupName, true, true, false, "-S"); addOption(CC_CMD_OPT_STOP_AFTER_PREPROCESSING, QObject::tr("Do not compile, stop after the preprocessing stage (-E)"), groupName, true, true, false, "-E"); addOption(CC_CMD_OPT_USE_PIPE, QObject::tr("Use pipes instead of temporary files during compilation (-pipe)"), groupName, true, true, false, "-pipe"); // Linker groupName = QObject::tr("Linker"); addOption(LINK_CMD_OPT_LINK_OBJC, QObject::tr("Link an Objective C program (-lobjc)"), groupName, false, false, true, "-lobjc"); addOption(LINK_CMD_OPT_NO_LINK_STDLIB,QObject::tr("Do not use standard system libraries (-nostdlib)"), groupName, false, false, true, "-nostdlib"); addOption(LINK_CMD_OPT_NO_CONSOLE, QObject::tr("Do not create a console window (-mwindows)"), groupName,false, false, true, "-mwindows"); addOption(LINK_CMD_OPT_STRIP_EXE, QObject::tr("Strip executable (-s)"), groupName, false, false, true, "-s"); } CompilerInfoManager::CompilerInfoManager() { mInfos.insert(COMPILER_CLANG, std::make_shared()); mInfos.insert(COMPILER_GCC, std::make_shared()); } PCompilerInfo CompilerInfoManager::getInfo(const QString &compilerType) { return getInstance()->mInfos.value(compilerType,PCompilerInfo()); } bool CompilerInfoManager::hasCompilerOption(const QString &compilerType, const QString &optKey) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return false; return pInfo->hasCompilerOption(optKey); } PCompilerOption CompilerInfoManager::getCompilerOption(const QString &compilerType, const QString &optKey) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return PCompilerOption(); return pInfo->getCompilerOption(optKey); } QList CompilerInfoManager::getCompilerOptions(const QString &compilerType) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return QList(); return pInfo->compilerOptions(); } bool CompilerInfoManager::supportCovertingCharset(const QString &compilerType) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return false; return pInfo->supportConvertingCharset(); } bool CompilerInfoManager::forceUTF8InDebugger(const QString &compilerType) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return false; return pInfo->forceUTF8InDebugger(); } PCompilerInfoManager CompilerInfoManager::instance; PCompilerInfoManager CompilerInfoManager::getInstance() { if (!instance) { instance = std::make_shared(); } return instance; } void CompilerInfoManager::addInfo(const QString &name, PCompilerInfo info) { getInstance()->mInfos.insert(name,info); } ClangCompilerInfo::ClangCompilerInfo():CompilerInfo(COMPILER_CLANG) { } bool ClangCompilerInfo::supportConvertingCharset() { return false; } bool ClangCompilerInfo::forceUTF8InDebugger() { return true; } GCCCompilerInfo::GCCCompilerInfo():CompilerInfo(COMPILER_GCC) { } bool GCCCompilerInfo::supportConvertingCharset() { return true; } bool GCCCompilerInfo::forceUTF8InDebugger() { return false; } GCCUTF8CompilerInfo::GCCUTF8CompilerInfo():CompilerInfo(COMPILER_GCC_UTF8) { } bool GCCUTF8CompilerInfo::supportConvertingCharset() { return true; } bool GCCUTF8CompilerInfo::forceUTF8InDebugger() { return true; }