cmake 的 check_type_size 的实现

发布时间:2024年01月23日

昨天晚上发了一个开源项目, 本身是为了轻量化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 可以取到操作系统类型

真的是最高端的食材只需要最简单的烹饪方式, 算是打开了一个新的思路, 也供大家参考!!!

文章来源:https://blog.csdn.net/u012939880/article/details/135767327
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。