如何创建一个基于 Buck 的 C/C++项目
如何创建一个基于 Buck 的 C/C++项目
原文:https://medium.com/hackernoon/how-to-create-a-buck-based-c-c-project-38b85273d6a6

Buck 是由脸书开发的快速构建工具。选择 Buck 的理由有很多,但是应该如何入门呢?
该演练将涵盖:
- 如何组织你的项目
- Google 测试的集成
- 基本降压命令的解释
TL;速度三角形定位法(dead reckoning)
在 GitHub 上浏览项目文件,或者将它们克隆到您的系统上:
git clone [[email protected]](mailto:[email protected]):njlr/buck-cpp-example.git
从 Buckaroo.pm 安装现有的降压口。
巴克是如何工作的
在我们开始之前,了解一下 Buck 的工作原理可能会有所帮助。与其旧事重提,不如看看巴克开发者的这篇演讲。
Ludicrously Fast Builds with Buck
安装降压器
安装 Buck 的官方指南可在他们的网站上获得。然而,最快的方法可能是使用 Homebrew 或 Linuxbrew。
- 如果你使用的是 Linux,你可以在他们的网站上使用一行程序安装 Linuxbrew。
- macOS 上的自制同上。
一旦你有一个“酿造”安装,添加脸书水龙头,并安装降压:
brew tap facebook/fb
brew install --HEAD facebook/fb/buck
使用以下内容验证您的安装:
buck --version
整理您的文件
一旦安装了 Buck,就该创建项目文件夹了。Buck 使得支持你喜欢的任何文件夹结构变得容易,但是对于这个演示,我们将遵循 C/C++的惯例,使用src和include文件夹。
该项目将由两部分组成:
demo—计算3 + 4并打印结果的可执行文件mathutils—一个提供简单添加功能的库
注意:这是一个用于演示目的的简单示例;buck capable to build复杂的 C/C++项目 !
首先,在您的驱动器上创建以下结构:
.
├── .buckconfig
├── BUCK
└── demo
├── include
└── src
└── main.cpp
使用命令行:
touch .buckconfig
touch BUCKmkdir demo
mkdir demo/include
mkdir demo/src
touch demo/src/main.cpp
这是相当多的文件,让我们浏览一下:
- 在运行任何降压命令之前,需要一个
.buckconfig。它告诉 Buck 项目的根在哪里,也可以用来配置项目的全局设置。现在我们可以让它空着。 BUCK文件是我们为二进制文件定义目标的地方。在一个 Buck 项目中可以有多个BUCK文件,这在您想要为项目的不同方面(比如库和测试)分离构建逻辑时非常有用。demo/include是我们放置二进制文件使用的头的地方。demo/src是我们放置二进制文件翻译单元(这里是.cpp文件)的地方。demo/src/main.cpp将是我们应用的切入点。
主页面
首先,我们将编写一个简单的 hello-world 程序。将以下内容粘贴到main.cpp:
demo/src/main.cpp
钱
为了构建main.cpp文件,我们需要为它编写一个 Buck 目标。将以下内容粘贴到BUCK文件中:
BUCK
文件是用 Python 2 的一种方言写的,有一些扩展名。当您调用buck build时,Buck 将执行 Python 并记录定义的任何目标。一旦目标列表被解析,每个目标就根据其类型被构建。
您可以在降压文档中看到完整的目标类型列表,但是对于 C/C++来说重要的是cxx_binary、cxx_library和prebuilt_cxx_library。
cxx_binary—包含入口点的一组 C/C++翻译单元和头(例如int main())。一个cxx_binary一旦编译就可以执行。不应该是依赖。cxx_library—可以被其他目标使用的一组 C/C++翻译单元。与cxx_binary不同,一个库还定义了一个exported_headers列表,它是对其依赖者可用的头文件。prebuilt_cxx_library—像一个cxx_library,但是在翻译单元的位置有一个可选的目标文件。只有头文件的库被实现为没有目标文件的prebuilt_cxx_library。
降压命令
现在BUCK文件已经就绪,Buck 可以构建目标了。运行以下命令:
buck build //:demo
该命令告诉 Buck 构建在与.buckconfig相邻的BUCK文件中找到的目标:demo。
Buck 基于项目的实际文件夹结构,对目标使用简单的寻址系统。例如,//examples/basic/:demo是指examples/basic/BUCK中定义的目标demo。
构建完成后,您应该在buck-out/gen/demo找到一个可执行文件。您可以使用以下代码构建并运行它:
buck build //:demo && ./buck-out/gen/demo
或者,巴克可以帮你做:
buck run //:buck-cpp-example
您会注意到,第二次运行构建的速度非常快。这是因为 Buck 缓存了所有东西,包括 Python 脚本的输出!
添加依赖关系
让我们实现mathutils以便在演示应用程序中使用它。
在项目中创建以下文件夹结构:
.
└── mathutils
├── BUCK
├── include
│ └── add.hpp
└── src
└── add.cpp
使用命令行:
mkdir mathutils
mkdir mathutils/include
mkdir mathutils/srctouch mathutils/BUCK
touch mathutils/include/add.hpp
touch mathutils/src/add.cpp
和文件本身:
mathutils/add.hpp
mathutils/add.cpp
mathutils/BUCK
关于这个BUCK文件有几个要点:
- 将
header_namespace设置为'mathutils'。这会将该库导出的每个头文件放入一个同名文件夹中,从而减少与其他库发生文件名冲突的可能性。 glob规则的根在BUCK文件,所以src/**/*.cpp实际上是从项目根对应mathutils/src/**/*.cpp。- 可见性被设置为
//...,以便该目标可以被项目中的所有其他目标作为依赖项。在英语中,它的意思是“这个库对根目录下的所有其他目标都是可见的”。
使用添加功能
现在我们可以在demo可执行文件中使用mathutils库。
首先,声明demo对mathutils的依赖。将项目根目录下的BUCK文件改为:
BUCK
现在更新main.cpp到:
demo/src/main.cpp
使用 Buck 运行demo查看结果。你会注意到巴克知道如何为你连接mathutils。
谷歌测试
我们的应用程序正在工作,但是为了勤奋,我们应该添加一些单元测试!
Buck 通过buck run支持所有的 C/C++测试框架,但是它提供了与 Google Test 的额外集成。
获取 Google 测试源代码
Git 提供了一种使用子模块获取 Google 测试源代码的简单方法。我们将使用包含一个BUCK文件的fork,但是如果需要的话,您可以使用主文件并编写自己的文件。
git submodule add [email protected]:njlr/googletest.git
cd googletest/
git checkout 48072820e47a607d000b101c05d796ebf9c4aad2
cd ../
现在我们需要告诉 Buck 在哪里可以找到 Google 测试源。打开.buckconfig并添加以下内容:
.buckconfig
这告诉 Buck 在哪里可以找到可以用于测试的 Google 测试目标。还可以设置其他配置属性;浏览 Buck 文档。
编写测试
我们将把测试放在mathutils/test中,旁边是mathutils/src和mathutils/include:
.
└── mathutils
├── BUCK
├── include
│ └── add.hpp
├── src
│ └── add.cpp
└── test
├── BUCK
└── add.cpp
使用命令行:
mkdir mathutils/test
touch mathutils/test/add.cpp
测试本身:
mathutils/test/add.cpp
最后,我们需要在BUCK文件中声明测试:
mathutils/test/BUCK
现在测试可以由巴克进行了:
buck test //mathutils/test:add
或者,运行所有测试:
buck test
结论
就是这样!Buck 是一个强大的工具,它将为你节省项目开发周期中的等待时间。要了解更多信息,请阅读文档或观看一些 Buck 演示。
如果有你需要移植到 Buck 的库,看看 Buckaroo.pm 。我们已经移植了 300 个项目,并且正在进行更多的工作!



