version.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #ifndef VERSION_H
  2. #define VERSION_H
  3. #include "typedef.h"
  4. typedef int (*version_t)(int);
  5. //定义模块的版本号,由主版本号和次版本号组成
  6. //如果两个模块的主版本号相同即表示兼容
  7. #define VERSION(major, minor) (((major)<<8) | (minor))
  8. #define MAJOR(v) ((v) >> 16)
  9. #define MINOR(v) (((v) >> 8) & 0xff)
  10. #define version_match(module_a, module_b) \
  11. ({ \
  12. extern int module_a##_version(int ); \
  13. extern int module_b##_version(int ); \
  14. int version_a = module_a##_version(0); \
  15. int version_b = module_b##_version(0); \
  16. MAJOR(version_a) == MAJOR(version_b);\
  17. })
  18. #define __MODULE_VERSION_EXPORT_BEGIN(module, version) \
  19. int module##_version(int prt) \
  20. { \
  21. if (prt) { \
  22. log_i(#module": %d.%d.%d build at: %s\n", (version)>>16, \
  23. ((version) >> 8) & 0xff, (version) & 0xff, __DATE__); \
  24. } \
  25. #define __MODULE_VERSION_EXPORT_END(module, version) \
  26. return version; \
  27. } \
  28. const version_t __version_##module \
  29. __attribute__((section(".lib_version"),used)) = module##_version
  30. #define __MODULE_VERSION_EXPORT(module, version) \
  31. __MODULE_VERSION_EXPORT_BEGIN(module, version) \
  32. __MODULE_VERSION_EXPORT_END(module, version);
  33. #define __MODULE_VERSION_EXPORT_SECTION(module, version, section) \
  34. __MODULE_VERSION_EXPORT_BEGIN(module, version) \
  35. (void *)&section; \
  36. __MODULE_VERSION_EXPORT_END(module, version)
  37. #define __MODULE_DEPEND_BEGIN(module) \
  38. int module##_version_check() \
  39. { \
  40. #define _MODULE_DEPEND_BEGIN(module) \
  41. __MODULE_DEPEND_BEGIN(module)
  42. #define __VERSION_CHECK(module, version) \
  43. do { \
  44. int module##_version(int prt); \
  45. int v = module##_version(0); \
  46. if (MAJOR(version) != MAJOR(v) || MINOR(version) > MINOR(v)) { \
  47. log_i("=======version not match=======\n"); \
  48. module##_version(1); \
  49. log_i("==================================\n"); \
  50. while(1); \
  51. } \
  52. } while(0)
  53. /*-------------------上面的宏请勿调用------------------------------------*/
  54. //定义当前模块的版本检测函数
  55. #define MODULE_VERSION_EXPORT(module, version) \
  56. __MODULE_VERSION_EXPORT(module, version)
  57. #define MODULE_VERSION_EXPORT_SECTION(module, version, section) \
  58. __MODULE_VERSION_EXPORT_SECTION(module, version, section)
  59. #define MODULE_VERSION_EXPORT_BEGIN(module, version) \
  60. __MODULE_VERSION_EXPORT_BEGIN(module, version)
  61. #define MODULE_VERSION_EXPORT_END(module, version) \
  62. __MODULE_VERSION_EXPORT_END(module, version)
  63. //以下3个宏定义当前模块依赖的其它模块列表
  64. #define MODULE_DEPEND_BEGIN() \
  65. _MODULE_DEPEND_BEGIN(THIS_MODULE)
  66. #define MODULE_DEPEND(module_d, version) \
  67. __VERSION_CHECK(module_d, version)
  68. #define MODULE_DEPEND_END() \
  69. return 0; \
  70. }
  71. #define VERSION_CHECK(module, version) \
  72. __VERSION_CHECK(module, version)
  73. //通过调用版本检测函数使的模块的代码能够被链接
  74. #define load_module(module) \
  75. ({ \
  76. int ret; \
  77. extern int module##_version_check(); \
  78. ret = module##_version_check();\
  79. ret; \
  80. })
  81. extern version_t lib_version_begin[], lib_version_end[];
  82. #define lib_version_check() \
  83. do { \
  84. version_t *version; \
  85. log_i("=========version check===========\n"); \
  86. for (version = lib_version_begin; version < lib_version_end; version++) { \
  87. (*version)(1); \
  88. }; \
  89. log_i("==================================\n\n"); \
  90. } while (0)
  91. #endif