ver.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. *******************************************************************************
  3. \file ver.c
  4. \brief Version and build information
  5. \project bee2/cmd
  6. \created 2022.06.22
  7. \version 2024.01.25
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include "../cmd.h"
  13. #include <bee2/core/util.h>
  14. #include <stdio.h>
  15. /*
  16. *******************************************************************************
  17. Утилита ver
  18. Функционал:
  19. - печать версии Bee2 и даты сборки;
  20. - печать информации о платформе;
  21. - печать информации об инструментах сборки;
  22. - печать опций сборки.
  23. *******************************************************************************
  24. */
  25. static const char _name[] = "ver";
  26. static const char _descr[] = "print version and build information";
  27. static int verUsage()
  28. {
  29. printf(
  30. "bee2cmd/%s: %s\n"
  31. "Usage:\n"
  32. " ver\n"
  33. " print version and build information\n"
  34. ,
  35. _name, _descr
  36. );
  37. return -1;
  38. }
  39. /*
  40. *******************************************************************************
  41. Печать информации
  42. \thanks https://blog.kowalczyk.info/article/j/
  43. guide-to-predefined-macros-in-c-compilers-gcc-clang-msvc-etc..html
  44. \warning Порядок проверки директив в функции verCompiler() важен:
  45. - Clang кроме __clang__ может определять также
  46. __GNUC__ / __GNUC_MINOR__ / __GNUC_PATCHLEVEL__, указывая
  47. тем самым на версию GCC, с которой обеспечивается совместимость
  48. (см. https://stackoverflow.com/questions/38499462/
  49. how-to-tell-clang-to-stop-pretending-to-be-other-compilers);
  50. - Clang кроме __clang__ может определять также _MSC_VER;
  51. - MinGW64 кроме __MINGW64__ определяет также __MINGW32__;
  52. - MinGW32 и MinGW64 определяют __GNUC__.
  53. \todo Emscripten:
  54. \code
  55. #elif defined(__EMSCRIPTEN__)
  56. sprintf(str, "emscripten (%d.%d)",
  57. __EMSCRIPTEN_major__, __EMSCRIPTEN_minor__);
  58. \endcode
  59. *******************************************************************************
  60. */
  61. static const char* verOS()
  62. {
  63. #if defined(OS_WIN)
  64. return "Windows";
  65. #elif defined(OS_UNIX)
  66. #if defined(OS_LINUX)
  67. return "Linux";
  68. #elif defined(OS_APPLE)
  69. return "Apple";
  70. #else
  71. return "UNIX";
  72. #endif
  73. #else
  74. return "unknown";
  75. #endif
  76. }
  77. static const char* verEndianness()
  78. {
  79. #if defined(LITTLE_ENDIAN)
  80. return "LE";
  81. #else
  82. return "BE";
  83. #endif
  84. }
  85. static const char* verCompiler()
  86. {
  87. static char str[128];
  88. #if defined(__clang__)
  89. #if defined(_MSC_VER)
  90. sprintf(str,
  91. "clang (%d.%d.%d)\n"
  92. " compatibility: Visual Studio (%d)",
  93. __clang_major__, __clang_minor__, __clang_patchlevel__,
  94. _MSC_FULL_VER);
  95. #elif defined(__GNUC__)
  96. sprintf(str,
  97. "clang (%d.%d.%d)\n"
  98. " compatibility: gcc (%d.%d.%d)",
  99. __clang_major__, __clang_minor__, __clang_patchlevel__,
  100. __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
  101. #else
  102. sprintf(str,
  103. "clang (%d.%d.%d)\n",
  104. __clang_major__, __clang_minor__, __clang_patchlevel__);
  105. #endif
  106. #elif defined(_MSC_VER)
  107. sprintf(str,
  108. "Visual Studio (%d)", _MSC_FULL_VER);
  109. #elif defined(__MINGW64__)
  110. sprintf(str,
  111. "MinGW64 (%d.%d)\n"
  112. " using: gcc (%d.%d.%d)",
  113. __MINGW64_VERSION_MAJOR, __MINGW64_VERSION_MINOR,
  114. __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
  115. #elif defined(__MINGW32__)
  116. sprintf(str,
  117. "MinGW32 (%d.%d)\n"
  118. " using: gcc (%d.%d.%d)",
  119. __MINGW64_VERSION_MAJOR, __MINGW64_VERSION_MINOR,
  120. __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
  121. #elif defined(__GNUC__)
  122. sprintf(str,
  123. "gcc (%d.%d.%d)",
  124. __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
  125. #else
  126. return "unknown";
  127. #endif
  128. return str;
  129. }
  130. static const char* verNDebug()
  131. {
  132. #ifdef NDEBUG
  133. return "ON";
  134. #else
  135. return "OFF";
  136. #endif
  137. }
  138. static const char* verSafe()
  139. {
  140. #ifdef SAFE_FAST
  141. return "OFF";
  142. #else
  143. return "ON";
  144. #endif
  145. }
  146. /*
  147. *******************************************************************************
  148. Печать информации
  149. *******************************************************************************
  150. */
  151. extern const char bash_platform[];
  152. static void verPrint()
  153. {
  154. printf(
  155. "Bee2: a cryptographic library\n"
  156. " version: %s [%s]\n"
  157. " platform:\n"
  158. " os: %s\n"
  159. " B_PER_S: %u\n"
  160. " B_PER_W: %u\n"
  161. " endianness: %s\n"
  162. " build tools:\n"
  163. " compiler: %s\n"
  164. " build options:\n"
  165. " NDEBUG: %s\n"
  166. " safe (constant-time): %s\n"
  167. " bash_platform: %s\n",
  168. utilVersion(), __DATE__,
  169. verOS(),
  170. (unsigned)B_PER_S,
  171. (unsigned)B_PER_W,
  172. verEndianness(),
  173. verCompiler(),
  174. verNDebug(),
  175. verSafe(),
  176. bash_platform
  177. );
  178. }
  179. /*
  180. *******************************************************************************
  181. Главная функция
  182. *******************************************************************************
  183. */
  184. int verMain(int argc, char* argv[])
  185. {
  186. if (argc != 1)
  187. return verUsage();
  188. verPrint();
  189. return 0;
  190. }
  191. /*
  192. *******************************************************************************
  193. Инициализация
  194. *******************************************************************************
  195. */
  196. err_t verInit()
  197. {
  198. return cmdReg(_name, _descr, verMain);
  199. }