2022-05-13 20:22:16 +08:00
# include "compilerinfo.h"
# include <QObject>
CompilerInfo : : CompilerInfo ( const QString & name ) :
mName ( name )
{
2022-05-14 11:21:59 +08:00
init ( ) ;
2022-05-13 20:22:16 +08:00
}
2022-05-14 11:21:59 +08:00
const QList < PCompilerOption > & CompilerInfo : : compilerOptions ( ) const
2022-05-13 20:22:16 +08:00
{
2022-05-14 11:21:59 +08:00
return mCompilerOptionList ;
2022-05-13 20:22:16 +08:00
}
const QString & CompilerInfo : : name ( ) const
{
return mName ;
}
PCompilerOption CompilerInfo : : getCompilerOption ( const QString & key ) const
{
return mCompilerOptions . value ( key , PCompilerOption ( ) ) ;
}
2022-05-14 11:21:59 +08:00
bool CompilerInfo : : hasCompilerOption ( const QString & key ) const
{
return mCompilerOptions . contains ( key ) ;
}
2022-05-13 20:22:16 +08:00
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 < CompilerOption > ( ) ;
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 ) ;
2022-05-14 11:21:59 +08:00
mCompilerOptionList . append ( pOption ) ;
}
void CompilerInfo : : init ( )
{
prepareCompilerOptions ( ) ;
2022-05-13 20:22:16 +08:00
}
void CompilerInfo : : prepareCompilerOptions ( )
{
2022-05-14 20:27:21 +08:00
QList < QPair < QString , QString > > sl ;
2022-10-29 20:51:31 +08:00
QString groupName ;
// // C options
groupName = QObject : : tr ( " C options " ) ;
2022-05-13 20:22:16 +08:00
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 " ) ;
2022-05-14 20:27:21 +08:00
// Optimization
sl . clear ( ) ;
sl . append ( QPair < QString , QString > ( " Low " , " 1 " ) ) ;
sl . append ( QPair < QString , QString > ( " Med " , " 2 " ) ) ;
sl . append ( QPair < QString , QString > ( " High " , " 3 " ) ) ;
sl . append ( QPair < QString , QString > ( " Highest (fast) " , " fast " ) ) ;
sl . append ( QPair < QString , QString > ( " Size (s) " , " s " ) ) ;
sl . append ( QPair < QString , QString > ( " Debug (g) " , " g " ) ) ;
addOption ( CC_CMD_OPT_OPTIMIZE , QObject : : tr ( " Optimization level (-Ox) " ) , groupName , true , true , false , " -O " , sl ) ;
2022-10-24 19:23:43 +08:00
// C++ Language Standards
2022-05-14 20:27:21 +08:00
sl . clear ( ) ;
sl . append ( QPair < QString , QString > ( " ISO C++ " , " c++98 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C++11 " , " c++11 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C++14 " , " c++14 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C++17 " , " c++17 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C++20 " , " c++2a " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C++ " , " gnu++98 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C++11 " , " gnu++11 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C++14 " , " gnu++14 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C++17 " , " gnu++17 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C++20 " , " gnu++2a " ) ) ;
2022-10-24 19:23:43 +08:00
addOption ( CC_CMD_OPT_STD , QObject : : tr ( " C++ Language standard (-std) " ) , groupName , false , true , false , " -std= " , sl ) ;
sl . clear ( ) ;
sl . append ( QPair < QString , QString > ( " ISO C90 " , " c90 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C99 " , " c99 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C11 " , " c11 " ) ) ;
sl . append ( QPair < QString , QString > ( " ISO C17 " , " c17 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C90 " , " gnu90 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C99 " , " gnu99 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C11 " , " gnu11 " ) ) ;
sl . append ( QPair < QString , QString > ( " GNU C17 " , " gnu17 " ) ) ;
addOption ( C_CMD_OPT_STD , QObject : : tr ( " C Language standard (-std) " ) , groupName , true , false , false , " -std= " , sl ) ;
2022-05-14 20:27:21 +08:00
// Optimization for cpu type
2022-10-29 17:21:38 +08:00
// sl.clear();
// sl.append(QPair<QString,QString>(QObject::tr("This CPU"),"native"));
// sl.append(QPair<QString,QString>("i386","i386"));
// sl.append(QPair<QString,QString>("i486","i486"));
// sl.append(QPair<QString,QString>("i586","i586"));
// sl.append(QPair<QString,QString>("i686","i686"));
// sl.append(QPair<QString,QString>("Pentium","pentium"));
// sl.append(QPair<QString,QString>("Pentium MMX","pentium-mmx"));
// sl.append(QPair<QString,QString>("Pentium Pro","pentiumpro"));
// sl.append(QPair<QString,QString>("Pentium 2","pentium2"));
// sl.append(QPair<QString,QString>("Pentium 3","pentium3"));
// sl.append(QPair<QString,QString>("Pentium 4","pentium4"));
// sl.append(QPair<QString,QString>("Conroe","core2"));
// sl.append(QPair<QString,QString>("Nehalem","corei7"));
// sl.append(QPair<QString,QString>("Sandy","corei7-avx"));
// sl.append(QPair<QString,QString>("K6","k6"));
// sl.append(QPair<QString,QString>("K6-2","k6-2"));
// sl.append(QPair<QString,QString>("K6-3","k6-3"));
// sl.append(QPair<QString,QString>("Athlon","athlon"));
// sl.append(QPair<QString,QString>("Athlon Tbird","athlon-tbird"));
// sl.append(QPair<QString,QString>("Athlon 4","athlon-4"));
// sl.append(QPair<QString,QString>("Athlon XP","athlon-xp"));
// sl.append(QPair<QString,QString>("Athlon MP","athlon-mp"));
// sl.append(QPair<QString,QString>("K8","k8"));
// sl.append(QPair<QString,QString>("K8 Rev.E","k8-sse3"));
// sl.append(QPair<QString,QString>("K10","barcelona"));
// sl.append(QPair<QString,QString>("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);
2022-05-13 20:22:16 +08:00
// Enable use of the specific instructions
sl . clear ( ) ;
sl . append ( QPair < QString , QString > ( " MMX " , " mmx " ) ) ;
sl . append ( QPair < QString , QString > ( " 3D Now " , " 3dnow " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE " , " sse " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE2 " , " sse2 " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE3 " , " sse3 " ) ) ;
sl . append ( QPair < QString , QString > ( " SSSE3 " , " ssse3 " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE4 " , " sse4 " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE4A " , " sse4a " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE4.1 " , " sse4.1 " ) ) ;
sl . append ( QPair < QString , QString > ( " SSE4.2 " , " sse4.2 " ) ) ;
sl . append ( QPair < QString , QString > ( " AVX " , " avx " ) ) ;
sl . append ( QPair < QString , QString > ( " AVX2 " , " avx2 " ) ) ;
sl . append ( QPair < QString , QString > ( " FMA4 " , " fma4 " ) ) ;
sl . append ( QPair < QString , QString > ( " XOP " , " xop " ) ) ;
sl . append ( QPair < QString , QString > ( " AES " , " aes " ) ) ;
2022-05-14 11:21:59 +08:00
addOption ( CC_CMD_OPT_INSTRUCTION , QObject : : tr ( " Enable use of specific instructions (-mx) " ) , groupName , true , true , false , " -m " , sl ) ;
2022-05-13 20:22:16 +08:00
// 32bit/64bit
sl . clear ( ) ;
sl . append ( QPair < QString , QString > ( " 32bit " , " 32 " ) ) ;
sl . append ( QPair < QString , QString > ( " 64bit " , " 64 " ) ) ;
2022-05-14 11:21:59 +08:00
addOption ( CC_CMD_OPT_POINTER_SIZE , QObject : : tr ( " Compile with the following pointer size (-mx) " ) , groupName , true , true , true , " -m " , sl ) ;
2022-05-13 20:22:16 +08:00
2022-10-29 20:51:31 +08:00
addOption ( CC_CMD_OPT_DEBUG_INFO , QObject : : tr ( " Generate debugging information (-g3) " ) , groupName , true , true , false , " -g3 " ) ;
2022-05-14 20:27:21 +08:00
addOption ( CC_CMD_OPT_PROFILE_INFO , QObject : : tr ( " Generate profiling info for analysis (-pg) " ) , groupName , true , true , true , " -pg " ) ;
2022-05-13 20:22:16 +08:00
// Warnings
groupName = QObject : : tr ( " Warnings " ) ;
2022-05-14 11:21:59 +08:00
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 " ) ;
2022-05-13 20:22:16 +08:00
// Output
2022-10-12 19:48:35 +08:00
//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");
2022-05-14 11:21:59 +08:00
2022-05-14 16:43:59 +08:00
// Linker
groupName = QObject : : tr ( " Linker " ) ;
2022-10-12 19:48:35 +08:00
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");
2022-05-14 16:43:59 +08:00
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 " ) ;
2022-05-14 11:21:59 +08:00
}
2022-05-13 20:22:16 +08:00
2022-05-14 11:21:59 +08:00
CompilerInfoManager : : CompilerInfoManager ( )
{
2022-10-30 11:58:42 +08:00
mInfos . insert ( CompilerType : : Clang , std : : make_shared < ClangCompilerInfo > ( ) ) ;
mInfos . insert ( CompilerType : : GCC , std : : make_shared < GCCCompilerInfo > ( ) ) ;
mInfos . insert ( CompilerType : : GCC_UTF8 , std : : make_shared < GCCUTF8CompilerInfo > ( ) ) ;
2022-05-13 20:22:16 +08:00
}
2022-10-30 11:58:42 +08:00
PCompilerInfo CompilerInfoManager : : getInfo ( CompilerType compilerType )
2022-05-13 20:22:16 +08:00
{
return getInstance ( ) - > mInfos . value ( compilerType , PCompilerInfo ( ) ) ;
}
2022-10-30 11:58:42 +08:00
bool CompilerInfoManager : : hasCompilerOption ( CompilerType compilerType , const QString & optKey )
2022-05-13 20:22:16 +08:00
{
PCompilerInfo pInfo = getInfo ( compilerType ) ;
if ( ! pInfo )
return false ;
2022-05-14 11:21:59 +08:00
return pInfo - > hasCompilerOption ( optKey ) ;
2022-05-13 20:22:16 +08:00
}
2022-10-30 11:58:42 +08:00
PCompilerOption CompilerInfoManager : : getCompilerOption ( CompilerType compilerType , const QString & optKey )
2022-05-13 20:22:16 +08:00
{
PCompilerInfo pInfo = getInfo ( compilerType ) ;
if ( ! pInfo )
return PCompilerOption ( ) ;
2022-05-14 11:21:59 +08:00
return pInfo - > getCompilerOption ( optKey ) ;
2022-05-13 20:22:16 +08:00
}
2022-10-30 11:58:42 +08:00
QList < PCompilerOption > CompilerInfoManager : : getCompilerOptions ( CompilerType compilerType )
2022-05-13 20:22:16 +08:00
{
PCompilerInfo pInfo = getInfo ( compilerType ) ;
if ( ! pInfo )
2022-05-14 11:21:59 +08:00
return QList < PCompilerOption > ( ) ;
2022-05-13 20:22:16 +08:00
return pInfo - > compilerOptions ( ) ;
}
2022-10-30 11:58:42 +08:00
bool CompilerInfoManager : : supportCovertingCharset ( CompilerType compilerType )
2022-05-13 20:22:16 +08:00
{
PCompilerInfo pInfo = getInfo ( compilerType ) ;
if ( ! pInfo )
return false ;
return pInfo - > supportConvertingCharset ( ) ;
}
2022-10-30 11:58:42 +08:00
bool CompilerInfoManager : : forceUTF8InDebugger ( CompilerType compilerType )
2022-05-15 17:14:22 +08:00
{
PCompilerInfo pInfo = getInfo ( compilerType ) ;
if ( ! pInfo )
return false ;
return pInfo - > forceUTF8InDebugger ( ) ;
}
2022-05-14 11:21:59 +08:00
PCompilerInfoManager CompilerInfoManager : : instance ;
2022-05-13 20:22:16 +08:00
PCompilerInfoManager CompilerInfoManager : : getInstance ( )
{
if ( ! instance ) {
instance = std : : make_shared < CompilerInfoManager > ( ) ;
}
return instance ;
}
2022-10-30 11:58:42 +08:00
void CompilerInfoManager : : addInfo ( CompilerType compilerType , PCompilerInfo info )
2022-05-13 20:22:16 +08:00
{
2022-10-30 11:58:42 +08:00
getInstance ( ) - > mInfos . insert ( compilerType , info ) ;
2022-05-13 20:22:16 +08:00
}
ClangCompilerInfo : : ClangCompilerInfo ( ) : CompilerInfo ( COMPILER_CLANG )
{
}
bool ClangCompilerInfo : : supportConvertingCharset ( )
{
return false ;
}
2022-05-15 17:14:22 +08:00
bool ClangCompilerInfo : : forceUTF8InDebugger ( )
{
return true ;
}
2022-10-30 11:58:42 +08:00
bool ClangCompilerInfo : : forceUTF8InMakefile ( )
{
return false ;
}
2022-05-13 20:22:16 +08:00
GCCCompilerInfo : : GCCCompilerInfo ( ) : CompilerInfo ( COMPILER_GCC )
{
}
bool GCCCompilerInfo : : supportConvertingCharset ( )
{
return true ;
}
2022-05-15 17:14:22 +08:00
bool GCCCompilerInfo : : forceUTF8InDebugger ( )
{
return false ;
}
2022-07-21 15:28:07 +08:00
2022-10-30 11:58:42 +08:00
bool GCCCompilerInfo : : forceUTF8InMakefile ( )
{
return false ;
}
2022-07-21 15:28:07 +08:00
GCCUTF8CompilerInfo : : GCCUTF8CompilerInfo ( ) : CompilerInfo ( COMPILER_GCC_UTF8 )
{
}
bool GCCUTF8CompilerInfo : : supportConvertingCharset ( )
{
return true ;
}
bool GCCUTF8CompilerInfo : : forceUTF8InDebugger ( )
{
return true ;
}
2022-10-30 11:58:42 +08:00
bool GCCUTF8CompilerInfo : : forceUTF8InMakefile ( )
{
return true ;
}