#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; QString groupName; // // C options // 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"); // Optimization sl.clear(); sl.append(QPair("Low (-O1)","1")); sl.append(QPair("Med (-O2)","2")); sl.append(QPair("High (-O3)","3")); sl.append(QPair("Highest (-Ofast)","fast")); sl.append(QPair("Size (-Os)","s")); sl.append(QPair("Debug (-Og)","g")); addOption(CC_CMD_OPT_OPTIMIZE, QObject::tr("Optimization level (-Ox)"), groupName, true, true, false, "-O", sl); // C++ Language Standards sl.clear(); 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 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("C++ Language standard (-std)"), groupName, false, true, false, "-std=", sl); 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("GNU C90","gnu90")); sl.append(QPair("GNU C99","gnu99")); sl.append(QPair("GNU C11","gnu11")); sl.append(QPair("GNU C17","gnu17")); addOption(C_CMD_OPT_STD, QObject::tr("C Language standard (-std)"), groupName, true, false, 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_DEBUG_INFO, QObject::tr("Generate debugging information (-g3)"), groupName, true, true, false, "-g3"); addOption(CC_CMD_OPT_PROFILE_INFO, QObject::tr("Generate profiling info for analysis (-pg)"), groupName, true, true, true, "-pg"); addOption(CC_CMD_OPT_SYNTAX_ONLY, QObject::tr("Only check the code for syntax errors (-fsyntax-only)"), groupName, true, true, false, "-fsyntax-only"); // 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++ conformance (-pedantic)"), groupName, true, true, false, "-pedantic"); 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"); sl.clear(); sl.append(QPair("Normal"," ")); sl.append(QPair("Strong","-strong")); sl.append(QPair("All","-all")); addOption(CC_CMD_OPT_STACK_PROTECTOR , QObject::tr("Check for stack smashing attacks (-fstack-protector)"), groupName, false, false, true, "-fstack-protector",sl); #if defined(Q_OS_LINUX) || defined(Q_OS_MACOS) sl.clear(); sl.append(QPair("Address","address")); sl.append(QPair("Thread","thread")); sl.append(QPair("Leak","leak")); sl.append(QPair("Undefined","undefined")); addOption(CC_CMD_OPT_ADDRESS_SANITIZER , QObject::tr("Enable Sanitizer (-fsanitize=)"), groupName, true, true, true, "-fsanitize=",sl); #endif // 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"); // Linker groupName = QObject::tr("Linker"); addOption(CC_CMD_OPT_USE_PIPE, QObject::tr("Use pipes instead of temporary files during compilation (-pipe)"), groupName, true, true, false, "-pipe"); //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(CompilerType::Clang, std::make_shared()); mInfos.insert(CompilerType::GCC, std::make_shared()); mInfos.insert(CompilerType::GCC_UTF8, std::make_shared()); } bool CompilerInfoManager::supportSyntaxCheck(CompilerType compilerType) { switch(compilerType) { case CompilerType::GCC: case CompilerType::GCC_UTF8: case CompilerType::Clang: return true; default: return false; } } PCompilerInfo CompilerInfoManager::getInfo(CompilerType compilerType) { return getInstance()->mInfos.value(compilerType,PCompilerInfo()); } bool CompilerInfoManager::hasCompilerOption(CompilerType compilerType, const QString &optKey) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return false; return pInfo->hasCompilerOption(optKey); } PCompilerOption CompilerInfoManager::getCompilerOption(CompilerType compilerType, const QString &optKey) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return PCompilerOption(); return pInfo->getCompilerOption(optKey); } QList CompilerInfoManager::getCompilerOptions(CompilerType compilerType) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return QList(); return pInfo->compilerOptions(); } bool CompilerInfoManager::supportCovertingCharset(CompilerType compilerType) { PCompilerInfo pInfo = getInfo(compilerType); if (!pInfo) return false; return pInfo->supportConvertingCharset(); } bool CompilerInfoManager::forceUTF8InDebugger(CompilerType 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(CompilerType compilerType, PCompilerInfo info) { getInstance()->mInfos.insert(compilerType,info); } ClangCompilerInfo::ClangCompilerInfo():CompilerInfo(COMPILER_CLANG) { } bool ClangCompilerInfo::supportConvertingCharset() { return false; } bool ClangCompilerInfo::forceUTF8InDebugger() { return true; } bool ClangCompilerInfo::forceUTF8InMakefile() { return false; } GCCCompilerInfo::GCCCompilerInfo():CompilerInfo(COMPILER_GCC) { } bool GCCCompilerInfo::supportConvertingCharset() { return true; } bool GCCCompilerInfo::forceUTF8InDebugger() { return false; } bool GCCCompilerInfo::forceUTF8InMakefile() { return false; } GCCUTF8CompilerInfo::GCCUTF8CompilerInfo():CompilerInfo(COMPILER_GCC_UTF8) { } bool GCCUTF8CompilerInfo::supportConvertingCharset() { return true; } bool GCCUTF8CompilerInfo::forceUTF8InDebugger() { return true; } bool GCCUTF8CompilerInfo::forceUTF8InMakefile() { return true; }