cmake 的 check_type_size 的实现

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

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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值