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-05-13 20:22:16 +08:00
// 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 " ) ;
2022-05-14 16:43:59 +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
// 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 ) ;
// Language Standards
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 > ( " 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 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 " ) ) ;
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 " ) ) ;
addOption ( CC_CMD_OPT_STD , QObject : : tr ( " Language standard (-std) " ) , groupName , true , true , false , " -std= " , sl ) ;
// Optimization for cpu type
sl . clear ( ) ;
2022-05-13 20:22:16 +08:00
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 " ) ) ;
2022-05-14 11:21:59 +08:00
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-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
groupName = QObject : : tr ( " Output " ) ;
2022-05-14 11:21:59 +08:00
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 " ) ;
2022-05-14 16:43:59 +08:00
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
addOption ( CC_CMD_OPT_USE_PIPE , QObject : : tr ( " Use pipes instead of temporary files during compilation (-pipe) " ) , groupName , true , true , false , " -pipe " ) ;
2022-05-14 16:43:59 +08:00
// 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 " ) ;
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 ( )
{
mInfos . insert ( COMPILER_CLANG , std : : make_shared < ClangCompilerInfo > ( ) ) ;
mInfos . insert ( COMPILER_GCC , std : : make_shared < GCCCompilerInfo > ( ) ) ;
2022-05-13 20:22:16 +08:00
}
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 ;
2022-05-14 11:21:59 +08:00
return pInfo - > hasCompilerOption ( optKey ) ;
2022-05-13 20:22:16 +08:00
}
PCompilerOption CompilerInfoManager : : getCompilerOption ( const QString & compilerType , const QString & optKey )
{
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-05-14 11:21:59 +08:00
QList < PCompilerOption > CompilerInfoManager : : getCompilerOptions ( const QString & 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 ( ) ;
}
bool CompilerInfoManager : : supportCovertingCharset ( const QString & compilerType )
{
PCompilerInfo pInfo = getInfo ( compilerType ) ;
if ( ! pInfo )
return false ;
return pInfo - > supportConvertingCharset ( ) ;
}
2022-05-15 17:14:22 +08:00
bool CompilerInfoManager : : forceUTF8InDebugger ( const QString & compilerType )
{
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 ;
}
void CompilerInfoManager : : addInfo ( const QString & name , PCompilerInfo info )
{
getInstance ( ) - > mInfos . insert ( name , info ) ;
}
ClangCompilerInfo : : ClangCompilerInfo ( ) : CompilerInfo ( COMPILER_CLANG )
{
}
bool ClangCompilerInfo : : supportConvertingCharset ( )
{
return false ;
}
2022-05-15 17:14:22 +08:00
bool ClangCompilerInfo : : forceUTF8InDebugger ( )
{
return true ;
}
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
GCCUTF8CompilerInfo : : GCCUTF8CompilerInfo ( ) : CompilerInfo ( COMPILER_GCC_UTF8 )
{
}
bool GCCUTF8CompilerInfo : : supportConvertingCharset ( )
{
return true ;
}
bool GCCUTF8CompilerInfo : : forceUTF8InDebugger ( )
{
return true ;
}