Logo ROOT  
Reference Guide
RConfig.hxx
Go to the documentation of this file.
1 /* @(#)root/base:$Id$ */
2 
3 /*************************************************************************
4  * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers. *
5  * All rights reserved. *
6  * *
7  * For the licensing terms see $ROOTSYS/LICENSE. *
8  * For the list of contributors see $ROOTSYS/README/CREDITS. *
9  *************************************************************************/
10 
11 #ifndef ROOT_RConfig
12 #define ROOT_RConfig
13 
14 /*************************************************************************
15  * *
16  * RConfig *
17  * *
18  * Defines used by ROOT. *
19  * *
20  *************************************************************************/
21 
22 #include "../RVersion.h"
23 #include "RConfigure.h"
24 
25 
26 /*---- new C++ features ------------------------------------------------------*/
27 
28 #if defined __has_feature
29 # if __has_feature(modules)
30 # define R__CXXMODULES
31 # endif
32 #endif
33 
34 #define R__USE_SHADOW_CLASS
35 
36 /* Now required, thus defined by default for backward compatibility */
37 #define R__ANSISTREAM /* ANSI C++ Standard Library conformant */
38 #define R__SSTREAM /* use sstream or strstream header */
39 
40 #if defined(_MSC_VER)
41 # if (_MSC_VER < 1910)
42 # error "ROOT requires Visual Studio 2017 or higher."
43 # else
44 # define R__NULLPTR
45 # endif
46 #else
47 # if defined(__cplusplus) && (__cplusplus < 201103L)
48 # error "ROOT requires support for C++11 or higher."
49 # if defined(__GNUC__) || defined(__clang__)
50 # error "Pass `-std=c++11` as compiler argument."
51 # endif
52 # endif
53 #endif
54 
55 /*---- machines --------------------------------------------------------------*/
56 
57 #ifdef __hpux
58  /* R__HPUX10 or R__HPUX11 is determined in the Makefile */
59 # define R__HPUX
60 # define R__UNIX
61 # define ANSICPP
62 # ifdef __LP64__
63 # define R__B64
64 # endif
65 # ifdef R__HPUX10
66 # define NEED_SNPRINTF
67 # endif
68 #endif
69 
70 #ifdef _AIX
71 # define R__AIX
72 # define R__UNIX
73 # define ANSICPP
74 # define R__SEEK64
75 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
76 # define NEED_STRCASECMP
77 #endif
78 
79 #if defined(__linux) || defined(__linux__)
80 # ifndef linux
81 # define linux
82 # endif
83 #endif
84 
85 #if defined(__CYGWIN__) && defined(__GNUC__)
86 # ifndef linux
87 # define linux
88 # endif
89 # ifndef R__WINGCC
90 # define R__WINGCC
91 # endif
92 #endif
93 
94 #if defined(__sun) && !(defined(linux) || defined(__FCC_VERSION))
95 # ifdef __SVR4
96 # define R__SOLARIS
97 # define R__SEEK64
98 # define ANSICPP
99 # ifdef __i386
100 # define R__BYTESWAP
101 # endif
102 # ifdef __x86_64
103 # define R__B64
104 # define R__BYTESWAP
105 # endif
106 # else
107 # define R__SUN
108 # include <stdlib.h>
109 # endif
110 # define R__UNIX
111 # define NEED_STRING
112 # define NEED_SIGJMP
113 # if __SUNPRO_CC > 0x420
114 # define R__SOLARIS_CC50
115 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
116 # endif
117 # if __SUNPRO_CC >= 0x420
118 # define R__SUNCCBUG /* to work around a compiler bug */
119 # endif
120 # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 90 /* modern egcs/gcc */
121 # define R__SUNGCC3
122 # endif
123 #endif
124 
125 #if defined(__FCC_VERSION) /* Solaris with Fujitsu compiler */
126 # define R__SOLARIS
127 # define R__SEEK64
128 # define ANSICPP
129 # define R__UNIX
130 # define NEED_STRING
131 # define NEED_SIGJMP
132 #endif
133 
134 #if defined(linux)
135 # ifndef _LARGEFILE64_SOURCE
136 # define _LARGEFILE64_SOURCE
137 # endif
138 # include <features.h>
139 # if __GNU_LIBRARY__ == 6
140 # ifndef R__GLIBC
141 # define R__GLIBC
142 # endif
143 # endif
144 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2
145 # define R__NONSCALARFPOS2
146 # define R__USESTHROW
147 # define R__SEEK64
148 # endif
149 #endif
150 
151 #if defined(linux) && defined(__i386__)
152 # define R__LINUX
153 # define R__UNIX
154 # define R__BYTESWAP
155 # ifndef __i486__
156 # define __i486__ /* turn off if you really want to run on an i386 */
157 # endif
158 # define NEED_SIGJMP
159 #endif
160 
161 #if defined(linux) && defined(__ia64__)
162 # define R__LINUX
163 # define R__UNIX
164 # define R__BYTESWAP
165 # define R__B64
166 # define NEED_SIGJMP
167 #endif
168 
169 #if defined(linux) && defined(__x86_64__)
170 # define R__LINUX
171 # define R__UNIX
172 # define R__BYTESWAP
173 # define R__B64
174 # define NEED_SIGJMP
175 #endif
176 
177 #if defined(linux) && defined(__arm__)
178 # define R__LINUX
179 # define R__UNIX
180 # define R__BYTESWAP
181 # define NEED_SIGJMP
182 #endif
183 
184 #if defined(linux) && defined(__sparc__)
185 # define R__LINUX
186 # define R__UNIX
187 # define NEED_SIGJMP
188 /*# define R__B64 */ /* enable when 64 bit machine */
189 #endif
190 
191 #if defined(linux) && defined(__hppa)
192 # define R__LINUX
193 # define R__UNIX
194 # define NEED_SIGJMP
195 #endif
196 
197 #if defined(linux) && defined(__powerpc__)
198 # define R__LINUX
199 # define R__UNIX
200 # define NEED_SIGJMP
201 # if defined(R__ppc64)
202 # define R__B64
203 # endif
204 # if defined(_LITTLE_ENDIAN)
205 # define R__BYTESWAP
206 # endif
207 #endif
208 
209 #if defined(linux) && defined(__aarch64__)
210 # define R__LINUX
211 # define R__UNIX
212 # define R__BYTESWAP
213 # define R__B64
214 # define NEED_SIGJMP
215 #endif
216 
217 #if defined(linux) && defined(__s390__)
218 # define R__LINUX
219 # define R__UNIX
220 # define NEED_SIGJMP
221 #endif
222 
223 #if defined(linux) && defined(__s390x__)
224 # define R__LINUX
225 # define R__UNIX
226 # define R__B64
227 # define NEED_SIGJMP
228 #endif
229 
230 #if defined(__MACH__) && defined(__i386__) && !defined(__APPLE__)
231 # define R__HURD
232 # define f2cFortran /* cfortran.h does not know HURD - sigh */
233 # define R__UNIX
234 # define R__BYTESWAP
235 # define R__GLIBC /* GNU/Hurd always use GLIBC 2.x :-) */
236 # define NEED_SIGJMP
237 #endif
238 
239 #if defined(__Lynx__) && defined(__powerpc__)
240 # define R__LYNXOS
241 # define R__UNIX
242 # define ANSICPP
243 # define NEED_SIGJMP
244 # define NEED_STRCASECMP
245 # define NEED_SNPRINTF
246 #endif
247 
248 #if defined(__FreeBSD__)
249 # define R__FBSD
250 # define R__UNIX
251 # define R__BYTESWAP
252 # if defined(__i386__)
253 # ifndef __i486__
254 # define __i486__ /* turn off if you really want to run on an i386 */
255 # endif
256 # endif
257 # if defined(__amd64__)
258 # define R__B64
259 # endif
260 # define HAS_STRLCPY
261 #endif
262 
263 #if defined(__OpenBSD__)
264 # define R__OBSD
265 # define R__UNIX
266 # define R__BYTESWAP
267 # if defined(__i386__)
268 # ifndef __i486__
269 # define __i486__ /* turn off if you really want to run on an i386 */
270 # endif
271 # endif
272 # if defined(__amd64__)
273 # define R__B64
274 # endif
275 # define HAS_STRLCPY
276 #endif
277 
278 #if defined(__APPLE__) /* MacOS X support, initially following FreeBSD */
279 # include <AvailabilityMacros.h>
280 # ifndef __CINT__
281 # include <TargetConditionals.h>
282 # endif
283 # define R__MACOSX
284 # define R__UNIX
285 # if defined(__xlC__) || defined(__xlc__)
286 # define ANSICPP
287 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
288 # endif
289 # if defined(__ppc64__)
290 # define R__B64 /* enable when 64 bit machine */
291 # endif
292 # if defined(__i386__)
293 # define R__BYTESWAP
294 # endif
295 # if defined(__x86_64__)
296 # define R__BYTESWAP
297 # define R__B64 /* enable when 64 bit machine */
298 # endif
299 # if defined(__arm__)
300 # define R__BYTESWAP
301 # endif
302 # if defined (__arm64__)
303 # define R__BYTESWAP
304 # define R__B64 /* enable when 64 bit machine */
305 # endif
306 # define HAS_STRLCPY
307 #endif
308 
309 #ifdef _HIUX_SOURCE
310 # define R__HIUX
311 # define R__UNIX
312 # define NEED_SIGJMP
313 # define NEED_SNPRINTF
314 # define ANSICPP
315 #endif
316 
317 #ifdef __GNUC__
318 # define R__GNU
319 # define ANSICPP
320 # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 90 /* egcs 1.0.3 */
321 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
322 # define R__PLACEMENTDELETE /* supports overloading placement delete */
323 # endif
324 # if __GNUC__ >= 3 || ( __GNUC__ == 2 && __GNUC_MINOR__ >= 95)
325 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
326 # endif
327 # if defined(__ia64__) && __GNUC__ < 3 /* gcc 2.9x (MINOR is 9!) */
328 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
329 # define R__PLACEMENTDELETE /* supports overloading placement delete */
330 # endif
331 # if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ > 1)
332 # define R__PRAGMA_DIAGNOSTIC
333 # endif
334 #endif
335 
336 #if __cplusplus >= 201402L
337 # if defined(R__MACOSX) && !defined(MAC_OS_X_VERSION_10_12)
338  // At least on 10.11, the compiler defines but the c++ library does not provide the size operator delete.
339  // See for example https://llvm.org/bugs/show_bug.cgi?id=22951 or
340  // https://github.com/gperftools/gperftools/issues/794.
341 # elif !defined(__GNUC__)
342 # define R__SIZEDDELETE
343 # elif __GNUC__ > 4
344 # define R__SIZEDDELETE
345 # endif
346 #endif
347 
348 /* allows symbols to be hidden from the shared library export symbol table */
349 /* use typically on file statics and private methods */
350 #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
351 # define R__HIDDEN __attribute__((__visibility__("hidden")))
352 #else
353 # define R__HIDDEN
354 #endif
355 
356 #ifdef __INTEL_COMPILER
357 # define R__INTEL_COMPILER
358 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
359 # define R__PLACEMENTDELETE /* supports overloading placement delete */
360 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
361 # define ANSICPP
362 #endif
363 
364 #ifdef __HP_aCC
365 # define R__ACC
366 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
367 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
368 # if __HP_aCC <= 015000
369 # define R__OLDHPACC
370 # define R__TEMPLATE_OVERLOAD_BUG
371 # define R__GLOBALSTL /* STL in global name space */
372 # error "ROOT requires proper support for C++11 or higher"
373 # else
374 # define R__PLACEMENTDELETE /* supports overloading placement delete */
375 # define R__TMPLTSTREAM /* std::iostream implemented with templates */
376 # endif
377 # ifndef _INCLUDE_LONGLONG
378 # define _INCLUDE_LONGLONG
379 # endif
380 #endif
381 
382 #ifdef _WIN32
383 # define R__WIN32
384 # ifndef WIN32
385 # define WIN32
386 # endif
387 # define R__BYTESWAP
388 # define R__ACCESS_IN_SYMBOL
389 //# define __attribute__(X)
390 //# define thread_local static __declspec(thread)
391 #endif
392 #ifdef _WIN64
393 # define R__WIN64
394 # ifndef WIN64
395 # define WIN64
396 # endif
397 # define __x86_64__ 1
398 # define R__B64 /* enable when 64 bit machine */
399 #endif
400 
401 #ifdef __SC__
402 # define SC
403 # define R__SC
404 # if defined(WIN32)
405 # define NEED_STRING
406 # define NEED_STRCASECMP
407 # define NEED_SNPRINTF
408 # define ANSICPP
409 # else
410 # define MSDOS
411 # define NEED_STRCASECMP
412 # define R__BYTESWAP
413 # endif
414 #endif
415 
416 #ifdef _MSC_VER
417 # define R__VISUAL_CPLUSPLUS
418 # define NEED_STRING
419 # define NEED_STRCASECMP
420 # if _MSC_VER < 1900
421 # define NEED_SNPRINTF
422 # endif
423 # define ANSICPP
424 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
425 # define R__PLACEMENTDELETE /* supports overloading placement delete */
426 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
427 # if _MSC_VER >= 1400
428 # define DONTNEED_VSNPRINTF
429 # endif
430 # if _MSC_VER < 1310
431 # define R__NO_CLASS_TEMPLATE_SPECIALIZATION
432 # endif
433 # if _MSC_VER <= 1800
434 # define R__NO_ATOMIC_FUNCTION_POINTER
435 # endif
436 #endif
437 
438 /*--- memory and object statistics -------------------------------------------*/
439 
440 /* #define R__NOSTATS */
441 
442 /*--- cpp --------------------------------------------------------------------*/
443 
444 #ifdef ANSICPP
445  /* symbol concatenation operator */
446 # define _NAME1_(name) name
447 # define _NAME2_(name1,name2) name1##name2
448 # define _NAME3_(name1,name2,name3) name1##name2##name3
449 
450  /* stringizing */
451 # define _QUOTE_(name) #name
452 
453 #else
454 
455 # define _NAME1_(name) name
456 # define _NAME2_(name1,name2) _NAME1_(name1)name2
457 # define _NAME3_(name1,name2,name3) _NAME2_(name1,name2)name3
458 
459 # define _QUOTE_(name) "name"
460 
461 #endif
462 
463 /* produce an identifier that is almost unique inside a file */
464 #ifndef __CINT__
465 # define _R__JOIN_(X,Y) _NAME2_(X,Y)
466 # define _R__JOIN3_(F,X,Y) _NAME3_(F,X,Y)
467 # define _R__UNIQUE_DICT_(X) _R__JOIN3_(R__DICTIONARY_FILENAME,X,__LINE__)
468 # define _R__UNIQUE_(X) _R__JOIN_(X,__LINE__)
469 #else
470  /* Currently CINT does not really mind to have duplicates and */
471  /* does not work correctly as far as merging tokens is concerned. */
472 # define _R__UNIQUE_(X) X
473 #endif
474 
475 /*---- deprecation -----------------------------------------------------------*/
476 #if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
477 # if (__GNUC__ == 5 && (__GNUC_MINOR__ == 1 || __GNUC_MINOR__ == 2)) || defined(R__NO_DEPRECATION)
478 /* GCC 5.1, 5.2: false positives due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=15269
479  or deprecation turned off */
480 # define _R__DEPRECATED_LATER(REASON)
481 # else
482 # define _R__DEPRECATED_LATER(REASON) __attribute__((deprecated(REASON)))
483 # endif
484 #elif defined(_MSC_VER) || !defined(R__NO_DEPRECATION)
485 # define _R__DEPRECATED_LATER(REASON) __pragma(deprecated(REASON))
486 #else
487 /* Deprecation not supported for this compiler. */
488 # define _R__DEPRECATED_LATER(REASON)
489 #endif
490 
491 #ifdef R__WIN32
492 #define _R_DEPRECATED_REMOVE_NOW(REASON)
493 #else
494 #define _R_DEPRECATED_REMOVE_NOW(REASON) __attribute__((REMOVE_THIS_NOW))
495 #endif
496 
497 /* USE AS `R__DEPRECATED(6,28, "Not threadsafe; use TFoo::Bar().")`
498  To be removed by 6.28 */
499 #if ROOT_VERSION_CODE <= ROOT_VERSION(6,27,0)
500 # define _R__DEPRECATED_628(REASON) _R__DEPRECATED_LATER(REASON)
501 #else
502 # define _R__DEPRECATED_628(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
503 #endif
504 
505 /* USE AS `R__DEPRECATED(7,00, "Not threadsafe; use TFoo::Bar().")`
506  To be removed by 7.00 */
507 #if ROOT_VERSION_CODE < ROOT_VERSION(6,99,0)
508 # define _R__DEPRECATED_700(REASON) _R__DEPRECATED_LATER(REASON)
509 #else
510 # define _R__DEPRECATED_700(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
511 #endif
512 
513 
514 /* Spell as R__DEPRECATED(6,04, "Not threadsafe; use TFoo::Bar().") */
515 #define R__DEPRECATED(MAJOR, MINOR, REASON) \
516  _R__JOIN3_(_R__DEPRECATED_,MAJOR,MINOR)("will be removed in ROOT v" #MAJOR "." #MINOR ": " REASON)
517 
518 /* Mechanisms to advise users to avoid legacy functions and classes that will not be removed */
519 #if defined R__SUGGEST_NEW_INTERFACE
520 # define R__SUGGEST_ALTERNATIVE(ALTERNATIVE) \
521  _R__DEPRECATED_LATER("There is a superior alternative: " ALTERNATIVE)
522 #else
523 # define R__SUGGEST_ALTERNATIVE(ALTERNATIVE)
524 #endif
525 
526 #define R__ALWAYS_SUGGEST_ALTERNATIVE(ALTERNATIVE) \
527  _R__DEPRECATED_LATER("There is a superior alternative: " ALTERNATIVE)
528 
529 
530 
531 /*---- misc ------------------------------------------------------------------*/
532 
533 #ifdef R__GNU
534 # define SafeDelete(p) { if (p) { delete p; p = 0; } }
535 #else
536 # define SafeDelete(p) { delete p; p = 0; }
537 #endif
538 
539 #ifdef __FAST_MATH__
540 #define R__FAST_MATH
541 #endif
542 
543 #if (__GNUC__ >= 7)
544 #define R__DO_PRAGMA(x) _Pragma (#x)
545 # define R__INTENTIONALLY_UNINIT_BEGIN \
546  R__DO_PRAGMA(GCC diagnostic push) \
547  R__DO_PRAGMA(GCC diagnostic ignored "-Wmaybe-uninitialized") \
548  R__DO_PRAGMA(GCC diagnostic ignored "-Wuninitialized")
549 # define R__INTENTIONALLY_UNINIT_END \
550  R__DO_PRAGMA(GCC diagnostic pop)
551 #else
552 # define R__INTENTIONALLY_UNINIT_BEGIN
553 # define R__INTENTIONALLY_UNINIT_END
554 
555 #endif
556 
557 #ifdef R__HAS_ATTRIBUTE_ALWAYS_INLINE
558 #define R__ALWAYS_INLINE inline __attribute__((always_inline))
559 #else
560 #if defined(_MSC_VER)
561 #define R__ALWAYS_INLINE __forceinline
562 #else
563 #define R__ALWAYS_INLINE inline
564 #endif
565 #endif
566 
567 // See also https://nemequ.github.io/hedley/api-reference.html#HEDLEY_NEVER_INLINE
568 // for other platforms.
569 #ifdef R__HAS_ATTRIBUTE_NOINLINE
570 #define R__NEVER_INLINE inline __attribute__((noinline))
571 #else
572 #if defined(_MSC_VER)
573 #define R__NEVER_INLINE inline __declspec(noinline)
574 #else
575 #define R__NEVER_INLINE inline
576 #endif
577 #endif
578 
579 /*---- unlikely / likely expressions -----------------------------------------*/
580 // These are meant to use in cases like:
581 // if (R__unlikely(expression)) { ... }
582 // in performance-critical sections. R__unlikely / R__likely provide hints to
583 // the compiler code generation to heavily optimize one side of a conditional,
584 // causing the other branch to have a heavy performance cost.
585 //
586 // It is best to use this for conditionals that test for rare error cases or
587 // backward compatibility code.
588 
589 #if (__GNUC__ >= 3) || defined(__INTEL_COMPILER)
590 #if !defined(R__unlikely)
591  #define R__unlikely(expr) __builtin_expect(!!(expr), 0)
592 #endif
593 #if !defined(R__likely)
594  #define R__likely(expr) __builtin_expect(!!(expr), 1)
595 #endif
596 #else
597  #define R__unlikely(expr) expr
598  #define R__likely(expr) expr
599 #endif
600 
601 // Setting this define causes ROOT to keep statistics about memory buffer allocation
602 // time within the TTree. Given that this is a "hot-path", we provide a mechanism
603 // for enabling / disabling this at compile time by developers; default is disabled.
604 #ifndef R__TRACK_BASKET_ALLOC_TIME
605 //#define R__TRACK_BASKET_ALLOC_TIME 1
606 #endif
607 
608 #endif