构建结构

要生成gtkmm风格的API封装源代码需要使用包含在glibmm的工具,例如gmmprocgenerate_wrap_init.pl。理论上来说你可以自己编写构建文本以更好的使用它们,不过更好的选择是利用mm-common模块提供的构建基础设施。选择一个已经存在绑定的模块作为示例对于开始使用gmmproc很有帮助。

假设,我们封装了一个名为libsomething的C库。它提供了基于GObject API的具名类型,例如类型名为:SomeWidgetSomeStuff

G.1.1. 复制skeleton项目

我们封装的库名为libsomethingmm。我们可以从在mm-common模块中复制skeleton源代码树开始。自mm-common 1.0.0开始skeleton应用程序使用Meson构建系统进行构建。

  $ git clone https://gitlab.gnome.org/GNOME/mm-common.git
  $ cp -a mm-common/skeletonmm libsomethingmm

这为源.hg和.ccg文件、手写的.h和.cc文件提供了目录结构,meson.build文件可以通过各种变量指定Meson使用哪些文件进行编译。适当的重命名目录后,目录结构将如下所示:

  • libsomethingmm:顶级目录。

    • libsomething:包含主要的被包含文件(被#include的文件)和由pkg-config所需的.pc文件。

      • src:包含.hg和.ccg源文件。
      • libsomethingmm:包含手写的.h和.cc文件。

除了重命名目录外,我们还应该重命名一些源文件。例如:

$ for f in $(find libsomethingmm -depth -name '*skeleton*'); do \
    d="${f%/*}"; b="${f##*/}"; mv "$f" "$d/${b//skeleton/libsomething}"; \
  done
然后,还有些skeleton文件需要在特定项目内容完成后填写。

请注意,在配置阶段中某些变量将会替换为实际值,这将会生成与.in相同名称但不带.in后缀的文件。

生成的文件被保存在构建树中,当使用mesonninja时构建树会与源树分离。

G.1.2. 修改构建文件

现在我们修改构建文件以适应我们的需求。在这个时候你可能喜欢使用类似于regexxer这样的多文件搜索替换工具。请注意,skeleton源代码树提供的所有文件几乎都包含了占位符。因此,应该进行全局替换而不是仅对Meson文件替换。

所有提到skeleton的地方都应该替换成你想要封装的C库的名称,例如替换成"something"或"libsomething"。同样的,所有的SKELETON都应该被替换成"SOMETHING"或"LIBSOMETHING",以及所有的Skeleton都应该被替换为"Something"。

同样的,将所有的Joe Hacker替换为预期的版权所有者的名称,也就是你的名称。然后对joe@example.com邮件地址进行同样的操作。

G.1.2.1. 顶级目录中的meson.build

  • 使绑定模块的版本跟踪被封装的库的版本很常见。例如,C库版本是1.23.4,则绑定模块的初始版本为1.23.0。但是请尽量避免以偶数次要版本开始,因为这通常意味着该版本是稳定版本。
  • 如果有必要,请在project()函数中修改许可证和C++版本。
  • 你可能需要添加除glibmmskeleton(libsomething)以外的必需模块。

G.1.2.2. 其他meson.build文件

接下来我们必须对其他的meson.build文件进行修改:

  • skeleton/meson.build:在这除了全局替换以外基本上不需要做什么。

  • skeleton/skeletonmm/meson.build

    defs_basefiles

    在这添加额外的.defs和docs.xml文件

    hg_ccg_basenames

    必须在这里提及所有的.hg.ccg

    extra_cc_files, extra_h_files

    所有手写的.h.cc源文件都需要写在这。

G.1.2.3. 创建.hg个.ccg文件

现在我们应该创建第一个.hg.ccg,用以对一个C库中的对象进行封装。存在一对可供参考的示例源文件:skeleton.ccgskeleton.hg。请根据需要创建这些文件的副本。

.hg和.ccg文件小节你可以学到这些文件使用的语法。