生成.defs文件

.defs是一种使用lisp格式的文本文件,它描述了C库的API,其中包括了以下内容:

  • 对象(GObjects、部件、接口、装箱类型、普通结构体)
  • 函数
  • 枚举
  • 信号
  • 属性
  • 虚函数(vfuncs)

目前我们有一些单独的工具用于生成.defs文件的一部分,因此我们将它们拆分为单独的文件,例如在gtkmm源的gtk/src目录中你将看到以下文件:

gtk.defs

包含其他文件。

gtk_methods.defs

对象和函数。

gtk_enums.defs

枚举。

gtk_signals.defs

信号和属性。

gtk_vfuncs.defs

虚函数(结构体中的函数指针字段),手动编写。

skeletonmm/tools/generate_defs_and_docs.sh将生成所有的这些.defs以及*_docs.xml文件,如该小节的文档所述。

G.2.1. 生成_methods.defs文件

这个.defs文件描述了对象及其函数。它是由h2def.py脚本生成的,你可以在glibmm的tools/defs_gen文件夹中找到该脚本。例如:

$ ./h2def.py /usr/include/gtk-4.0/gtk/*.h > gtk_methods.defs

G.2.2. 生成_enums.defs文件

这个.defs文件描述了枚举类型及其可能的值。它是由enum.pl脚本生成的,你可以在glibmm的tools文件夹中找到该脚本。例如:

$ ./enum.pl /usr/include/gtk-4.0/gtk/*.h > gtk_enums.defs

G.2.3. 生成_signals.defs文件

这个.defs文件描述了信号和属性。它是由封装项目自有的generate_extra_defs实用程序生成的,你可以在类似于gtkmm/tools/extra_defs_gen/的目录下找到它。例如:

$ cd tools/extra_defs_gen
$ ./generate_extra_defs > gtk_signals.defs

你必须编辑自己的generate_extra_defs工具的源代码才能为需要封装的GObject C类型生成.defs文件。在skeleton源代码树中,源文件名为tools/extra_defs_gen/generate_defs_skeleton.cc。你需要将文件重命名为正确的文件名(按前一小节所述),然后在tools/extra_defs_gen/meson.build文件中提到新的源文件名。

然后编辑.cc以指定正确的类型。例如,你的main()函数可能如下所示:

#include <glibmm_generate_extra_defs/generate_extra_defs.h>
#include <libsomething.h>
#include <iostream>

int main(int, char**)
{
  something_init();

  std::cout << get_defs(SOME_TYPE_WIDGET)
            << get_defs(SOME_TYPE_STUFF);
  return 0;
}

G.2.4. 编写_vfunc.defs文件

.defs文件描述了虚函数(vfuncs)。它必须手写。你可以从skeleton/src/skeleton_vfunc.defs文件开始进行修改。你也可以从gtkmmgtk/src/gtk_vfuncs.defs文件开始。