|
| 1 | +#define STRING(s) #s |
| 2 | +#define XSTRING(s) STRING(s) |
| 3 | + |
| 4 | +#define REPORT(key, value) \ |
| 5 | + "(###REPORT###(DAEMON_COMPILER_" key ")###REPORT###(" value ")###REPORT###)" |
| 6 | +#define REPORT_VERSION_3(name, major, minor, patch) \ |
| 7 | + REPORT(name "_VERSION", XSTRING(major) "." XSTRING(minor) "." XSTRING(patch)) |
| 8 | +#define REPORT_VERSION_2(name, major, minor) \ |
| 9 | + REPORT(name "_VERSION", XSTRING(major) "." XSTRING(minor)) |
| 10 | +#define REPORT_VERSION_1(name, major) \ |
| 11 | + REPORT(name "_VERSION", XSTRING(major)) |
| 12 | +#define REPORT_VERSION_STRING(name, value) \ |
| 13 | + REPORT(name "_VERSION_STRING", value) |
| 14 | +#define REPORT_COMPATIBILITY(name) \ |
| 15 | + REPORT(name "_COMPATIBILITY", "ON") |
| 16 | +#define REPORT_NAME(name) \ |
| 17 | + REPORT("NAME", name) |
| 18 | + |
| 19 | +// GCC |
| 20 | + |
| 21 | +#if defined(__GNUC__) |
| 22 | + #pragma message(REPORT_COMPATIBILITY("GCC")) |
| 23 | +#endif |
| 24 | + |
| 25 | +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) |
| 26 | + #pragma message(REPORT_VERSION_3("GCC", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)) |
| 27 | +#endif |
| 28 | + |
| 29 | +// Clang |
| 30 | + |
| 31 | +#if defined(__clang__) |
| 32 | + #pragma message(REPORT_COMPATIBILITY("Clang")) |
| 33 | +#endif |
| 34 | + |
| 35 | +#if defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__) |
| 36 | + #pragma message(REPORT_VERSION_3("Clang", __clang_major__, __clang_minor__, __clang_patchlevel__)) |
| 37 | +#endif |
| 38 | + |
| 39 | +#if defined(__clang_version__) |
| 40 | + #pragma message(REPORT_VERSION_STRING("Clang", __clang_version__)) |
| 41 | +#endif |
| 42 | + |
| 43 | +// ICC |
| 44 | + |
| 45 | +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) |
| 46 | + #pragma message(REPORT_VERSION_2("ICC", __INTEL_COMPILER, __INTEL_COMPILER_UPDATE)) |
| 47 | +#elif defined(_ICC) |
| 48 | + #pragma message(REPORT_VERSION_1("ICC", __ICC)) |
| 49 | +#endif |
| 50 | + |
| 51 | +// ICX |
| 52 | + |
| 53 | +#if defined(__INTEL_CLANG_COMPILER) |
| 54 | + // This would require extra parsing since it's the form 20240000 for 2024.0.0 |
| 55 | + #pragma message(REPORT_VERSION_1("ICX", __INTEL_CLANG_COMPILER)) |
| 56 | +#elif defined(__INTEL_LLVM_COMPILER) |
| 57 | + // This would require extra parsing since it's the form 20240000 for 2024.0.0 |
| 58 | + #pragma message(REPORT_VERSION_1("ICX", __INTEL_LLVM_COMPILER)) |
| 59 | +#endif |
| 60 | + |
| 61 | +// ArmClang |
| 62 | + |
| 63 | +#if defined(__armclang_major__) && defined(__armclang_minor__) |
| 64 | + #pragma message(REPORT_VERSION_2("ArmClang", __armclang_major__, __armclang_minor__) |
| 65 | +#endif |
| 66 | + |
| 67 | +#if defined(__armclang_version__) |
| 68 | + #pragma message(REPORT_VERSION_STRING("ArmClang", __armclang_version__)) |
| 69 | +#endif |
| 70 | + |
| 71 | +// Generic |
| 72 | + |
| 73 | +#if defined(__VERSION__) |
| 74 | + #pragma message(REPORT_VERSION_STRING("generic", __VERSION__)) |
| 75 | +#endif |
| 76 | + |
| 77 | +// Selection |
| 78 | + |
| 79 | +// There is no Zig specific define. |
| 80 | + |
| 81 | +// There is no AOCC specific define, we should parse other defines: |
| 82 | +// #define __VERSION__ "AMD Clang 14.0.6 (CLANG: AOCC_4.0.0-Build#434 2022_10_28)" |
| 83 | +// #define __clang_version__ "14.0.6 (CLANG: AOCC_4.0.0-Build#434 2022_10_28)" |
| 84 | + |
| 85 | +#if defined(__INTEL_COMPILER) || defined(__ICC) |
| 86 | + #pragma message(REPORT_NAME("ICC")) // Intel |
| 87 | +#elif defined(__INTEL_CLANG_COMPILER) || defined(__INTEL_LLVM_COMPILER) |
| 88 | + #pragma message(REPORT_NAME("ICX")) // IntelLLVM |
| 89 | +#elif defined(__wasi__) |
| 90 | + #pragma message(REPORT_NAME("WASI")) |
| 91 | +#elif defined(__saigo__) |
| 92 | + #pragma message(REPORT_NAME("Saigo")) |
| 93 | +#elif defined(__pnacl__) |
| 94 | + #pragma message(REPORT_NAME("PNaCl")) |
| 95 | +#elif defined(__MINGW64__) || defined(__MINGW32__) |
| 96 | + #pragma message(REPORT_NAME("MingGW")) |
| 97 | +#elif defined(__armclang_major__) || defined(__armclang_version__) |
| 98 | + #pragma message(REPORT_NAME("ArmClang")) |
| 99 | +#elif defined(__clang__) |
| 100 | + #pragma message(REPORT_NAME("Clang")) |
| 101 | +#elif defined(__GNUC__) |
| 102 | + #pragma message(REPORT_NAME("GCC")) // GNU |
| 103 | +#else |
| 104 | + #pragma message(REPORT_NAME("Unknown")) |
| 105 | +#endif |
| 106 | + |
| 107 | +// Make the compilation succeeds if architecture is supported. |
| 108 | +int main(int argc, char** argv) { |
| 109 | + return 0; |
| 110 | +} |
0 commit comments