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(__arm__) || defined (__arm64__)
296 # define R__BYTESWAP
297 # endif
298 # if defined(__x86_64__)
299 # define R__BYTESWAP
300 # define R__B64 /* enable when 64 bit machine */
301 # endif
302 # define HAS_STRLCPY
303 #endif
304 
305 #ifdef _HIUX_SOURCE
306 # define R__HIUX
307 # define R__UNIX
308 # define NEED_SIGJMP
309 # define NEED_SNPRINTF
310 # define ANSICPP
311 #endif
312 
313 #ifdef __GNUC__
314 # define R__GNU
315 # define ANSICPP
316 # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 90 /* egcs 1.0.3 */
317 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
318 # define R__PLACEMENTDELETE /* supports overloading placement delete */
319 # endif
320 # if __GNUC__ >= 3 || ( __GNUC__ == 2 && __GNUC_MINOR__ >= 95)
321 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
322 # endif
323 # if defined(__ia64__) && __GNUC__ < 3 /* gcc 2.9x (MINOR is 9!) */
324 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
325 # define R__PLACEMENTDELETE /* supports overloading placement delete */
326 # endif
327 # if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ > 1)
328 # define R__PRAGMA_DIAGNOSTIC
329 # endif
330 #endif
331 
332 #if __cplusplus >= 201402L
333 # if defined(R__MACOSX) && !defined(MAC_OS_X_VERSION_10_12)
334  // At least on 10.11, the compiler defines but the c++ library does not provide the size operator delete.
335  // See for example https://llvm.org/bugs/show_bug.cgi?id=22951 or
336  // https://github.com/gperftools/gperftools/issues/794.
337 # elif !defined(__GNUC__)
338 # define R__SIZEDDELETE
339 # elif __GNUC__ > 4
340 # define R__SIZEDDELETE
341 # endif
342 #endif
343 
344 /* allows symbols to be hidden from the shared library export symbol table */
345 /* use typically on file statics and private methods */
346 #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
347 # define R__HIDDEN __attribute__((__visibility__("hidden")))
348 #else
349 # define R__HIDDEN
350 #endif
351 
352 #ifdef __INTEL_COMPILER
353 # define R__INTEL_COMPILER
354 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
355 # define R__PLACEMENTDELETE /* supports overloading placement delete */
356 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
357 # define ANSICPP
358 #endif
359 
360 #ifdef __HP_aCC
361 # define R__ACC
362 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
363 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
364 # if __HP_aCC <= 015000
365 # define R__OLDHPACC
366 # define R__TEMPLATE_OVERLOAD_BUG
367 # define R__GLOBALSTL /* STL in global name space */
368 # error "ROOT requires proper support for C++11 or higher"
369 # else
370 # define R__PLACEMENTDELETE /* supports overloading placement delete */
371 # define R__TMPLTSTREAM /* std::iostream implemented with templates */
372 # endif
373 # ifndef _INCLUDE_LONGLONG
374 # define _INCLUDE_LONGLONG
375 # endif
376 #endif
377 
378 #ifdef _WIN32
379 # define R__WIN32
380 # ifndef WIN32
381 # define WIN32
382 # endif
383 # define R__BYTESWAP
384 # define R__ACCESS_IN_SYMBOL
385 //# define __attribute__(X)
386 //# define thread_local static __declspec(thread)
387 #endif
388 #ifdef _WIN64
389 # define R__WIN64
390 # ifndef WIN64
391 # define WIN64
392 # endif
393 # define __x86_64__ 1
394 # define R__B64 /* enable when 64 bit machine */
395 #endif
396 
397 #ifdef __SC__
398 # define SC
399 # define R__SC
400 # if defined(WIN32)
401 # define NEED_STRING
402 # define NEED_STRCASECMP
403 # define NEED_SNPRINTF
404 # define ANSICPP
405 # else
406 # define MSDOS
407 # define NEED_STRCASECMP
408 # define R__BYTESWAP
409 # endif
410 #endif
411 
412 #ifdef _MSC_VER
413 # define R__VISUAL_CPLUSPLUS
414 # define NEED_STRING
415 # define NEED_STRCASECMP
416 # if _MSC_VER < 1900
417 # define NEED_SNPRINTF
418 # endif
419 # define ANSICPP
420 # define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
421 # define R__PLACEMENTDELETE /* supports overloading placement delete */
422 # define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
423 # if _MSC_VER >= 1400
424 # define DONTNEED_VSNPRINTF
425 # endif
426 # if _MSC_VER < 1310
427 # define R__NO_CLASS_TEMPLATE_SPECIALIZATION
428 # endif
429 # if _MSC_VER <= 1800
430 # define R__NO_ATOMIC_FUNCTION_POINTER
431 # endif
432 #endif
433 
434 /*--- memory and object statistics -------------------------------------------*/
435 
436 /* #define R__NOSTATS */
437 
438 /*--- cpp --------------------------------------------------------------------*/
439 
440 #ifdef ANSICPP
441  /* symbol concatenation operator */
442 # define _NAME1_(name) name
443 # define _NAME2_(name1,name2) name1##name2
444 # define _NAME3_(name1,name2,name3) name1##name2##name3
445 
446  /* stringizing */
447 # define _QUOTE_(name) #name
448 
449 #else
450 
451 # define _NAME1_(name) name
452 # define _NAME2_(name1,name2) _NAME1_(name1)name2
453 # define _NAME3_(name1,name2,name3) _NAME2_(name1,name2)name3
454 
455 # define _QUOTE_(name) "name"
456 
457 #endif
458 
459 /* produce an identifier that is almost unique inside a file */
460 #ifndef __CINT__
461 # define _R__JOIN_(X,Y) _NAME2_(X,Y)
462 # define _R__JOIN3_(F,X,Y) _NAME3_(F,X,Y)
463 # define _R__UNIQUE_DICT_(X) _R__JOIN3_(R__DICTIONARY_FILENAME,X,__LINE__)
464 # define _R__UNIQUE_(X) _R__JOIN_(X,__LINE__)
465 #else
466  /* Currently CINT does not really mind to have duplicates and */
467  /* does not work correctly as far as merging tokens is concerned. */
468 # define _R__UNIQUE_(X) X
469 #endif
470 
471 /*---- deprecation -----------------------------------------------------------*/
472 #if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
473 # if (__GNUC__ == 5 && (__GNUC_MINOR__ == 1 || __GNUC_MINOR__ == 2)) || defined(R__NO_DEPRECATION)
474 /* GCC 5.1, 5.2: false positives due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=15269
475  or deprecation turned off */
476 # define _R__DEPRECATED_LATER(REASON)
477 # else
478 # define _R__DEPRECATED_LATER(REASON) __attribute__((deprecated(REASON)))
479 # endif
480 #elif defined(_MSC_VER) || !defined(R__NO_DEPRECATION)
481 # define _R__DEPRECATED_LATER(REASON) __pragma(deprecated(REASON))
482 #else
483 /* Deprecation not supported for this compiler. */
484 # define _R__DEPRECATED_LATER(REASON)
485 #endif
486 
487 #ifdef R__WIN32
488 #define _R_DEPRECATED_REMOVE_NOW(REASON)
489 #else
490 #define _R_DEPRECATED_REMOVE_NOW(REASON) __attribute__((REMOVE_THIS_NOW))
491 #endif
492 
493 /* USE AS `R__DEPRECATED(6,28, "Not threadsafe; use TFoo::Bar().")`
494  To be removed by 6.28 */
495 #if ROOT_VERSION_CODE <= ROOT_VERSION(6,27,0)
496 # define _R__DEPRECATED_628(REASON) _R__DEPRECATED_LATER(REASON)
497 #else
498 # define _R__DEPRECATED_628(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
499 #endif
500 
501 /* USE AS `R__DEPRECATED(7,00, "Not threadsafe; use TFoo::Bar().")`
502  To be removed by 7.00 */
503 #if ROOT_VERSION_CODE < ROOT_VERSION(6,99,0)
504 # define _R__DEPRECATED_700(REASON) _R__DEPRECATED_LATER(REASON)
505 #else
506 # define _R__DEPRECATED_700(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
507 #endif
508 
509 
510 /* Spell as R__DEPRECATED(6,04, "Not threadsafe; use TFoo::Bar().") */
511 #define R__DEPRECATED(MAJOR, MINOR, REASON) \
512  _R__JOIN3_(_R__DEPRECATED_,MAJOR,MINOR)("will be removed in ROOT v" #MAJOR "." #MINOR ": " REASON)
513 
514 /* Mechanisms to advise users to avoid legacy functions and classes that will not be removed */
515 #if defined R__SUGGEST_NEW_INTERFACE
516 # define R__SUGGEST_ALTERNATIVE(ALTERNATIVE) \
517  _R__DEPRECATED_LATER("There is a superior alternative: " ALTERNATIVE)
518 #else
519 # define R__SUGGEST_ALTERNATIVE(ALTERNATIVE)
520 #endif
521 
522 #define R__ALWAYS_SUGGEST_ALTERNATIVE(ALTERNATIVE) \
523  _R__DEPRECATED_LATER("There is a superior alternative: " ALTERNATIVE)
524 
525 
526 
527 /*---- misc ------------------------------------------------------------------*/
528 
529 #ifdef R__GNU
530 # define SafeDelete(p) { if (p) { delete p; p = 0; } }
531 #else
532 # define SafeDelete(p) { delete p; p = 0; }
533 #endif
534 
535 #ifdef __FAST_MATH__
536 #define R__FAST_MATH
537 #endif
538 
539 #if (__GNUC__ >= 7)
540 #define R__DO_PRAGMA(x) _Pragma (#x)
541 # define R__INTENTIONALLY_UNINIT_BEGIN \
542  R__DO_PRAGMA(GCC diagnostic push) \
543  R__DO_PRAGMA(GCC diagnostic ignored "-Wmaybe-uninitialized") \
544  R__DO_PRAGMA(GCC diagnostic ignored "-Wuninitialized")
545 # define R__INTENTIONALLY_UNINIT_END \
546  R__DO_PRAGMA(GCC diagnostic pop)
547 #else
548 # define R__INTENTIONALLY_UNINIT_BEGIN
549 # define R__INTENTIONALLY_UNINIT_END
550 
551 #endif
552 
553 #ifdef R__HAS_ATTRIBUTE_ALWAYS_INLINE
554 #define R__ALWAYS_INLINE inline __attribute__((always_inline))
555 #else
556 #if defined(_MSC_VER)
557 #define R__ALWAYS_INLINE __forceinline
558 #else
559 #define R__ALWAYS_INLINE inline
560 #endif
561 #endif
562 
563 // See also https://nemequ.github.io/hedley/api-reference.html#HEDLEY_NEVER_INLINE
564 // for other platforms.
565 #ifdef R__HAS_ATTRIBUTE_NOINLINE
566 #define R__NEVER_INLINE inline __attribute__((noinline))
567 #else
568 #if defined(_MSC_VER)
569 #define R__NEVER_INLINE inline __declspec(noinline)
570 #else
571 #define R__NEVER_INLINE inline
572 #endif
573 #endif
574 
575 /*---- unlikely / likely expressions -----------------------------------------*/
576 // These are meant to use in cases like:
577 // if (R__unlikely(expression)) { ... }
578 // in performance-critical sections. R__unlikely / R__likely provide hints to
579 // the compiler code generation to heavily optimize one side of a conditional,
580 // causing the other branch to have a heavy performance cost.
581 //
582 // It is best to use this for conditionals that test for rare error cases or
583 // backward compatibility code.
584 
585 #if (__GNUC__ >= 3) || defined(__INTEL_COMPILER)
586 #if !defined(R__unlikely)
587  #define R__unlikely(expr) __builtin_expect(!!(expr), 0)
588 #endif
589 #if !defined(R__likely)
590  #define R__likely(expr) __builtin_expect(!!(expr), 1)
591 #endif
592 #else
593  #define R__unlikely(expr) expr
594  #define R__likely(expr) expr
595 #endif
596 
597 // Setting this define causes ROOT to keep statistics about memory buffer allocation
598 // time within the TTree. Given that this is a "hot-path", we provide a mechanism
599 // for enabling / disabling this at compile time by developers; default is disabled.
600 #ifndef R__TRACK_BASKET_ALLOC_TIME
601 //#define R__TRACK_BASKET_ALLOC_TIME 1
602 #endif
603 
604 #endif