首页 > 其他分享 >c-for-go cgo 绑定自动生成工具

c-for-go cgo 绑定自动生成工具

时间:2023-05-16 17:33:08浏览次数:45  
标签:cgo 绑定 vpx replace action https go ref

c-for-go 可以快速的生成cgo 绑定代码的工具,目前有不少golang 项目使用了此工具,比如cloudflare/ipvs 也使用了此工具

参考处理

 

参考使用

这个是libvpx 的一个项目

  • yaml 定义文件
--- 
GENERATOR:
  PackageName: vpx
  PackageDescription: "Package vpx provides Go bindings for libvpx-1.3.0, the WebM Project VP8/VP9 codec implementation."
  PackageLicense: "THE AUTOGENERATED LICENSE. ALL THE RIGHTS ARE RESERVED BY ROBOTS."
  PkgConfigOpts: [vpx]
  SysIncludes: ["vpx/vpx_encoder.h", "vpx/vpx_decoder.h", "vpx/vp8.h"]
 
PARSER:
  # /usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/include is meant for stddef.h and
  # may vary depending on platform/OS setup you are on.
  # This path is taken from my Arch Linux OS
  IncludePaths: [/usr/include, /usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/include]
  SourcesPaths: ["vpx/vpx_encoder.h", "vpx/vpx_decoder.h"]
  Defines:
    VP8_FOURCC: 0x30385056
    VP9_FOURCC: 0x30395056
    VP10_FOURCC: 0x303a5056
 
TRANSLATOR: 
  ConstRules: 
    decl: expand
    enum: cgo
  MemTips:
    - {target: _codec_stream_info, self: bind}
    - {target: _image, self: bind}
    - {target: _svc_, self: raw}
    - {target: _codec_ctx, self: raw}
  PtrTips:
    function:
      - {target: "_codec_get_cx_data$", tips: [ref,ref]}
      - {target: "_codec_decode$", tips: [ref,arr,size,ref,0]}
      - {target: "(?i)^(vpx|vp8|vp9)", tips: [ref,ref,ref,ref,ref,ref]} # defaults
  Rules: 
    global:
      - {transform: lower}
      - {action: accept, from: "(?i)^(vpx|vp8|vp9)"}
      - {action: ignore, from: "vpx_codec_control_"} # variadic
      - {action: replace, from: "^vpx_", to: _}
    function:
      - {action: replace, from: codec_error$, to: codec_get_error}
    const:
      - {action: replace, from: "VPX_SCALING_MODE", to: "VPX_SCALING_MODE_TYPE"}
    type:
      - {action: replace, from: "_t$"}
    private:
      - {transform: unexport}
    post-global: 
      - {from: _abi, transform: upper}
      - {from: "_id.?|$", transform: upper}
      - {action: replace, from: _img, to: _image}
      - {action: replace, from: _fmt, to: _format}
      - {action: replace, from: _cs, to: _color_space}
      - {action: replace, from: _$}
      - {transform: export}
      - {load: snakecase}
  • 构建
    generate 模式
 
//go:generate c-for-go -out ../ -nocgo ip_vs.yaml

cli

c-for-go -ccdefs app.yaml

说明

对于基于cgo 集成的,c-for-go 是一个很不错的工具

参考资料

https://github.com/xlab/c-for-go
https://pkg.go.dev/cmd/cgo
https://github.com/xlab/c-for-go/wiki
https://github.com/xlab/vorbis-go
https://github.com/cloudflare/ipvs
https://github.com/xlab/libvpx-go
https://github.com/xlab/c-for-go/wiki/Parser-config-section
https://github.com/xlab/c-for-go/wiki/Translator-config-section

标签:cgo,绑定,vpx,replace,action,https,go,ref
From: https://www.cnblogs.com/rongfengliang/p/17406317.html

相关文章

  • Django用递归实现查询所有子部门逻辑
    假设你已经定义好了部门模型Department,该模型包含以下字段:classDepartment(models.Model):name=models.CharField(max_length=100)parent_department=models.ForeignKey('self',on_delete=models.CASCADE,null=True,blank=True)其中,name表示部门名称,paren......
  • Golang URL query contains semicolon 报错解决方案
    ​ 报错信息http:URLquerycontainssemicolon,whichisnolongerasupportedseparator;partsofthequerymaybestrippedwhenparsed;seegolang.org/issue/25192 高版本http废除了分号做分隔符,会在http库中做报警输出,基础库代码如下:func(shserverHandle......
  • Go语言并发编程-cnblog
    并发编程并发vs并行举个形象点的例子并发可以理解为一边吃饭,一边喝水,因为人只有一个嘴一个咽喉,所以同一时刻饭和水只能有一样进入,二者只能交替进行并行可以理解为一边走路一边吃东西,因为走路是靠腿脚,吃东西是靠嘴,二者不相干,相当于两个独立的线程,因而可以同时进行Go语言......
  • python3 获取mongodb表中数据的条数
    说明:此处考虑了时区,mongodb默认使用"格林威治时间"1#!/usr/bin/python323importpymongo4importdatetime5importpytz67#统计8"""9/usr/bin/pip3install-Ivpymongo-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com......
  • mongoDB 批量将某个字段值等于另一个字段值
    将update_time字段的值设置为create_time的值:db.collection_name.find().forEach(function(item){db.collection_name.update({_id:item._id,create_time:{$exists:true}},{$set:{update_time:item.create_time}})}......
  • python3 获取mongodb表的索引
    说明:此处脚本考虑到mongodb里面数据存储的时区转换,mongodb里面的数据使用的是"格林威治"时间1#!/usr/bin/python323importpytz4frompymongoimportMongoClient56"""7/usr/bin/pip3install-Ivpytz-ihttp://pypi.douban.com/simple/--trusted-host......
  • 多个 ComboBox 控件绑定同一数据源,数据会联动(其中一个选择项改变的时候,其余也会跟着变
    问题:在Winform开发中,两个ComboBox控件绑定了同一个数据源List<T>,但是在使用的时候发现,选择其中一个ComboBox的时候,另一个也会跟着变化。原因:内存中只有一份数据,改变任何一个ComboBox都会使得数据源有所变化,导致其他ComboBox的展示效果发生联动。解决:将数据源进行复制,相当于为每......
  • Google Ajaxslt 使用
    类似插件:jquery.xslt[url]http://hyperthunk.github.io/jquery.xslt/[/url]jqueryxsltplugin:[url]http://www.jongma.org/webtools/jquery/xslt/[/url][url]http://book.51cto.com/art/200805/72637.htm[/url]a.xml<?xmlversion="1.0&quo......
  • golang 关于 Inf,-Inf,Infinity,-Infinity 等无穷大无穷小特殊字符转换问题
    记录一个比较个例的问题,某天API突然写入数据失败,原因是数据库写入长度超出,并且从日志中发现了"Infinity"这样的特殊字符串英语渣渣的我有懵,客户端发过来的数据,API都会转换为对应的数据类型,再进行数据库写入,如果是字符串,最多就转成0,怎么会长度超出万变不离其宗,肉眼看不出的问题......
  • 【设计模式】使用 go 语言实现简单工厂模式
    最近在看《大话设计模式》,这本书通过对话形式讲解设计模式的使用场景,有兴趣的可以去看一下。第一篇讲的是简单工厂模式,要求输入两个数和运算符号,得到运行结果。这个需求不难,难就难在类要怎么设计,才能达到可复用、维护性强、可拓展和灵活性高。运算符可能是加、减、乘、除,未了方......