Developer Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
CMakeCCompilerId.c
1 #ifdef __cplusplus
2 # error "A C++ compiler has been selected for C."
3 #endif
4 
5 #if defined(__18CXX)
6 # define ID_VOID_MAIN
7 #endif
8 
9 
10 /* Version number components: V=Version, R=Revision, P=Patch
11  Version date components: YYYY=Year, MM=Month, DD=Day */
12 
13 #if defined(__INTEL_COMPILER) || defined(__ICC)
14 # define COMPILER_ID "Intel"
15 # if defined(_MSC_VER)
16 # define SIMULATE_ID "MSVC"
17 # endif
18  /* __INTEL_COMPILER = VRP */
19 # define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
20 # define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
21 # if defined(__INTEL_COMPILER_UPDATE)
22 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
23 # else
24 # define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
25 # endif
26 # if defined(__INTEL_COMPILER_BUILD_DATE)
27  /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
28 # define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
29 # endif
30 # if defined(_MSC_VER)
31  /* _MSC_VER = VVRR */
32 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
33 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
34 # endif
35 
36 #elif defined(__PATHCC__)
37 # define COMPILER_ID "PathScale"
38 # define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
39 # define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
40 # if defined(__PATHCC_PATCHLEVEL__)
41 # define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
42 # endif
43 
44 #elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
45 # define COMPILER_ID "Embarcadero"
46 # define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
47 # define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
48 # define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__ & 0xFFFF)
49 
50 #elif defined(__BORLANDC__)
51 # define COMPILER_ID "Borland"
52  /* __BORLANDC__ = 0xVRR */
53 # define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
54 # define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
55 
56 #elif defined(__WATCOMC__) && __WATCOMC__ < 1200
57 # define COMPILER_ID "Watcom"
58  /* __WATCOMC__ = VVRR */
59 # define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
60 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
61 # if (__WATCOMC__ % 10) > 0
62 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
63 # endif
64 
65 #elif defined(__WATCOMC__)
66 # define COMPILER_ID "OpenWatcom"
67  /* __WATCOMC__ = VVRP + 1100 */
68 # define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
69 # define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
70 # if (__WATCOMC__ % 10) > 0
71 # define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
72 # endif
73 
74 #elif defined(__SUNPRO_C)
75 # define COMPILER_ID "SunPro"
76 # if __SUNPRO_C >= 0x5100
77  /* __SUNPRO_C = 0xVRRP */
78 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
79 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
80 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
81 # else
82  /* __SUNPRO_CC = 0xVRP */
83 # define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
84 # define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
85 # define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
86 # endif
87 
88 #elif defined(__HP_cc)
89 # define COMPILER_ID "HP"
90  /* __HP_cc = VVRRPP */
91 # define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
92 # define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
93 # define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
94 
95 #elif defined(__DECC)
96 # define COMPILER_ID "Compaq"
97  /* __DECC_VER = VVRRTPPPP */
98 # define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
99 # define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
100 # define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
101 
102 #elif defined(__IBMC__) && defined(__COMPILER_VER__)
103 # define COMPILER_ID "zOS"
104  /* __IBMC__ = VRP */
105 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
106 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
107 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
108 
109 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800
110 # define COMPILER_ID "XL"
111  /* __IBMC__ = VRP */
112 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
113 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
114 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
115 
116 #elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
117 # define COMPILER_ID "VisualAge"
118  /* __IBMC__ = VRP */
119 # define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
120 # define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
121 # define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
122 
123 #elif defined(__PGI)
124 # define COMPILER_ID "PGI"
125 # define COMPILER_VERSION_MAJOR DEC(__PGIC__)
126 # define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
127 # if defined(__PGIC_PATCHLEVEL__)
128 # define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
129 # endif
130 
131 #elif defined(_CRAYC)
132 # define COMPILER_ID "Cray"
133 # define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
134 # define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
135 
136 #elif defined(__TI_COMPILER_VERSION__)
137 # define COMPILER_ID "TI"
138  /* __TI_COMPILER_VERSION__ = VVVRRRPPP */
139 # define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
140 # define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
141 # define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
142 
143 #elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
144 # define COMPILER_ID "Fujitsu"
145 
146 #elif defined(__TINYC__)
147 # define COMPILER_ID "TinyCC"
148 
149 #elif defined(__SCO_VERSION__)
150 # define COMPILER_ID "SCO"
151 
152 #elif defined(__clang__) && defined(__apple_build_version__)
153 # define COMPILER_ID "AppleClang"
154 # if defined(_MSC_VER)
155 # define SIMULATE_ID "MSVC"
156 # endif
157 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
158 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
159 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
160 # if defined(_MSC_VER)
161  /* _MSC_VER = VVRR */
162 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
163 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
164 # endif
165 # define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
166 
167 #elif defined(__clang__)
168 # define COMPILER_ID "Clang"
169 # if defined(_MSC_VER)
170 # define SIMULATE_ID "MSVC"
171 # endif
172 # define COMPILER_VERSION_MAJOR DEC(__clang_major__)
173 # define COMPILER_VERSION_MINOR DEC(__clang_minor__)
174 # define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
175 # if defined(_MSC_VER)
176  /* _MSC_VER = VVRR */
177 # define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
178 # define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
179 # endif
180 
181 #elif defined(__GNUC__)
182 # define COMPILER_ID "GNU"
183 # define COMPILER_VERSION_MAJOR DEC(__GNUC__)
184 # if defined(__GNUC_MINOR__)
185 # define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
186 # endif
187 # if defined(__GNUC_PATCHLEVEL__)
188 # define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
189 # endif
190 
191 #elif defined(_MSC_VER)
192 # define COMPILER_ID "MSVC"
193  /* _MSC_VER = VVRR */
194 # define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
195 # define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
196 # if defined(_MSC_FULL_VER)
197 # if _MSC_VER >= 1400
198  /* _MSC_FULL_VER = VVRRPPPPP */
199 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
200 # else
201  /* _MSC_FULL_VER = VVRRPPPP */
202 # define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
203 # endif
204 # endif
205 # if defined(_MSC_BUILD)
206 # define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
207 # endif
208 
209 #elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
210 # define COMPILER_ID "ADSP"
211 #if defined(__VISUALDSPVERSION__)
212  /* __VISUALDSPVERSION__ = 0xVVRRPP00 */
213 # define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
214 # define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
215 # define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
216 #endif
217 
218 #elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC)
219 # define COMPILER_ID "IAR"
220 
221 #elif defined(SDCC)
222 # define COMPILER_ID "SDCC"
223  /* SDCC = VRP */
224 # define COMPILER_VERSION_MAJOR DEC(SDCC/100)
225 # define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
226 # define COMPILER_VERSION_PATCH DEC(SDCC % 10)
227 
228 #elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
229 # define COMPILER_ID "MIPSpro"
230 # if defined(_SGI_COMPILER_VERSION)
231  /* _SGI_COMPILER_VERSION = VRP */
232 # define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100)
233 # define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10)
234 # define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10)
235 # else
236  /* _COMPILER_VERSION = VRP */
237 # define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100)
238 # define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10)
239 # define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10)
240 # endif
241 
242 
243 /* These compilers are either not known or too old to define an
244  identification macro. Try to identify the platform and guess that
245  it is the native compiler. */
246 #elif defined(__sgi)
247 # define COMPILER_ID "MIPSpro"
248 
249 #elif defined(__hpux) || defined(__hpua)
250 # define COMPILER_ID "HP"
251 
252 #else /* unknown compiler */
253 # define COMPILER_ID ""
254 #endif
255 
256 /* Construct the string literal in pieces to prevent the source from
257  getting matched. Store it in a pointer rather than an array
258  because some compilers will just produce instructions to fill the
259  array rather than assigning a pointer to a static array. */
260 char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
261 #ifdef SIMULATE_ID
262 char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
263 #endif
264 
265 #ifdef __QNXNTO__
266 char const* qnxnto = "INFO" ":" "qnxnto[]";
267 #endif
268 
269 #define STRINGIFY_HELPER(X) #X
270 #define STRINGIFY(X) STRINGIFY_HELPER(X)
271 
272 /* Identify known platforms by name. */
273 #if defined(__linux) || defined(__linux__) || defined(linux)
274 # define PLATFORM_ID "Linux"
275 
276 #elif defined(__CYGWIN__)
277 # define PLATFORM_ID "Cygwin"
278 
279 #elif defined(__MINGW32__)
280 # define PLATFORM_ID "MinGW"
281 
282 #elif defined(__APPLE__)
283 # define PLATFORM_ID "Darwin"
284 
285 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
286 # define PLATFORM_ID "Windows"
287 
288 #elif defined(__FreeBSD__) || defined(__FreeBSD)
289 # define PLATFORM_ID "FreeBSD"
290 
291 #elif defined(__NetBSD__) || defined(__NetBSD)
292 # define PLATFORM_ID "NetBSD"
293 
294 #elif defined(__OpenBSD__) || defined(__OPENBSD)
295 # define PLATFORM_ID "OpenBSD"
296 
297 #elif defined(__sun) || defined(sun)
298 # define PLATFORM_ID "SunOS"
299 
300 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
301 # define PLATFORM_ID "AIX"
302 
303 #elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
304 # define PLATFORM_ID "IRIX"
305 
306 #elif defined(__hpux) || defined(__hpux__)
307 # define PLATFORM_ID "HP-UX"
308 
309 #elif defined(__HAIKU__)
310 # define PLATFORM_ID "Haiku"
311 
312 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
313 # define PLATFORM_ID "BeOS"
314 
315 #elif defined(__QNX__) || defined(__QNXNTO__)
316 # define PLATFORM_ID "QNX"
317 
318 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
319 # define PLATFORM_ID "Tru64"
320 
321 #elif defined(__riscos) || defined(__riscos__)
322 # define PLATFORM_ID "RISCos"
323 
324 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
325 # define PLATFORM_ID "SINIX"
326 
327 #elif defined(__UNIX_SV__)
328 # define PLATFORM_ID "UNIX_SV"
329 
330 #elif defined(__bsdos__)
331 # define PLATFORM_ID "BSDOS"
332 
333 #elif defined(_MPRAS) || defined(MPRAS)
334 # define PLATFORM_ID "MP-RAS"
335 
336 #elif defined(__osf) || defined(__osf__)
337 # define PLATFORM_ID "OSF1"
338 
339 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
340 # define PLATFORM_ID "SCO_SV"
341 
342 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
343 # define PLATFORM_ID "ULTRIX"
344 
345 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
346 # define PLATFORM_ID "Xenix"
347 
348 #elif defined(__WATCOMC__)
349 # if defined(__LINUX__)
350 # define PLATFORM_ID "Linux"
351 
352 # elif defined(__DOS__)
353 # define PLATFORM_ID "DOS"
354 
355 # elif defined(__OS2__)
356 # define PLATFORM_ID "OS2"
357 
358 # elif defined(__WINDOWS__)
359 # define PLATFORM_ID "Windows3x"
360 
361 # else /* unknown platform */
362 # define PLATFORM_ID ""
363 # endif
364 
365 #else /* unknown platform */
366 # define PLATFORM_ID ""
367 
368 #endif
369 
370 /* For windows compilers MSVC and Intel we can determine
371  the architecture of the compiler being used. This is because
372  the compilers do not have flags that can change the architecture,
373  but rather depend on which compiler is being used
374 */
375 #if defined(_WIN32) && defined(_MSC_VER)
376 # if defined(_M_IA64)
377 # define ARCHITECTURE_ID "IA64"
378 
379 # elif defined(_M_X64) || defined(_M_AMD64)
380 # define ARCHITECTURE_ID "x64"
381 
382 # elif defined(_M_IX86)
383 # define ARCHITECTURE_ID "X86"
384 
385 # elif defined(_M_ARM)
386 # if _M_ARM == 4
387 # define ARCHITECTURE_ID "ARMV4I"
388 # elif _M_ARM == 5
389 # define ARCHITECTURE_ID "ARMV5I"
390 # else
391 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
392 # endif
393 
394 # elif defined(_M_MIPS)
395 # define ARCHITECTURE_ID "MIPS"
396 
397 # elif defined(_M_SH)
398 # define ARCHITECTURE_ID "SHx"
399 
400 # else /* unknown architecture */
401 # define ARCHITECTURE_ID ""
402 # endif
403 
404 #elif defined(__WATCOMC__)
405 # if defined(_M_I86)
406 # define ARCHITECTURE_ID "I86"
407 
408 # elif defined(_M_IX86)
409 # define ARCHITECTURE_ID "X86"
410 
411 # else /* unknown architecture */
412 # define ARCHITECTURE_ID ""
413 # endif
414 
415 #else
416 # define ARCHITECTURE_ID ""
417 #endif
418 
419 /* Convert integer to decimal digit literals. */
420 #define DEC(n) \
421  ('0' + (((n) / 10000000)%10)), \
422  ('0' + (((n) / 1000000)%10)), \
423  ('0' + (((n) / 100000)%10)), \
424  ('0' + (((n) / 10000)%10)), \
425  ('0' + (((n) / 1000)%10)), \
426  ('0' + (((n) / 100)%10)), \
427  ('0' + (((n) / 10)%10)), \
428  ('0' + ((n) % 10))
429 
430 /* Convert integer to hex digit literals. */
431 #define HEX(n) \
432  ('0' + ((n)>>28 & 0xF)), \
433  ('0' + ((n)>>24 & 0xF)), \
434  ('0' + ((n)>>20 & 0xF)), \
435  ('0' + ((n)>>16 & 0xF)), \
436  ('0' + ((n)>>12 & 0xF)), \
437  ('0' + ((n)>>8 & 0xF)), \
438  ('0' + ((n)>>4 & 0xF)), \
439  ('0' + ((n) & 0xF))
440 
441 /* Construct a string literal encoding the version number components. */
442 #ifdef COMPILER_VERSION_MAJOR
443 char const info_version[] = {
444  'I', 'N', 'F', 'O', ':',
445  'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
446  COMPILER_VERSION_MAJOR,
447 # ifdef COMPILER_VERSION_MINOR
448  '.', COMPILER_VERSION_MINOR,
449 # ifdef COMPILER_VERSION_PATCH
450  '.', COMPILER_VERSION_PATCH,
451 # ifdef COMPILER_VERSION_TWEAK
452  '.', COMPILER_VERSION_TWEAK,
453 # endif
454 # endif
455 # endif
456  ']','\0'};
457 #endif
458 
459 /* Construct a string literal encoding the version number components. */
460 #ifdef SIMULATE_VERSION_MAJOR
461 char const info_simulate_version[] = {
462  'I', 'N', 'F', 'O', ':',
463  's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
464  SIMULATE_VERSION_MAJOR,
465 # ifdef SIMULATE_VERSION_MINOR
466  '.', SIMULATE_VERSION_MINOR,
467 # ifdef SIMULATE_VERSION_PATCH
468  '.', SIMULATE_VERSION_PATCH,
469 # ifdef SIMULATE_VERSION_TWEAK
470  '.', SIMULATE_VERSION_TWEAK,
471 # endif
472 # endif
473 # endif
474  ']','\0'};
475 #endif
476 
477 /* Construct the string literal in pieces to prevent the source from
478  getting matched. Store it in a pointer rather than an array
479  because some compilers will just produce instructions to fill the
480  array rather than assigning a pointer to a static array. */
481 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
482 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
483 
484 
485 
486 
487 const char* info_language_dialect_default = "INFO" ":" "dialect_default["
488 #if !defined(__STDC_VERSION__)
489  "90"
490 #elif __STDC_VERSION__ >= 201000L
491  "11"
492 #elif __STDC_VERSION__ >= 199901L
493  "99"
494 #else
495 #endif
496 "]";
497 
498 /*--------------------------------------------------------------------------*/
499 
500 #ifdef ID_VOID_MAIN
501 void main() {}
502 #else
503 int main(int argc, char* argv[])
504 {
505  int require = 0;
506  require += info_compiler[argc];
507  require += info_platform[argc];
508  require += info_arch[argc];
509 #ifdef COMPILER_VERSION_MAJOR
510  require += info_version[argc];
511 #endif
512 #ifdef SIMULATE_ID
513  require += info_simulate[argc];
514 #endif
515 #ifdef SIMULATE_VERSION_MAJOR
516  require += info_simulate_version[argc];
517 #endif
518  require += info_language_dialect_default[argc];
519  (void)argv;
520  return require;
521 }
522 #endif