Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
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
393#ifdef __SC__
394# define SC
395# define R__SC
396# if defined(WIN32)
397# define NEED_STRING
398# define NEED_STRCASECMP
399# define NEED_SNPRINTF
400# define ANSICPP
401# else
402# define MSDOS
403# define NEED_STRCASECMP
404# define R__BYTESWAP
405# endif
406#endif
407
408#ifdef _MSC_VER
409# define R__VISUAL_CPLUSPLUS
410# define NEED_STRING
411# define NEED_STRCASECMP
412# if _MSC_VER < 1900
413# define NEED_SNPRINTF
414# endif
415# define ANSICPP
416# define R__VECNEWDELETE /* supports overloading of new[] and delete[] */
417# define R__PLACEMENTDELETE /* supports overloading placement delete */
418# define R__PLACEMENTINLINE /* placement new/delete is inline in <new> */
419# if _MSC_VER >= 1400
420# define DONTNEED_VSNPRINTF
421# endif
422# if _MSC_VER < 1310
423# define R__NO_CLASS_TEMPLATE_SPECIALIZATION
424# endif
425# if _MSC_VER <= 1800
426# define R__NO_ATOMIC_FUNCTION_POINTER
427# endif
428#endif
429
430/*--- memory and object statistics -------------------------------------------*/
431
432/* #define R__NOSTATS */
433
434/*--- cpp --------------------------------------------------------------------*/
435
436#ifdef ANSICPP
437 /* symbol concatenation operator */
438# define _NAME1_(name) name
439# define _NAME2_(name1,name2) name1##name2
440# define _NAME3_(name1,name2,name3) name1##name2##name3
441
442 /* stringizing */
443# define _QUOTE_(name) #name
444
445#else
446
447# define _NAME1_(name) name
448# define _NAME2_(name1,name2) _NAME1_(name1)name2
449# define _NAME3_(name1,name2,name3) _NAME2_(name1,name2)name3
450
451# define _QUOTE_(name) "name"
452
453#endif
454
455/* produce an identifier that is almost unique inside a file */
456#ifndef __CINT__
457# define _R__JOIN_(X,Y) _NAME2_(X,Y)
458# define _R__JOIN3_(F,X,Y) _NAME3_(F,X,Y)
459# define _R__UNIQUE_DICT_(X) _R__JOIN3_(R__DICTIONARY_FILENAME,X,__LINE__)
460# define _R__UNIQUE_(X) _R__JOIN_(X,__LINE__)
461#else
462 /* Currently CINT does not really mind to have duplicates and */
463 /* does not work correctly as far as merging tokens is concerned. */
464# define _R__UNIQUE_(X) X
465#endif
466
467/*---- deprecation -----------------------------------------------------------*/
468#if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
469# if (__GNUC__ == 5 && (__GNUC_MINOR__ == 1 || __GNUC_MINOR__ == 2)) || defined(R__NO_DEPRECATION)
470/* GCC 5.1, 5.2: false positives due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=15269
471 or deprecation turned off */
472# define _R__DEPRECATED_LATER(REASON)
473# else
474# define _R__DEPRECATED_LATER(REASON) __attribute__((deprecated(REASON)))
475# endif
476#elif defined(_MSC_VER) || !defined(R__NO_DEPRECATION)
477# define _R__DEPRECATED_LATER(REASON) __pragma(deprecated(REASON))
478#else
479/* Deprecation not supported for this compiler. */
480# define _R__DEPRECATED_LATER(REASON)
481#endif
482
483#ifdef R__WIN32
484#define _R_DEPRECATED_REMOVE_NOW(REASON)
485#else
486#define _R_DEPRECATED_REMOVE_NOW(REASON) __attribute__((REMOVE_THIS_NOW))
487#endif
488
489/* To be removed by 6.20 */
490#if ROOT_VERSION_CODE < ROOT_VERSION(6,19,0)
491# define _R__DEPRECATED_620(REASON) _R__DEPRECATED_LATER(REASON)
492#else
493# define _R__DEPRECATED_620(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
494#endif
495
496/* To be removed by 6.22 */
497#if ROOT_VERSION_CODE < ROOT_VERSION(6,21,0)
498# define _R__DEPRECATED_622(REASON) _R__DEPRECATED_LATER(REASON)
499#else
500# define _R__DEPRECATED_622(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
501#endif
502
503/* To be removed by 6.24 */
504#if ROOT_VERSION_CODE <= ROOT_VERSION(6,23,0)
505# define _R__DEPRECATED_624(REASON) _R__DEPRECATED_LATER(REASON)
506#else
507# define _R__DEPRECATED_624(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
508#endif
509
510/* To be removed by 6.26 */
511#if ROOT_VERSION_CODE <= ROOT_VERSION(6,25,0)
512# define _R__DEPRECATED_626(REASON) _R__DEPRECATED_LATER(REASON)
513#else
514# define _R__DEPRECATED_626(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
515#endif
516
517/* To be removed by 7.00 */
518#if ROOT_VERSION_CODE < ROOT_VERSION(6,99,0)
519# define _R__DEPRECATED_700(REASON) _R__DEPRECATED_LATER(REASON)
520#else
521# define _R__DEPRECATED_700(REASON) _R_DEPRECATED_REMOVE_NOW(REASON)
522#endif
523
524
525/* Spell as R__DEPRECATED(6,04, "Not threadsafe; use TFoo::Bar().") */
526#define R__DEPRECATED(MAJOR, MINOR, REASON) \
527 _R__JOIN3_(_R__DEPRECATED_,MAJOR,MINOR)("will be removed in ROOT v" #MAJOR "." #MINOR ": " REASON)
528
529/* Mechanisms to advise users to avoid legacy functions and classes that will not be removed */
530#if defined R__SUGGEST_NEW_INTERFACE
531# define R__SUGGEST_ALTERNATIVE(ALTERNATIVE) \
532 _R__DEPRECATED_LATER("There is a superior alternative: " ALTERNATIVE)
533#else
534# define R__SUGGEST_ALTERNATIVE(ALTERNATIVE)
535#endif
536
537#define R__ALWAYS_SUGGEST_ALTERNATIVE(ALTERNATIVE) \
538 _R__DEPRECATED_LATER("There is a superior alternative: " ALTERNATIVE)
539
540
541
542/*---- misc ------------------------------------------------------------------*/
543
544#ifdef R__GNU
545# define SafeDelete(p) { if (p) { delete p; p = 0; } }
546#else
547# define SafeDelete(p) { delete p; p = 0; }
548#endif
549
550#ifdef __FAST_MATH__
551#define R__FAST_MATH
552#endif
553
554#if (__GNUC__ >= 7)
555#define R__DO_PRAGMA(x) _Pragma (#x)
556# define R__INTENTIONALLY_UNINIT_BEGIN \
557 R__DO_PRAGMA(GCC diagnostic push) \
558 R__DO_PRAGMA(GCC diagnostic ignored "-Wmaybe-uninitialized") \
559 R__DO_PRAGMA(GCC diagnostic ignored "-Wuninitialized")
560# define R__INTENTIONALLY_UNINIT_END \
561 R__DO_PRAGMA(GCC diagnostic pop)
562#else
563# define R__INTENTIONALLY_UNINIT_BEGIN
564# define R__INTENTIONALLY_UNINIT_END
565
566#endif
567
568#ifdef R__HAS_ATTRIBUTE_ALWAYS_INLINE
569#define R__ALWAYS_INLINE inline __attribute__((always_inline))
570#else
571#if defined(_MSC_VER)
572#define R__ALWAYS_INLINE __forceinline
573#else
574#define R__ALWAYS_INLINE inline
575#endif
576#endif
577
578// See also https://nemequ.github.io/hedley/api-reference.html#HEDLEY_NEVER_INLINE
579// for other platforms.
580#ifdef R__HAS_ATTRIBUTE_NOINLINE
581#define R__NEVER_INLINE inline __attribute__((noinline))
582#else
583#if defined(_MSC_VER)
584#define R__NEVER_INLINE inline __declspec(noinline)
585#else
586#define R__NEVER_INLINE inline
587#endif
588#endif
589
590/*---- unlikely / likely expressions -----------------------------------------*/
591// These are meant to use in cases like:
592// if (R__unlikely(expression)) { ... }
593// in performance-critical sections. R__unlikely / R__likely provide hints to
594// the compiler code generation to heavily optimize one side of a conditional,
595// causing the other branch to have a heavy performance cost.
596//
597// It is best to use this for conditionals that test for rare error cases or
598// backward compatibility code.
599
600#if (__GNUC__ >= 3) || defined(__INTEL_COMPILER)
601#if !defined(R__unlikely)
602 #define R__unlikely(expr) __builtin_expect(!!(expr), 0)
603#endif
604#if !defined(R__likely)
605 #define R__likely(expr) __builtin_expect(!!(expr), 1)
606#endif
607#else
608 #define R__unlikely(expr) expr
609 #define R__likely(expr) expr
610#endif
611
612// Setting this define causes ROOT to keep statistics about memory buffer allocation
613// time within the TTree. Given that this is a "hot-path", we provide a mechanism
614// for enabling / disabling this at compile time by developers; default is disabled.
615#ifndef R__TRACK_BASKET_ALLOC_TIME
616//#define R__TRACK_BASKET_ALLOC_TIME 1
617#endif
618
619#endif