昨天晚上发了一个开源项目, 本身是为了轻量化cmake工具, 功能重构, 方便后期再做功能扩展, 但是遇到一个难题, 比如 cmake 的 check_type_size 的实现, 给我的感觉是要执行程序才能输出, 如果是交叉编译, 那就不能执行了, 所以看了cmake的源码实现.
理了一下, 先说它的思路, 编译一个sizeof的demo源码,
... ...
#undef KEY
#if defined(__i386)
# define KEY '_','_','i','3','8','6'
#elif defined(__x86_64)
# define KEY '_','_','x','8','6','_','6','4'
#elif defined(__PPC64__)
# define KEY '_','_','P','P','C','6','4','_','_'
#elif defined(__ppc64__)
# define KEY '_','_','p','p','c','6','4','_','_'
#elif defined(__PPC__)
# define KEY '_','_','P','P','C','_','_'
#elif defined(__ppc__)
# define KEY '_','_','p','p','c','_','_'
#elif defined(__aarch64__)
# define KEY '_','_','a','a','r','c','h','6','4','_','_'
#elif defined(__ARM_ARCH_7A__)
# define KEY '_','_','A','R','M','_','A','R','C','H','_','7','A','_','_'
#elif defined(__ARM_ARCH_7S__)
# define KEY '_','_','A','R','M','_','A','R','C','H','_','7','S','_','_'
#endif
#define SIZE (sizeof(@type@))
static char info_size[] = {'I', 'N', 'F', 'O', ':', 's','i','z','e','[',
('0' + ((SIZE / 10000)%10)),
('0' + ((SIZE / 1000)%10)),
('0' + ((SIZE / 100)%10)),
('0' + ((SIZE / 10)%10)),
('0' + (SIZE % 10)),
']',
#ifdef KEY
' ','k','e','y','[', KEY, ']',
#endif
'\0'};
... ...
这部分编译器会在编译的过程执行 sizeof, 所以大小会变成字符串保存到bin中, 然后去找 bin 文件中的位置. 如:
然后通过正则表达式将 INFO:size[]
set(regex_size ".*INFO:size\\[0*([^]]*)\\].*") # 取到类型大小
set(regex_key " key\\[([^]]*)\\]") # 通过key 可以取到操作系统类型
真的是最高端的食材
只需要最简单的烹饪方式
, 算是打开了一个新的思路, 也供大家参考!!!