1 | #include "compilerinfo.h" |
2 | #include <QObject> |
3 | |
4 | CompilerInfo::CompilerInfo(const QString &name): |
5 | mName(name) |
6 | { |
7 | init(); |
8 | } |
9 | |
10 | const QList<PCompilerOption> &CompilerInfo::compilerOptions() const |
11 | { |
12 | return mCompilerOptionList; |
13 | } |
14 | |
15 | const QString &CompilerInfo::name() const |
16 | { |
17 | return mName; |
18 | } |
19 | |
20 | PCompilerOption CompilerInfo::getCompilerOption(const QString &key) const |
21 | { |
22 | return mCompilerOptions.value(key,PCompilerOption()); |
23 | } |
24 | |
25 | bool CompilerInfo::hasCompilerOption(const QString &key) const |
26 | { |
27 | return mCompilerOptions.contains(key); |
28 | } |
29 | |
30 | void CompilerInfo::addOption(const QString &key, const QString &name, const QString section, bool isC, bool isCpp, bool isLinker, const QString &setting, const CompileOptionChoiceList &choices) |
31 | { |
32 | PCompilerOption pOption = std::make_shared<CompilerOption>(); |
33 | pOption->key = key; |
34 | pOption->name = name; |
35 | pOption->section = section; |
36 | pOption->isC = isC; |
37 | pOption->isCpp = isCpp; |
38 | pOption->isLinker = isLinker; |
39 | pOption->setting= setting; |
40 | pOption->choices = choices; |
41 | mCompilerOptions.insert(key,pOption); |
42 | mCompilerOptionList.append(pOption); |
43 | } |
44 | |
45 | void CompilerInfo::init() |
46 | { |
47 | prepareCompilerOptions(); |
48 | } |
49 | |
50 | void CompilerInfo::prepareCompilerOptions() |
51 | { |
52 | QList<QPair<QString,QString>> sl; |
53 | // C options |
54 | QString groupName = QObject::tr("C options" ); |
55 | addOption(CC_CMD_OPT_ANSI, QObject::tr("Support all ANSI standard C programs (-ansi)" ), groupName, true, true, false, "-ansi" ); |
56 | 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" ); |
57 | addOption(CC_CMD_OPT_TRADITIONAL_CPP, QObject::tr("Imitate traditional C preprocessors (-traditional-cpp)" ), groupName, true, true, false, "-traditional-cpp" ); |
58 | |
59 | groupName = QObject::tr("Code Generation" ); |
60 | addOption(CC_CMD_OPT_DEBUG_INFO, QObject::tr("Generate debugging information (-g3)" ), groupName, true, true, false, "-g3" ); |
61 | // Optimization |
62 | sl.clear(); |
63 | sl.append(QPair<QString,QString>("Low" ,"1" )); |
64 | sl.append(QPair<QString,QString>("Med" ,"2" )); |
65 | sl.append(QPair<QString,QString>("High" ,"3" )); |
66 | sl.append(QPair<QString,QString>("Highest (fast)" ,"fast" )); |
67 | sl.append(QPair<QString,QString>("Size (s)" ,"s" )); |
68 | sl.append(QPair<QString,QString>("Debug (g)" ,"g" )); |
69 | addOption(CC_CMD_OPT_OPTIMIZE, QObject::tr("Optimization level (-Ox)" ), groupName, true, true, false, "-O" , sl); |
70 | |
71 | // Language Standards |
72 | sl.clear(); |
73 | sl.append(QPair<QString,QString>("ISO C90" ,"c90" )); |
74 | sl.append(QPair<QString,QString>("ISO C99" ,"c99" )); |
75 | sl.append(QPair<QString,QString>("ISO C11" ,"c11" )); |
76 | sl.append(QPair<QString,QString>("ISO C17" ,"c17" )); |
77 | sl.append(QPair<QString,QString>("ISO C++" ,"c++98" )); |
78 | sl.append(QPair<QString,QString>("ISO C++11" ,"c++11" )); |
79 | sl.append(QPair<QString,QString>("ISO C++14" ,"c++14" )); |
80 | sl.append(QPair<QString,QString>("ISO C++17" ,"c++17" )); |
81 | sl.append(QPair<QString,QString>("ISO C++20" ,"c++2a" )); |
82 | sl.append(QPair<QString,QString>("GNU C90" ,"gnu90" )); |
83 | sl.append(QPair<QString,QString>("GNU C99" ,"gnu99" )); |
84 | sl.append(QPair<QString,QString>("GNU C11" ,"gnu11" )); |
85 | sl.append(QPair<QString,QString>("GNU C17" ,"gnu17" )); |
86 | sl.append(QPair<QString,QString>("GNU C++" ,"gnu++98" )); |
87 | sl.append(QPair<QString,QString>("GNU C++11" ,"gnu++11" )); |
88 | sl.append(QPair<QString,QString>("GNU C++14" ,"gnu++14" )); |
89 | sl.append(QPair<QString,QString>("GNU C++17" ,"gnu++17" )); |
90 | sl.append(QPair<QString,QString>("GNU C++20" ,"gnu++2a" )); |
91 | addOption(CC_CMD_OPT_STD, QObject::tr("Language standard (-std)" ), groupName, true, true, false, "-std=" , sl); |
92 | |
93 | // Optimization for cpu type |
94 | sl.clear(); |
95 | sl.append(QPair<QString,QString>(QObject::tr("This CPU" ),"native" )); |
96 | sl.append(QPair<QString,QString>("i386" ,"i386" )); |
97 | sl.append(QPair<QString,QString>("i486" ,"i486" )); |
98 | sl.append(QPair<QString,QString>("i586" ,"i586" )); |
99 | sl.append(QPair<QString,QString>("i686" ,"i686" )); |
100 | sl.append(QPair<QString,QString>("Pentium" ,"pentium" )); |
101 | sl.append(QPair<QString,QString>("Pentium MMX" ,"pentium-mmx" )); |
102 | sl.append(QPair<QString,QString>("Pentium Pro" ,"pentiumpro" )); |
103 | sl.append(QPair<QString,QString>("Pentium 2" ,"pentium2" )); |
104 | sl.append(QPair<QString,QString>("Pentium 3" ,"pentium3" )); |
105 | sl.append(QPair<QString,QString>("Pentium 4" ,"pentium4" )); |
106 | sl.append(QPair<QString,QString>("Conroe" ,"core2" )); |
107 | sl.append(QPair<QString,QString>("Nehalem" ,"corei7" )); |
108 | sl.append(QPair<QString,QString>("Sandy" ,"corei7-avx" )); |
109 | sl.append(QPair<QString,QString>("K6" ,"k6" )); |
110 | sl.append(QPair<QString,QString>("K6-2" ,"k6-2" )); |
111 | sl.append(QPair<QString,QString>("K6-3" ,"k6-3" )); |
112 | sl.append(QPair<QString,QString>("Athlon" ,"athlon" )); |
113 | sl.append(QPair<QString,QString>("Athlon Tbird" ,"athlon-tbird" )); |
114 | sl.append(QPair<QString,QString>("Athlon 4" ,"athlon-4" )); |
115 | sl.append(QPair<QString,QString>("Athlon XP" ,"athlon-xp" )); |
116 | sl.append(QPair<QString,QString>("Athlon MP" ,"athlon-mp" )); |
117 | sl.append(QPair<QString,QString>("K8" ,"k8" )); |
118 | sl.append(QPair<QString,QString>("K8 Rev.E" ,"k8-sse3" )); |
119 | sl.append(QPair<QString,QString>("K10" ,"barcelona" )); |
120 | sl.append(QPair<QString,QString>("Bulldozer" ,"bdver1" )); |
121 | addOption(CC_CMD_OPT_ARCH, QObject::tr("Optimize for the following machine (-march)" ), groupName, true, true, false, "-march=" , sl); |
122 | addOption(CC_CMD_OPT_TUNE, QObject::tr("Optimize less, while maintaining full compatibility (-tune)" ), groupName, true, true, false, "-mtune=" , sl); |
123 | |
124 | // Enable use of the specific instructions |
125 | sl.clear(); |
126 | sl.append(QPair<QString,QString>("MMX" ,"mmx" )); |
127 | sl.append(QPair<QString,QString>("3D Now" ,"3dnow" )); |
128 | sl.append(QPair<QString,QString>("SSE" ,"sse" )); |
129 | sl.append(QPair<QString,QString>("SSE2" ,"sse2" )); |
130 | sl.append(QPair<QString,QString>("SSE3" ,"sse3" )); |
131 | sl.append(QPair<QString,QString>("SSSE3" ,"ssse3" )); |
132 | sl.append(QPair<QString,QString>("SSE4" ,"sse4" )); |
133 | sl.append(QPair<QString,QString>("SSE4A" ,"sse4a" )); |
134 | sl.append(QPair<QString,QString>("SSE4.1" ,"sse4.1" )); |
135 | sl.append(QPair<QString,QString>("SSE4.2" ,"sse4.2" )); |
136 | sl.append(QPair<QString,QString>("AVX" ,"avx" )); |
137 | sl.append(QPair<QString,QString>("AVX2" ,"avx2" )); |
138 | sl.append(QPair<QString,QString>("FMA4" ,"fma4" )); |
139 | sl.append(QPair<QString,QString>("XOP" ,"xop" )); |
140 | sl.append(QPair<QString,QString>("AES" ,"aes" )); |
141 | addOption(CC_CMD_OPT_INSTRUCTION,QObject::tr("Enable use of specific instructions (-mx)" ), groupName, true, true, false, "-m" , sl); |
142 | |
143 | // 32bit/64bit |
144 | sl.clear(); |
145 | sl.append(QPair<QString,QString>("32bit" ,"32" )); |
146 | sl.append(QPair<QString,QString>("64bit" ,"64" )); |
147 | addOption(CC_CMD_OPT_POINTER_SIZE, QObject::tr("Compile with the following pointer size (-mx)" ), groupName, true, true, true, "-m" , sl); |
148 | |
149 | addOption(CC_CMD_OPT_PROFILE_INFO, QObject::tr("Generate profiling info for analysis (-pg)" ), groupName, true, true, true, "-pg" ); |
150 | |
151 | // Warnings |
152 | groupName = QObject::tr("Warnings" ); |
153 | addOption(CC_CMD_OPT_INHIBIT_ALL_WARNING, QObject::tr("Inhibit all warning messages (-w)" ), groupName, true, true, false, "-w" ); |
154 | addOption(CC_CMD_OPT_WARNING_ALL,QObject::tr("Show most warnings (-Wall)" ), groupName, true, true, false, "-Wall" ); |
155 | addOption(CC_CMD_OPT_WARNING_EXTRA,QObject::tr("Show some more warnings (-Wextra)" ), groupName, true, true, false, "-Wextra" ); |
156 | addOption(CC_CMD_OPT_CHECK_ISO_CONFORMANCE, QObject::tr("Check ISO C/C++/C++0x conformance (-pedantic)" ), groupName, true, true, false, "-pedantic" ); |
157 | addOption(CC_CMD_OPT_SYNTAX_ONLY, QObject::tr("Only check the code for syntax errors (-fsyntax-only)" ), groupName, true, true, false, "-fsyntax-only" ); |
158 | addOption(CC_CMD_OPT_WARNING_AS_ERROR, QObject::tr("Make all warnings into errors (-Werror)" ), groupName, true, true, false, "-Werror" ); |
159 | addOption(CC_CMD_OPT_ABORT_ON_ERROR , QObject::tr("Abort compilation on first error (-Wfatal-errors)" ), groupName, true, true, false, "-Wfatal-errors" ); |
160 | |
161 | |
162 | // Output |
163 | groupName = QObject::tr("Output" ); |
164 | addOption(CC_CMD_OPT_VERBOSE_ASM, QObject::tr("Put comments in generated assembly code (-fverbose-asm)" ), groupName, true, true, false, "-fverbose-asm" ); |
165 | 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" ); |
166 | addOption(CC_CMD_OPT_STOP_AFTER_PREPROCESSING, QObject::tr("Do not compile, stop after the preprocessing stage (-E)" ), groupName, true, true, false, "-E" ); |
167 | addOption(CC_CMD_OPT_USE_PIPE, QObject::tr("Use pipes instead of temporary files during compilation (-pipe)" ), groupName, true, true, false, "-pipe" ); |
168 | |
169 | // Linker |
170 | groupName = QObject::tr("Linker" ); |
171 | addOption(LINK_CMD_OPT_LINK_OBJC, QObject::tr("Link an Objective C program (-lobjc)" ), groupName, false, false, true, "-lobjc" ); |
172 | addOption(LINK_CMD_OPT_NO_LINK_STDLIB,QObject::tr("Do not use standard system libraries (-nostdlib)" ), groupName, false, false, true, "-nostdlib" ); |
173 | addOption(LINK_CMD_OPT_NO_CONSOLE, QObject::tr("Do not create a console window (-mwindows)" ), groupName,false, false, true, "-mwindows" ); |
174 | addOption(LINK_CMD_OPT_STRIP_EXE, QObject::tr("Strip executable (-s)" ), groupName, false, false, true, "-s" ); |
175 | } |
176 | |
177 | CompilerInfoManager::CompilerInfoManager() |
178 | { |
179 | mInfos.insert(COMPILER_CLANG, std::make_shared<ClangCompilerInfo>()); |
180 | mInfos.insert(COMPILER_GCC, std::make_shared<GCCCompilerInfo>()); |
181 | } |
182 | |
183 | PCompilerInfo CompilerInfoManager::getInfo(const QString &compilerType) |
184 | { |
185 | return getInstance()->mInfos.value(compilerType,PCompilerInfo()); |
186 | } |
187 | |
188 | bool CompilerInfoManager::hasCompilerOption(const QString &compilerType, const QString &optKey) |
189 | { |
190 | PCompilerInfo pInfo = getInfo(compilerType); |
191 | if (!pInfo) |
192 | return false; |
193 | return pInfo->hasCompilerOption(optKey); |
194 | } |
195 | |
196 | PCompilerOption CompilerInfoManager::getCompilerOption(const QString &compilerType, const QString &optKey) |
197 | { |
198 | PCompilerInfo pInfo = getInfo(compilerType); |
199 | if (!pInfo) |
200 | return PCompilerOption(); |
201 | return pInfo->getCompilerOption(optKey); |
202 | } |
203 | |
204 | QList<PCompilerOption> CompilerInfoManager::getCompilerOptions(const QString &compilerType) |
205 | { |
206 | PCompilerInfo pInfo = getInfo(compilerType); |
207 | if (!pInfo) |
208 | return QList<PCompilerOption>(); |
209 | return pInfo->compilerOptions(); |
210 | } |
211 | |
212 | bool CompilerInfoManager::supportCovertingCharset(const QString &compilerType) |
213 | { |
214 | PCompilerInfo pInfo = getInfo(compilerType); |
215 | if (!pInfo) |
216 | return false; |
217 | return pInfo->supportConvertingCharset(); |
218 | } |
219 | |
220 | bool CompilerInfoManager::forceUTF8InDebugger(const QString &compilerType) |
221 | { |
222 | PCompilerInfo pInfo = getInfo(compilerType); |
223 | if (!pInfo) |
224 | return false; |
225 | return pInfo->forceUTF8InDebugger(); |
226 | } |
227 | |
228 | PCompilerInfoManager CompilerInfoManager::instance; |
229 | |
230 | PCompilerInfoManager CompilerInfoManager::getInstance() |
231 | { |
232 | if (!instance) { |
233 | instance = std::make_shared<CompilerInfoManager>(); |
234 | } |
235 | return instance; |
236 | } |
237 | |
238 | void CompilerInfoManager::addInfo(const QString &name, PCompilerInfo info) |
239 | { |
240 | getInstance()->mInfos.insert(name,info); |
241 | } |
242 | |
243 | ClangCompilerInfo::ClangCompilerInfo():CompilerInfo(COMPILER_CLANG) |
244 | { |
245 | } |
246 | |
247 | bool ClangCompilerInfo::supportConvertingCharset() |
248 | { |
249 | return false; |
250 | } |
251 | |
252 | bool ClangCompilerInfo::forceUTF8InDebugger() |
253 | { |
254 | return true; |
255 | } |
256 | |
257 | GCCCompilerInfo::GCCCompilerInfo():CompilerInfo(COMPILER_GCC) |
258 | { |
259 | } |
260 | |
261 | bool GCCCompilerInfo::supportConvertingCharset() |
262 | { |
263 | return true; |
264 | } |
265 | |
266 | bool GCCCompilerInfo::forceUTF8InDebugger() |
267 | { |
268 | return false; |
269 | } |
270 | |
271 | GCCUTF8CompilerInfo::GCCUTF8CompilerInfo():CompilerInfo(COMPILER_GCC_UTF8) |
272 | { |
273 | } |
274 | |
275 | bool GCCUTF8CompilerInfo::supportConvertingCharset() |
276 | { |
277 | return true; |
278 | } |
279 | |
280 | bool GCCUTF8CompilerInfo::forceUTF8InDebugger() |
281 | { |
282 | return true; |
283 | } |
284 | |