Add cross-platform NUMA library
[blender.git] / intern / numaapi / source / build_config.h
1 // Copyright (c) 2018, libnumaapi authors
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to
5 // deal in the Software without restriction, including without limitation the
6 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 // sell copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 // IN THE SOFTWARE.
20 //
21 // Author: Sergey Sharybin (sergey.vfx@gmail.com)
22
23 #ifndef __BUILD_CONFIG_H__
24 #define __BUILD_CONFIG_H__
25
26 #include <limits.h>
27 #include <stdint.h>
28
29 // Initially is based on Chromium's build_config.h, with tweaks and extensions
30 // needed for this project.
31 //
32 // NOTE: All commonly used symbols (which are checked on a "top" level, from
33 // outside of any platform-specific ifdef block) are to be explicitly defined
34 // to 0 when they are not "active". This is extra lines of code in this file,
35 // but is not being edited that often. Such approach helps catching cases when
36 // one attempted to access build configuration variable without including the
37 // header by simply using -Wundef compiler attribute.
38 //
39 // NOTE: Not having things explicitly defined to 0 is harmless (in terms it
40 // follows same rules as Google projects) and will simply cause compiler to
41 // become more noisy, which is simple to correct.
42
43 ////////////////////////////////////////////////////////////////////////////////
44 // A set of macros to use for platform detection.
45
46 #if defined(__native_client__)
47 // __native_client__ must be first, so that other OS_ defines are not set.
48 #  define OS_NACL 1
49 #elif defined(_AIX)
50 #  define OS_AIX 1
51 #elif defined(ANDROID)
52 #  define OS_ANDROID 1
53 #elif defined(__APPLE__)
54 // Only include TargetConditions after testing ANDROID as some android builds
55 // on mac don't have this header available and it's not needed unless the target
56 // is really mac/ios.
57 #  include <TargetConditionals.h>
58 #  define OS_MACOSX 1
59 #  if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
60 #    define OS_IOS 1
61 #  endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
62 #elif defined(__HAIKU__)
63 #  define OS_HAIKU 1
64 #elif defined(__hpux)
65 #  define OS_HPUX 1
66 #elif defined(__linux__)
67 #  define OS_LINUX 1
68 // Include a system header to pull in features.h for glibc/uclibc macros.
69 #  include <unistd.h>
70 #  if defined(__GLIBC__) && !defined(__UCLIBC__)
71 // We really are using glibc, not uClibc pretending to be glibc.
72 #    define LIBC_GLIBC 1
73 #  endif
74 #elif defined(__sgi)
75 #  define OS_IRIX 1
76 #elif defined(_WIN32)
77 #  define OS_WIN 1
78 #elif defined(__FreeBSD__)
79 #  define OS_FREEBSD 1
80 #elif defined(__NetBSD__)
81 #  define OS_NETBSD 1
82 #elif defined(__OpenBSD__)
83 #  define OS_OPENBSD 1
84 #elif defined(__sun)
85 #  define OS_SOLARIS 1
86 #elif defined(__QNXNTO__)
87 #  define OS_QNX 1
88 #else
89 #  error Please add support for your platform in build_config.h
90 #endif
91
92 #if !defined(OS_AIX)
93 #  define OS_AIX 0
94 #endif
95 #if !defined(OS_NACL)
96 #  define OS_NACL 0
97 #endif
98 #if !defined(OS_ANDROID)
99 #  define OS_ANDROID 0
100 #endif
101 #if !defined(OS_MACOSX)
102 #  define OS_MACOSX 0
103 #endif
104 #if !defined(OS_IOS)
105 #  define OS_IOS 0
106 #endif
107 #if !defined(OS_HAIKU)
108 #  define OS_HAIKU 0
109 #endif
110 #if !defined(OS_HPUX)
111 #  define OS_HPUX 0
112 #endif
113 #if !defined(OS_IRIX)
114 #  define OS_IRIX 0
115 #endif
116 #if !defined(OS_LINUX)
117 #  define OS_LINUX 0
118 #endif
119 #if !defined(LIBC_GLIBC)
120 #  define LIBC_GLIBC 0
121 #endif
122 #if !defined(OS_WIN)
123 #  define OS_WIN 0
124 #endif
125 #if !defined(OS_FREEBSD)
126 #  define OS_FREEBSD 0
127 #endif
128 #if !defined(OS_NETBSD)
129 #  define OS_NETBSD 0
130 #endif
131 #if !defined(OS_OPENBSD)
132 #  define OS_OPENBSD 0
133 #endif
134 #if !defined(OS_SOLARIS)
135 #  define OS_SOLARIS 0
136 #endif
137 #if !defined(OS_QNX)
138 #  define OS_QNX 0
139 #endif
140
141 ////////////////////////////////////////////////////////////////////////////////
142 // *BSD OS family detection.
143 //
144 // For access to standard BSD features, use OS_BSD instead of a
145 // more specific macro.
146 #if OS_FREEBSD || OS_OPENBSD || OS_NETBSD
147 #  define OS_BSD 1
148 #else
149 #  define OS_BSD 0
150 #endif
151
152 ////////////////////////////////////////////////////////////////////////////////
153 // POSIX system detection.
154 //
155 // For access to standard POSIXish features use OS_POSIX instead of a
156 // more specific macro.
157 #if OS_MACOSX || OS_LINUX || OS_BSD || OS_SOLARIS ||OS_ANDROID || OS_NACL ||  \
158     OS_QNX || OS_HAIKU || OS_AIX || OS_HPUX || OS_IRIX
159 #  define OS_POSIX 1
160 #else
161 #  define OS_POSIX 0
162 #endif
163
164 ////////////////////////////////////////////////////////////////////////////////
165 // Compiler detection, including its capabilities.
166
167 #if defined(__clang__)
168 #  define COMPILER_CLANG 1
169 #elif defined(__GNUC__)
170 #  define COMPILER_GCC 1
171 #  define COMPILER_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
172 #elif defined(_MSC_VER)
173 #  define COMPILER_MSVC 1
174 #  define COMPILER_MSVC_VERSION (_MSC_VER)
175 #elif defined(__MINGW32__)
176 #  define COMPILER_MINGW32 1
177 #elif defined(__MINGW64__)
178 #  define COMPILER_MINGW64 1
179 #else
180 #  error Please add support for your compiler in build_config.h
181 #endif
182
183 #if !defined(COMPILER_CLANG)
184 #  define COMPILER_CLANG 0
185 #endif
186 #if !defined(COMPILER_GCC)
187 #  define COMPILER_GCC 0
188 #endif
189 #if !defined(COMPILER_MSVC)
190 #  define COMPILER_MSVC 0
191 #endif
192 #if !defined(COMPILER_MINGW32)
193 #  define COMPILER_MINGW32 0
194 #endif
195 #if !defined(COMPILER_MINGW64)
196 #  define COMPILER_MINGW64 0
197 #endif
198
199 // Compiler is any of MinGW family.
200 #if COMPILER_MINGW32 || COMPILER_MINGW64
201 #  define COMPILER_MINGW 1
202 #else
203 #  define COMPILER_MINGW 0
204 #endif
205
206 // Check what is the latest C++ specification the compiler supports.
207 //
208 // NOTE: Use explicit definition here to avoid expansion-to-defined warning from
209 // being geenrated. While this will most likely a false-positive warning in this
210 // particular case, that warning might be helpful to catch errors elsewhere.
211
212 // C++11 check.
213 #if ((defined(__cplusplus) && (__cplusplus > 199711L)) || \
214      (defined(_MSC_VER) && (_MSC_VER >= 1800)))
215 #  define COMPILER_SUPPORTS_CXX11 1
216 #else
217 #  define COMPILER_SUPPORTS_CXX11 0
218 #endif
219 // C++14 check.
220 #if (defined(__cplusplus) && (__cplusplus > 201311L))
221 #  define COMPILER_SUPPORTS_CXX14  1
222 #else
223 #  define COMPILER_SUPPORTS_CXX14  0
224 #endif
225 // C++17 check.
226 #if (defined(__cplusplus) && (__cplusplus > 201611L))
227 #  define COMPILER_SUPPORTS_CXX17  1
228 #else
229 #  define COMPILER_SUPPORTS_CXX17  0
230 #endif
231 // C++20 check.
232 #if (defined(__cplusplus) && (__cplusplus > 201911L))
233 #  define COMPILER_SUPPORTS_CXX20  1
234 #else
235 #  define COMPILER_SUPPORTS_CXX20  0
236 #endif
237
238 // COMPILER_USE_ADDRESS_SANITIZER is defined when program is detected that
239 // compilation happened wit haddress sanitizer enabled. This allows to give
240 // tips to sanitizer, or maybe work around some known issues with third party
241 // libraries.
242 #if !defined(COMPILER_USE_ADDRESS_SANITIZER)
243 #  if defined(__has_feature)
244 #    define COMPILER_USE_ADDRESS_SANITIZER 1
245 #  elif defined(__SANITIZE_ADDRESS__)
246 #    define COMPILER_USE_ADDRESS_SANITIZER 1
247 #  endif
248 #endif
249
250 #if !defined(COMPILER_USE_ADDRESS_SANITIZER)
251 #  define COMPILER_USE_ADDRESS_SANITIZER 0
252 #endif
253
254 ////////////////////////////////////////////////////////////////////////////////
255 // Processor architecture detection.
256 //
257 // For more info on what's defined, see:
258 //
259 //   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
260 //   http://www.agner.org/optimize/calling_conventions.pdf
261 //
262 //   or with gcc, run: "echo | gcc -E -dM -"
263 #if defined(_M_X64) || defined(__x86_64__)
264 #  define ARCH_CPU_X86_FAMILY 1
265 #  define ARCH_CPU_X86_64 1
266 #  define ARCH_CPU_64_BITS 1
267 #  define ARCH_CPU_LITTLE_ENDIAN 1
268 #elif defined(_M_IX86) || defined(__i386__)
269 #  define ARCH_CPU_X86_FAMILY 1
270 #  define ARCH_CPU_X86 1
271 #  define ARCH_CPU_32_BITS 1
272 #  define ARCH_CPU_LITTLE_ENDIAN 1
273 #elif defined(__ARMEL__)
274 #  define ARCH_CPU_ARM_FAMILY 1
275 #  define ARCH_CPU_ARMEL 1
276 #  define ARCH_CPU_32_BITS 1
277 #  define ARCH_CPU_LITTLE_ENDIAN 1
278 #elif defined(__aarch64__)
279 #  define ARCH_CPU_ARM_FAMILY 1
280 #  define ARCH_CPU_ARM64 1
281 #  define ARCH_CPU_64_BITS 1
282 #  define ARCH_CPU_LITTLE_ENDIAN 1
283 #elif defined(__pnacl__)
284 #  define ARCH_CPU_32_BITS 1
285 #  define ARCH_CPU_LITTLE_ENDIAN 1
286 #elif defined(__MIPSEL__)
287 #  if defined(__LP64__)
288 #    define ARCH_CPU_MIPS64_FAMILY 1
289 #    define ARCH_CPU_MIPS64EL 1
290 #    define ARCH_CPU_64_BITS 1
291 #    define ARCH_CPU_LITTLE_ENDIAN 1
292 #  else
293 #    define ARCH_CPU_MIPS_FAMILY 1
294 #    define ARCH_CPU_MIPSEL 1
295 #    define ARCH_CPU_32_BITS 1
296 #    define ARCH_CPU_LITTLE_ENDIAN 1
297 #  endif
298 #elif defined(__MIPSEB__)
299 #  if defined(__LP64__)
300 #    define ARCH_CPU_MIPS64_FAMILY 1
301 #    define ARCH_CPU_MIPS64EB 1
302 #    define ARCH_CPU_64_BITS 1
303 #    define ARCH_CPU_BIG_ENDIAN 1
304 #  else
305 #    define ARCH_CPU_MIPS_FAMILY 1
306 #    define ARCH_CPU_MIPSEB 1
307 #    define ARCH_CPU_32_BITS 1
308 #    define ARCH_CPU_BIG_ENDIAN 1
309 #  endif
310 #else
311 #  error Please add support for your architecture in build_config.h
312 #endif
313
314 #if !defined(ARCH_CPU_LITTLE_ENDIAN)
315 #  define ARCH_CPU_LITTLE_ENDIAN 0
316 #endif
317 #if !defined(ARCH_CPU_BIG_ENDIAN)
318 #  define ARCH_CPU_BIG_ENDIAN 0
319 #endif
320
321 #if !defined(ARCH_CPU_32_BITS)
322 #  define ARCH_CPU_32_BITS 0
323 #endif
324 #if !defined(ARCH_CPU_64_BITS)
325 #  define ARCH_CPU_64_BITS 0
326 #endif
327
328 #if !defined(ARCH_CPU_X86_FAMILY)
329 #  define ARCH_CPU_X86_FAMILY 0
330 #endif
331 #if !defined(ARCH_CPU_ARM_FAMILY)
332 #  define ARCH_CPU_ARM_FAMILY 0
333 #endif
334 #if !defined(ARCH_CPU_MIPS_FAMILY)
335 #  define ARCH_CPU_MIPS_FAMILY 0
336 #endif
337 #if !defined(ARCH_CPU_MIPS64_FAMILY)
338 #  define ARCH_CPU_MIPS64_FAMILY 0
339 #endif
340
341 ////////////////////////////////////////////////////////////////////////////////
342 // Sizes of platform-dependent types.
343
344 #if defined(__SIZEOF_POINTER__)
345 #  define PLATFORM_SIZEOF_PTR __SIZEOF_POINTER__
346 #elif defined(UINTPTR_MAX)
347 #  if (UINTPTR_MAX == 0xffffffff)
348 #    define PLATFORM_SIZEOF_PTR 4
349 #  elif (UINTPTR_MAX == 0xffffffffffffffff)  // NOLINT
350 #    define PLATFORM_SIZEOF_PTR 8
351 #  endif
352 #elif defined(__WORDSIZE)
353 #  if (__WORDSIZE == 32)
354 #    define PLATFORM_SIZEOF_PTR 4
355 #  else if (__WORDSIZE == 64)
356 #    define PLATFORM_SIZEOF_PTR 8
357 #  endif
358 #endif
359 #if !defined(PLATFORM_SIZEOF_PTR)
360 #  error "Cannot find pointer size"
361 #endif
362
363 #if (UINT_MAX == 0xffffffff)
364 #  define PLATFORM_SIZEOF_INT 4
365 #elif (UINT_MAX == 0xffffffffffffffff)  // NOLINT
366 #  define PLATFORM_SIZEOF_INT 8
367 #else
368 #  error "Cannot find int size"
369 #endif
370
371 #if (USHRT_MAX == 0xffffffff)
372 #  define PLATFORM_SIZEOF_SHORT 4
373 #elif (USHRT_MAX == 0xffff)  // NOLINT
374 #  define PLATFORM_SIZEOF_SHORT 2
375 #else
376 #  error "Cannot find short size"
377 #endif
378
379 #endif  // __BUILD_CONFIG_H__