使用Buck生成单一包含的C ++头文件

本文介绍了一种使用Buck构建系统自动生成C++库的单头文件的方法,简化了用户的开发流程并提升了开发效率。

TL; DR

使用Buck来为您的库生成一个包含的头文件。 这为您的用户提供了快速开发的选项,以后可以对其进行优化。 看一下GitHub上的一个工作示例

介绍

C ++库中的一种常见模式是提供一个头文件,其中包括该库中的所有其他头文件。

例如,假设我们有一个包含以下标头的库:

要使用该库,我们需要包含我们需要的每个头文件:

另外,库设计者可以提供一个包含单个头文件,该头文件为我们完成所有这些工作:

mathutils.hpp

用户要做的就是包含该标头:

注意事项

这种方法当然更方便,但是也有一些缺点。

首先,单一包含标头可能会增加编译时间。 如果仅使用add.hpp定义,则包括所有内容将需要解析器和预处理器完成超出实际需要的工作。

其次,它掩盖了您实际依赖的标头。 例如,在检查包含图以更好地了解您的项目时,这可能会引起混乱。

因此,这是两个很大的缺点,但是如果您仍在迭代代码,则使用单包含可能是个好主意。 在确定需要哪些标题之前,为什么要优化包含内容?

实作

好的,因此,作为一名库设计人员,提供一个单头标头可能是一个好主意,但是我们如何生成一个标头呢?

Buck构建可以在这里帮助我们。 如果您不熟悉它,那么Buck是Facebook的高性能构建系统。 与其他解决方案相比,使用Buck构建的优势在于:

  • 构建是可复制的
  • 构建文物可以缓存和共享
  • Buck是跨平台的
  • 它适用于哈希,而不是时间戳,可以防止不必要的重建
  • 和更多…

Buck构建脚本是用Python编写的,因此我们可以利用Python的列表和字典功能来生成标头。 让我们开始吧…

如果您只想直接看一个可行的示例,请查看 GitHub repo

首先,我们需要获取库中的所有头文件。 Buck为此提供了一个有用的实用程序函数subdir_glob

假设此文件布局为…

还有这个脚本

…输出将是:

一旦有了标头映射,就需要将其转换为C ++标头。 这在Python中非常简单:

Python的join函数很奇怪!

然后,我们需要创建一个genrule ,是以single_header字符串,并将其写入一个文件:

最后一步是将genrule的输出作为标头包含在我们的cxx_library 。 幸运的是,Buck允许我们通过其名称来处理规则的输出,从而简化了这一过程:

但是,我们希望包括未生成的标头。 我们需要合并这两个字典。 Python没有为字典提供+运算符,但是我们可以编写一个小的函数来完成工作:

因此,我们的mathutils目标将是:

如果您构建库,则将在build文件夹中看到生成的标头:

此解决方案的最好之处在于它是自动的。 如果将.hpp文件添加到include文件夹,则Buck将自动检测到该文件,然后重新生成头文件。

既然你在这里...

我们创建了Buckaroo ,以便更轻松地集成C ++库。 如果您想尝试一下,最好的起点是文档 。 您可以浏览Buckaroo.pm上的现有软件包,或在愿望清单上请求更多

From: https://hackernoon.com/generating-a-single-include-c-header-file-using-buck-827f20be3f9d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值