config.hpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /* Configuration macros.
  2. This file is part of khipu.
  3. khipu is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <https://www.gnu.org/licenses/>. */
  13. #ifndef __KP_CONFIG__
  14. #define __KP_CONFIG__ 1
  15. // Platform detection.
  16. #if defined (sun) || defined (__sun)
  17. # define KP_PLATFORM_SOLARIS
  18. # define KP_KNOWN_PLATFORM
  19. #elif defined (_hpux) || defined (__hpux)
  20. # define KP_PLATFORM_HPUX
  21. # define KP_KNOWN_PLATFORM
  22. #elif defined (__GNU__) || defined (__gnu_hurd__)
  23. # define KP_PLATFORM_GNU
  24. # define KP_KNOWN_PLATFORM
  25. #elif defined (linux) || defined (__linux) || defined (__linux__)
  26. # define KP_PLATFORM_LINUX
  27. # define KP_KNOWN_PLATFORM
  28. #elif defined (__OS2__) || defined (__EMX__)
  29. # define KP_PLATFORM_OS2
  30. # define KP_KNOWN_PLATFORM
  31. #elif defined (__NetBSD__)
  32. # define KP_PLATFORM_NETBSD
  33. # define KP_KNOWN_PLATFORM
  34. #elif defined (__OpenBSD__)
  35. # define KP_PLATFORM_OPENBSD
  36. # define KP_KNOWN_PLATFORM
  37. #elif defined (__FreeBSD__) || defined (__DragonFly__)
  38. # define KP_PLATFORM_FREEBSD
  39. # define KP_KNOWN_PLATFORM
  40. #elif defined (macintosh) || defined (__APPLE__)
  41. # define KP_PLATFORM_MAC
  42. # define KP_KNOWN_PLATFORM
  43. #elif defined (__BEOS__) || defined (__HAIKU__)
  44. # define KP_PLATFORM_BEOS
  45. # define KP_KNOWN_PLATFORM
  46. #elif defined (__CYGWIN__)
  47. # define KP_PLATFORM_WINDOWS
  48. # define KP_KNOWN_PLATFORM
  49. #elif defined (__MINGW32__)
  50. # define KP_PLATFORM_WINDOWS
  51. # define KP_KNOWN_PLATFORM
  52. #elif defined (_WIN32) || defined (__WIN32__) || \
  53. defined (_WIN64) || defined (_WIN32_WCE)
  54. # define KP_PLATFORM_WINDOWS
  55. # define KP_KNOWN_PLATFORM
  56. #endif
  57. #ifndef KP_KNOWN_PLATFORM
  58. # error "Unsupported platform!"
  59. #endif
  60. // Architecture detection.
  61. #if defined (__alpha__) || defined (_M_ALPHA) || defined (__alpha)
  62. # define KP_ARCH_ALPHA
  63. # define KP_KNOWN_ARCH
  64. #elif defined (__amd64) || defined (__amd64__) || \
  65. defined (__x86_64__) || defined (__x86_64) || \
  66. defined (_M_X64) || defined (_M_AMD64)
  67. # define KP_ARCH_X8664
  68. # define KP_KNOWN_ARCH
  69. #elif defined (__aarch64__)
  70. # define KP_ARCH_ARM64
  71. # define KP_KNOWN_ARCH
  72. #elif defined (__arm__) || defined (__thumb__) || \
  73. defined (_M_ARM) || defined (_M_ARMT)
  74. # define KP_ARCH_ARM32
  75. # define KP_KNOWN_ARCH
  76. #elif defined (__i386) || defined (__i386__) || defined (_M_IX86) || \
  77. defined (__X86__) || defined (_X86_) || defined (__INTEL__)
  78. # define KP_ARCH_I386
  79. # define KP_KNOWN_ARCH
  80. #elif defined (__ia64__) || defined (__ia64) || \
  81. defined (_M_IA64) || defined (__itanium__)
  82. # define KP_ARCH_IA64
  83. # define KP_KNOWN_ARCH
  84. #elif defined (__mips) || defined (__mips__) || defined (__MIPS__)
  85. # define KP_ARCH_MIPS
  86. # define KP_KNOWN_ARCH
  87. #elif defined (__powerpc64__) || defined (__ppc64__)
  88. # define KP_ARCH_PPC64
  89. # define KP_KNOWN_ARCH
  90. #elif defined (__powerpc) || defined (__ppc__) || defined (_M_PPC)
  91. # define KP_ARCH_PPC32
  92. # define KP_KNOWN_ARCH
  93. #elif defined (__sparc) || defined (__sparc__)
  94. # define KP_ARCH_SPARC
  95. # define KP_KNOWN_ARCH
  96. #endif
  97. #ifndef KP_KNOWN_ARCH
  98. # error "Unsupported architecture!"
  99. #endif
  100. #ifdef __clang__
  101. # if defined (__has_include) && __has_include (<endian.h>)
  102. # define KP_HAS_ENDIAN_H
  103. # endif
  104. #endif
  105. // Endianness detection.
  106. # if defined (__BYTE_ORDER__)
  107. # if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  108. # define KP_LITTLE_ENDIAN 1
  109. # else
  110. # define KP_LITTLE_ENDIAN 0
  111. # endif
  112. #elif defined (__GLIBC__) || defined (KP_HAS_ENDIAN_H)
  113. #include <endian.h>
  114. # if __BYTE_ORDER == __LITTLE_ENDIAN
  115. # define KP_LITTLE_ENDIAN 1
  116. # elif __BYTE_ORDER == __BIG_ENDIAN
  117. # define KP_LITTLE_ENDIAN 0
  118. # else
  119. # error "Unsupported endianness!"
  120. # endif
  121. #else
  122. # if defined (__BIG_ENDIAN__) || defined (__ARMEB__) || \
  123. defined (__THUMBEB__) || defined (__AARCH64EB__) || \
  124. defined (_MIPSEB) || defined (__MIPSEB) || defined (__MIPSEB__)
  125. # define KP_LITTLE_ENDIAN 0
  126. # elif defined (__LITTLE_ENDIAN__) || defined (__ARMEL__) || \
  127. defined (__THUMBEL__) || defined (__AARCH64EL__) || \
  128. defined (_MIPSEL) || defined (__MIPSEL) || defined (__MIPSEL__)
  129. # define KP_LITTLE_ENDIAN 1
  130. # endif
  131. #endif
  132. #undef KP_HAS_ENDIAN_H
  133. // Determine endianness 'empirically'.
  134. #ifndef KP_LITTLE_ENDIAN
  135. # if defined (KP_ARCH_MIPS) || defined (KP_ARCH_SPARC)
  136. # define KP_LITTLE_ENDIAN 0
  137. # elif defined (KP_ARCH_I386) || defined (KP_ARCH_X8664) || \
  138. defined (KP_ARCH_ALPHA) || defined (KP_ARCH_ARM32) || \
  139. defined (KP_ARCH_ARM64)
  140. # define KP_LITTLE_ENDIAN 1
  141. # endif
  142. #endif
  143. #ifndef KP_LITTLE_ENDIAN
  144. # error "Cannot determine endianness!"
  145. #endif
  146. #if defined (__unix) || defined (__unix__) || defined (unix)
  147. # define KP_PLATFORM_UNIX
  148. #endif
  149. #if defined (KP_PLATFORM_FREEBSD) || \
  150. defined (KP_PLATFORM_OPENBSD) || \
  151. defined (KP_PLATFORM_NETBSD)
  152. # define KP_PLATFORM_BSD
  153. #endif
  154. // Finally, determine if we're on a 64-bit platform.
  155. #if defined (KP_ARCH_IA64) || defined (KP_ARCH_X8664) || \
  156. defined (KP_ARCH_ALPHA) || (defined (KP_ARCH_MIPS) && \
  157. (_MIPS_SZLONG - 0) == 64) || \
  158. defined (KP_ARCH_PPC64) || defined (KP_ARCH_ARM64) || \
  159. (defined (KP_ARCH_SPARC) && defined (__arch64__))
  160. # define KP_ARCH_WIDE
  161. #endif
  162. // Adjust for x32.
  163. #if defined (KP_ARCH_X8664) && defined (_ILP32) || defined (__ILP32__)
  164. # undef KP_ARCH_X8664
  165. # define KP_ARCH_X32
  166. # undef KP_ARCH_WIDE
  167. #endif
  168. #define KP_EXPORT extern
  169. #endif