123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #ifndef VERSION_H
- #define VERSION_H
- #include "typedef.h"
- typedef int (*version_t)(int);
- //定义模块的版本号,由主版本号和次版本号组成
- //如果两个模块的主版本号相同即表示兼容
- #define VERSION(major, minor) (((major)<<8) | (minor))
- #define MAJOR(v) ((v) >> 16)
- #define MINOR(v) (((v) >> 8) & 0xff)
- #define version_match(module_a, module_b) \
- ({ \
- extern int module_a##_version(int ); \
- extern int module_b##_version(int ); \
- int version_a = module_a##_version(0); \
- int version_b = module_b##_version(0); \
- MAJOR(version_a) == MAJOR(version_b);\
- })
- #define __MODULE_VERSION_EXPORT_BEGIN(module, version) \
- int module##_version(int prt) \
- { \
- if (prt) { \
- log_i(#module": %d.%d.%d build at: %s\n", (version)>>16, \
- ((version) >> 8) & 0xff, (version) & 0xff, __DATE__); \
- } \
- #define __MODULE_VERSION_EXPORT_END(module, version) \
- return version; \
- } \
- const version_t __version_##module \
- __attribute__((section(".lib_version"),used)) = module##_version
- #define __MODULE_VERSION_EXPORT(module, version) \
- __MODULE_VERSION_EXPORT_BEGIN(module, version) \
- __MODULE_VERSION_EXPORT_END(module, version);
- #define __MODULE_VERSION_EXPORT_SECTION(module, version, section) \
- __MODULE_VERSION_EXPORT_BEGIN(module, version) \
- (void *)§ion; \
- __MODULE_VERSION_EXPORT_END(module, version)
- #define __MODULE_DEPEND_BEGIN(module) \
- int module##_version_check() \
- { \
- #define _MODULE_DEPEND_BEGIN(module) \
- __MODULE_DEPEND_BEGIN(module)
- #define __VERSION_CHECK(module, version) \
- do { \
- int module##_version(int prt); \
- int v = module##_version(0); \
- if (MAJOR(version) != MAJOR(v) || MINOR(version) > MINOR(v)) { \
- log_i("=======version not match=======\n"); \
- module##_version(1); \
- log_i("==================================\n"); \
- while(1); \
- } \
- } while(0)
- /*-------------------上面的宏请勿调用------------------------------------*/
- //定义当前模块的版本检测函数
- #define MODULE_VERSION_EXPORT(module, version) \
- __MODULE_VERSION_EXPORT(module, version)
- #define MODULE_VERSION_EXPORT_SECTION(module, version, section) \
- __MODULE_VERSION_EXPORT_SECTION(module, version, section)
- #define MODULE_VERSION_EXPORT_BEGIN(module, version) \
- __MODULE_VERSION_EXPORT_BEGIN(module, version)
- #define MODULE_VERSION_EXPORT_END(module, version) \
- __MODULE_VERSION_EXPORT_END(module, version)
- //以下3个宏定义当前模块依赖的其它模块列表
- #define MODULE_DEPEND_BEGIN() \
- _MODULE_DEPEND_BEGIN(THIS_MODULE)
- #define MODULE_DEPEND(module_d, version) \
- __VERSION_CHECK(module_d, version)
- #define MODULE_DEPEND_END() \
- return 0; \
- }
- #define VERSION_CHECK(module, version) \
- __VERSION_CHECK(module, version)
- //通过调用版本检测函数使的模块的代码能够被链接
- #define load_module(module) \
- ({ \
- int ret; \
- extern int module##_version_check(); \
- ret = module##_version_check();\
- ret; \
- })
- extern version_t lib_version_begin[], lib_version_end[];
- #define lib_version_check() \
- do { \
- version_t *version; \
- log_i("=========version check===========\n"); \
- for (version = lib_version_begin; version < lib_version_end; version++) { \
- (*version)(1); \
- }; \
- log_i("==================================\n\n"); \
- } while (0)
- #endif
|