1/**
2 * Copyright (C) The Software Authors. All rights reserved.
3
4 * \file version.i
5 * \author Hechong.xyf
6 * \date Apr 2018
7 * \version 1.0.0
8 * \brief Definition of AiLego Version
9 */
10
11#include "internal/platform.h"
12
13#ifndef AILEGO_VERSION_TO_STRING_
14#define AILEGO_VERSION_TO_STRING_(x) #x
15#endif
16
17#ifndef AILEGO_VERSION_TO_STRING
18#define AILEGO_VERSION_TO_STRING(x) AILEGO_VERSION_TO_STRING_(x)
19#endif
20
21/*! http://nadeausoftware.com/articles/2012/01/
22 * c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
23 */
24#if defined(__linux) || defined(__linux__)
25#define AILEGO_VERSION_PLATFORM "Linux"
26#elif defined(__FreeBSD__)
27#define AILEGO_VERSION_PLATFORM "FreeBSD"
28#elif defined(__NetBSD__)
29#define AILEGO_VERSION_PLATFORM "NetBSD"
30#elif defined(__OpenBSD__)
31#define AILEGO_VERSION_PLATFORM "OpenBSD"
32#elif defined(__APPLE__) || defined(__MACH__)
33#define AILEGO_VERSION_PLATFORM "Darwin"
34#elif defined(__CYGWIN__) && !defined(_WIN32)
35#define AILEGO_VERSION_PLATFORM "Cygwin"
36#elif defined(_WIN64)
37#define AILEGO_VERSION_PLATFORM "Microsoft Windows (64-bit)"
38#elif defined(_WIN32)
39#define AILEGO_VERSION_PLATFORM "Microsoft Windows (32-bit)"
40#elif defined(__sun) && defined(__SVR4)
41#define AILEGO_VERSION_PLATFORM "Solaris"
42#elif defined(_AIX)
43#define AILEGO_VERSION_PLATFORM "AIX"
44#elif defined(__hpux)
45#define AILEGO_VERSION_PLATFORM "HP-UX"
46#elif defined(__unix) || defined(__unix__)
47#define AILEGO_VERSION_PLATFORM "Unix"
48#else
49#define AILEGO_VERSION_PLATFORM "Unknown Platform"
50#endif
51
52/*! http://nadeausoftware.com/articles/2012/10/
53 * c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros
54 */
55#if defined(__NVCC__)
56#define AILEGO_VERSION_COMPILER_NAME "Nvidia CUDA Compiler"
57#elif defined(__clang__)
58#define AILEGO_VERSION_COMPILER_NAME "Clang/LLVM"
59#elif defined(__ICC) || defined(__INTEL_COMPILER)
60#define AILEGO_VERSION_COMPILER_NAME "Intel ICC/ICPC"
61#elif defined(__GNUC__) || defined(__GNUG__)
62#define AILEGO_VERSION_COMPILER_NAME "GNU GCC/G++"
63#elif defined(__HP_cc) || defined(__HP_aCC)
64#define AILEGO_VERSION_COMPILER_NAME "Hewlett-Packard C/aC++"
65#elif defined(__IBMC__) || defined(__IBMCPP__)
66#define AILEGO_VERSION_COMPILER_NAME "IBM XL C/C++"
67#elif defined(_MSC_VER)
68#define AILEGO_VERSION_COMPILER_NAME "Microsoft Visual C++"
69#elif defined(__PGI)
70#define AILEGO_VERSION_COMPILER_NAME "Portland Group PGCC/PGCPP"
71#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
72#define AILEGO_VERSION_COMPILER_NAME "Oracle Solaris Studio"
73#else
74#define AILEGO_VERSION_COMPILER_NAME "Unknown Compiler"
75#endif
76
77#if defined(__CUDACC_VER_MAJOR__)
78#define AILEGO_VERSION_COMPILER \
79 AILEGO_VERSION_COMPILER_NAME \
80 " (" AILEGO_VERSION_TO_STRING(__CUDACC_VER_MAJOR__) \
81 "." AILEGO_VERSION_TO_STRING(__CUDACC_VER_MINOR__) \
82 "." AILEGO_VERSION_TO_STRING(__CUDACC_VER_BUILD__) ")"
83#elif defined(__VERSION__)
84#define AILEGO_VERSION_COMPILER \
85 AILEGO_VERSION_COMPILER_NAME " (" __VERSION__ ")"
86#elif defined(_MSC_FULL_VER)
87#define AILEGO_VERSION_COMPILER \
88 AILEGO_VERSION_COMPILER_NAME " (" AILEGO_VERSION_TO_STRING(_MSC_FULL_VER) ")"
89#elif defined(_MSC_VER)
90#define AILEGO_VERSION_COMPILER \
91 AILEGO_VERSION_COMPILER_NAME " (" AILEGO_VERSION_TO_STRING(_MSC_VER) ")"
92#elif defined(__PGIC__)
93#define AILEGO_VERSION_COMPILER \
94 AILEGO_VERSION_COMPILER_NAME \
95 " (" AILEGO_VERSION_TO_STRING(__PGIC__) "." AILEGO_VERSION_TO_STRING( \
96 __PGIC_MINOR__) "." AILEGO_VERSION_TO_STRING(__PGIC_PATCHLEVEL__) ")"
97#elif defined(__xlc__)
98#define AILEGO_VERSION_COMPILER AILEGO_VERSION_COMPILER_NAME " (" __xlc__ ")"
99#elif defined(__SUNPRO_C)
100#define AILEGO_VERSION_COMPILER \
101 AILEGO_VERSION_COMPILER_NAME " (" AILEGO_VERSION_TO_STRING(__SUNPRO_C) ")"
102#elif defined(__HP_cc)
103#define AILEGO_VERSION_COMPILER \
104 AILEGO_VERSION_COMPILER_NAME " (" AILEGO_VERSION_TO_STRING(__HP_cc) ")"
105#else
106#define AILEGO_VERSION_COMPILER AILEGO_VERSION_COMPILER_NAME
107#endif
108
109#if defined(__x86_64__) || defined(_M_X64)
110#define AILEGO_VERSION_PROCESSOR "x86 64-bit Processor"
111#elif defined(__i386) || defined(_M_IX86)
112#define AILEGO_VERSION_PROCESSOR "x86 32-bit Processor"
113#elif defined(__ARM_ARCH)
114#if defined(__ARM_64BIT_STATE)
115#define AILEGO_VERSION_PROCESSOR "ARM 64-bit Processor"
116#else
117#define AILEGO_VERSION_PROCESSOR "ARM 32-bit Processor"
118#endif
119#elif defined(__ia64) || defined(__itanium__) || defined(_M_IA64)
120#define AILEGO_VERSION_PROCESSOR "Itanium Processor"
121#elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__)
122#define AILEGO_VERSION_PROCESSOR "PowerPC 64-bit Processor"
123#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)
124#define AILEGO_VERSION_PROCESSOR "PowerPC 32-bit Processor"
125#elif defined(__sparc)
126#define AILEGO_VERSION_PROCESSOR "SPARC Processor"
127#else
128#define AILEGO_VERSION_PROCESSOR "Unknown Processor"
129#endif
130
131#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
132#define AILEGO_VERSION_BYTE_ORDER " Little-endian Byte Order\n"
133#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
134#define AILEGO_VERSION_BYTE_ORDER " Big-endian Byte Order\n"
135#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
136#define AILEGO_VERSION_BYTE_ORDER " PDP-endian Byte Order\n"
137#else
138#define AILEGO_VERSION_BYTE_ORDER ""
139#endif
140
141#if defined(_DEBUG) || (!defined(__OPTIMIZE__) && !defined(NDEBUG))
142#define AILEGO_VERSION_DEBUG_INFO " Debug Information\n"
143#else
144#define AILEGO_VERSION_DEBUG_INFO ""
145#endif
146
147#if defined(__SANITIZE_ADDRESS__)
148#define AILEGO_VERSION_ASAN " Address Sanitizer\n"
149#else
150#define AILEGO_VERSION_ASAN ""
151#endif
152
153#if defined(__STDC_VERSION__)
154#define AILEGO_VERSION_STDC \
155 " C Standard " AILEGO_VERSION_TO_STRING(__STDC_VERSION__) "\n"
156#else
157#define AILEGO_VERSION_STDC ""
158#endif
159
160#if defined(__cplusplus)
161#define AILEGO_VERSION_CPLUSPLUS \
162 " C++ Standard " AILEGO_VERSION_TO_STRING(__cplusplus) "\n"
163#else
164#define AILEGO_VERSION_CPLUSPLUS ""
165#endif
166
167#if defined(__GXX_ABI_VERSION)
168#define AILEGO_VERSION_GXX_ABI \
169 " GNU C++ ABI " AILEGO_VERSION_TO_STRING(__GXX_ABI_VERSION) "\n"
170#else
171#define AILEGO_VERSION_GXX_ABI ""
172#endif
173
174#if defined(__GLIBC__)
175#define AILEGO_VERSION_GLIBC \
176 " GNU glibc " AILEGO_VERSION_TO_STRING( \
177 __GLIBC__) "." AILEGO_VERSION_TO_STRING(__GLIBC_MINOR__) "\n"
178#else
179#define AILEGO_VERSION_GLIBC ""
180#endif
181
182#if defined(WINVER)
183#define AILEGO_VERSION_WINSDK \
184 " Microsoft Windows SDK " AILEGO_VERSION_TO_STRING(WINVER) "\n"
185#else
186#define AILEGO_VERSION_WINSDK ""
187#endif
188
189#if defined(__CLR_VER)
190#define AILEGO_VERSION_CLR \
191 " Microsoft CLR " AILEGO_VERSION_TO_STRING(__CLR_VER) "\n"
192#else
193#define AILEGO_VERSION_CLR ""
194#endif
195
196#if defined(__LSB_VERSION__)
197#define AILEGO_VERSION_LSB \
198 " Linux Standards Base " AILEGO_VERSION_TO_STRING(__LSB_VERSION__) "\n"
199#else
200#define AILEGO_VERSION_LSB ""
201#endif
202
203#if defined(_POSIX_VERSION)
204#define AILEGO_VERSION_POSIX \
205 " POSIX Specification " AILEGO_VERSION_TO_STRING(_POSIX_VERSION) "\n"
206#else
207#define AILEGO_VERSION_POSIX ""
208#endif
209
210#if defined(_XOPEN_VERSION)
211#define AILEGO_VERSION_XOPEN \
212 " X/Open Specification " AILEGO_VERSION_TO_STRING(_XOPEN_VERSION) "\n"
213#else
214#define AILEGO_VERSION_XOPEN ""
215#endif
216
217#if defined(_OPENMP)
218#define AILEGO_VERSION_OPENMP \
219 " OpenMP API " AILEGO_VERSION_TO_STRING(_OPENMP) "\n"
220#else
221#define AILEGO_VERSION_OPENMP ""
222#endif
223
224#if defined(__ARM_NEON)
225#define AILEGO_VERSION_SIMD " Arm Neon Instruction Set\n"
226#elif defined(__AVX512F__)
227#define AILEGO_VERSION_SIMD " AVX-512F Instruction Set\n"
228#elif defined(__AVX2__)
229#define AILEGO_VERSION_SIMD " AVX-2 Instruction Set\n"
230#elif defined(__AVX__)
231#define AILEGO_VERSION_SIMD " AVX Instruction Set\n"
232#elif defined(__SSE4_2__)
233#define AILEGO_VERSION_SIMD " SSE-4.2 Instruction Set\n"
234#elif defined(__SSE4_1__)
235#define AILEGO_VERSION_SIMD " SSE-4.1 Instruction Set\n"
236#elif defined(__SSSE3__)
237#define AILEGO_VERSION_SIMD " SSSE-3 Instruction Set\n"
238#elif defined(__SSE3__)
239#define AILEGO_VERSION_SIMD " SSE-3 Instruction Set\n"
240#elif defined(__SSE2__)
241#define AILEGO_VERSION_SIMD " SSE-2 Instruction Set\n"
242#elif defined(__SSE__)
243#define AILEGO_VERSION_SIMD " SSE Instruction Set\n"
244#elif defined(__MMX__)
245#define AILEGO_VERSION_SIMD " MMX Instruction Set\n"
246#else
247#define AILEGO_VERSION_SIMD ""
248#endif
249
250#if defined(PY_VERSION)
251#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
252#define AILEGO_VERSION_PYTHON \
253 " Python API " PY_VERSION \
254 " Alpha " AILEGO_VERSION_TO_STRING(PY_RELEASE_SERIAL) "\n"
255#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
256#define AILEGO_VERSION_PYTHON \
257 " Python API " PY_VERSION \
258 " Beta " AILEGO_VERSION_TO_STRING(PY_RELEASE_SERIAL) "\n"
259#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
260#define AILEGO_VERSION_PYTHON \
261 " Python API " PY_VERSION \
262 " Release Candidate " AILEGO_VERSION_TO_STRING(PY_RELEASE_SERIAL) "\n"
263#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
264#define AILEGO_VERSION_PYTHON " Python API " PY_VERSION " Final\n"
265#else
266#define AILEGO_VERSION_PYTHON " Python API " PY_VERSION "\n"
267#endif
268#else
269#define AILEGO_VERSION_PYTHON ""
270#endif
271
272//! Gather information of compiling
273#define AILEGO_VERSION_COMPILE_DETAILS(__PREFIX_INFO__) \
274 __PREFIX_INFO__ \
275 "Compiled by " AILEGO_VERSION_COMPILER \
276 ".\n" \
277 "Compiled for " AILEGO_VERSION_PROCESSOR \
278 ".\n" \
279 "Compiled on " AILEGO_VERSION_PLATFORM " on " __DATE__ " " __TIME__ \
280 ".\n" \
281 "Compiled with: \n" \
282 "" AILEGO_VERSION_BYTE_ORDER "" AILEGO_VERSION_SIMD \
283 "" AILEGO_VERSION_DEBUG_INFO "" AILEGO_VERSION_ASAN "" AILEGO_VERSION_STDC \
284 "" AILEGO_VERSION_CPLUSPLUS "" AILEGO_VERSION_GXX_ABI \
285 "" AILEGO_VERSION_POSIX "" AILEGO_VERSION_XOPEN "" AILEGO_VERSION_LSB \
286 "" AILEGO_VERSION_GLIBC "" AILEGO_VERSION_WINSDK "" AILEGO_VERSION_CLR \
287 "" AILEGO_VERSION_OPENMP "" AILEGO_VERSION_PYTHON "\n"
288