Buck2 构建工具一探究竟

Buck2是Meta公司在2023年开源的多语言构建工具,旨在对2013年开源Buck进行全方面的升级改造。目前支持C/C++, Java, Go, Rust, Python, Haskell等语言项目的构建。

主要特性

  1. Buck2 的执行速度是Buck1的两倍,核心逻辑使用Rust语言编写。
  2. Buck2 支持C++,Python,Rust构建,但它的设计与语言无关。
  3. Buck2 使用Starlark来编写构建规则,这是一门基于Python增强后的语言,任何语言都可以用一套语言规则来编写构建规则。Buck1的构建规则是直接包含在核心中,Bazel则是把C++/Java都写在了核心里
  4. Buck2 支持远程执行并且是首选,本地执行也被当作一种特殊的远程执行 (这意味着可以预先计算目录哈希等内容,准备发送到远程执行,从而提高效率。)
  5. Buck2的实现是基于虚拟文件系统(virtual file systems)来的。好处是我们可以使虚拟文件系统与完整检出一样快,但具有更快检出和更低磁盘使用率的优点

关键概念

  1. 构建规则(build rule) 构建规则描述如何从一组输入文件生成输出文件。大多数构建规则特定于特定语言或平台。例如,您可以使用 cxx_binary 规则创建 C++ 二进制文件,但可以使用 android_binary 规则创建 Android APK。
  2. 构建目标(build target) 构建目标是唯一标识构建规则的字符串。它可以被认为是 Buck 项目中构建规则的 URI。
  3. 构建文件 (build file) 构建文件定义一个或多个构建规则。在 Buck 中,构建文件通常命名为 BUCKBUCK 文件类似于Make实用程序使用的Makefile。在您的项目中,每个可构建的软件单元(例如二进制文件或库)通常都有一个单独的BUCK文件。对于大型项目,您可能有数百个BUCK文件。
  4. Buck包 Buck 包包含: Buck 构建文件(BUCK 文件)、与 BUCK 文件位于同一目录或子目录中的所有文件(例如源文件和头文件),前提是这些子目录本身不包含 BUCK 文件。换句话说,BUCK 文件定义了包的根,但 Buck 包可能不包含其所有子目录,因为 Buck 包不重叠或包含其他 Buck 包。

工具链

Buck2支持多种语言,所有这些都需要一个工具链,人们可以自定义他们的专用工具链,或者使用官方的默认工具链。默认的工具链由buck2通过buck2 init命令生成,即当前目录会生成一个toolchains文件夹。

Playground

如何用Buck2来构建有Rust与C的混合项目, 下面是一个具体项目的主要步骤。

这是一个Rust二进制项目,rust主文件通过链接到C库来访问定义在c中的函数,流程大概几步

  1. 通过 cargo new my-project 创建项目
  2. 修改源码,在my-project/src 目录下新增greet.c, 并加入
#include <stdio.h>

void greet(const char *name)
{
printf("Hello, %s!\n", name);
}

my-project/src/main.rs 通过FFI让rust访问greet.c定义的greet函数

use std::ffi::CString;

extern "C" {
fn greet(name: *const std::os::raw::c_char);
} fn main() {
unsafe {
let c = "world".to_string();
let c = CString::new(c).unwrap();
greet(c.as_ptr());
}
}
  1. 编译动态库,gcc greet.c -shared -o libgreet.so
  2. my-project下新增build.rs, 并加入
fn main() {
// dynatic link against libgreet.so'
// NB: the linker actually looks for a file with a 'lib' prefix
println!("cargo::rustc-link-search=native=./src");
println!("cargo::rustc-link-lib=dylib=greet");
// This will add absolute path of the dynamic library to the rpath
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN/../../src");
}
  1. 执行cargo run, 结果输出Hello, world!

以上就是用Cargo来构建Rust/C 混合项目的主要步骤了,其主要是通过build.rs来实现rust与其他语言的构建,针对c/c++构建,社区提供了cc库简化了一些步骤。

如果Buck2来替代build.rs, 这不仅可以简化步骤,并且支持更多语言和提供更一致的构建体验

假设安装了buck2,则项目根目录执行buck2 init, 这会生成BUCK配置文件,需要通过BUCK编写规则告诉buck2怎么构建项目

  1. BUCK配置中增加
cxx_library(
name = "greet",
srcs = glob(
["src/*.c"],
)
) rust_binary(
name = "main",
srcs = glob(
["src/*.rs"],
),
deps = [":greet"],
)

在cxx_library里定一个了构建任务greet,目标是生成动态链接库lib_greet.so, 然后定义一个二进制构建任务main, 在字段deps中把前者greet作为它的依赖项。

  1. 执行 buck2 run :main 即可输出Hello, world
Starting new buck2 daemon...
Connected to new buck2 daemon.
Build ID: d3cf0117-a17d-4266-9637-c01f932afb55
Jobs completed: 76. Time elapsed: 0.9s.
Cache hits: 0%. Commands: 3 (cached: 0, remote: 0, local: 3)
BUILD SUCCEEDED
Hello, world!

总结

Buck2是一个支持多语言混合构建的集成构建工具,在某种程度上可以替代Cargo项目用来支持其他语言构建用的build.rs,让构建提供更一致的构建体验。

Rust/C/C++ 混合构建 - Buck2构建工具一探究竟的更多相关文章

  1. Maven-项目构建技术(工具)

    Maven-项目构建技术(工具) 主要的内容目标:如何创建项目.如何导入jar.如何进行其他配置.如何管理生命周期 今天的主要安排: maven的概述(为什么要用?是什么) 快速入门(配置.名词解释. ...

  2. java并发编程(7)构建自定义同步工具及条件队列

    构建自定义同步工具 一.通过轮询与休眠的方式实现简单的有界缓存 public void put(V v) throws InterruptedException { while (true) { // ...

  3. MaxCompute 助力衣二三构建智能化运营工具

    摘要:本文由衣二三CTO程异丁为大家讲解了如何基于MaxCompute构建智能化运营工具.衣二三作为亚洲最大的共享时装平台,MaxCompute是如何帮助它解决数据提取速度慢.数据口径差异等问题呢?程 ...

  4. xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  5. Jenkins环境搭建(5)-与Jmeter完成参数化构建和构建前删除操作

    此前介绍过几篇关于Jenkins配置相关的文章,今天再来说说参数化构建和构建前删除已有的报告.在实际测试过程中,是需要测试几套环境的,不使用参数化构建的话,构建脚本就比较麻烦了:自然,已生成的报告,不 ...

  6. 【Rust入门】(一)构建自己的第一个Rust项目

    安装Rust 参考文档,指定安装目录和镜像配置. rustc --version 检查是否安装成功. 构建程序 使用rustc编译运行 rustc 编译:rustc main.js 运行: Windo ...

  7. Jetstrap 在线构建 Bootstrap 的工具

    Jetstrap 是一个 100% 基于 Web 的 Twitter Bootstrap 构建工具,无需下载软件,只需登录并构建即可.并且别人可以访问你构建的产品.

  8. 【原创】如何构建MIPS交叉编译工具链

    运行环境:Ubuntu12.04PC提前安装库:flex,bison,libncureses5-dev,texinfo,这些库提前apt-get install.需要重新安装:gawk(先apt-ge ...

  9. 快速构建C++项目工具Scons,结合Editplus搭建开发环境

    Windows下C++开发工具用的最多的非VS莫属了(当然也有很多比如eclipse,Qt等等),便捷的项目构建向导,再加上强大的VC助手,使得开发和调试得心应手.并不是说vc就没有缺点,相反缺点也不 ...

  10. 前端构建和模块化工具-coolie

    [前言] 假设你之前用过前端模块化工具:seajs.requirejs. 用过前端构建工具grunt.gulp, 而且感到了一些不方便和痛苦,那么你能够试试coolie [coolie] 本文不是一篇 ...

随机推荐

  1. cmd命令行下怎么禁用和启用网络

    https://jingyan.baidu.com/article/d3b74d64b293525e76e6092a.html 执行netsh命令. interface show interface ...

  2. 学习spring cloud记录7-nacos服务分级存储模型

    前言 添加集群,级别分别为服务--集群--实例. 配置集群 可在配置文件中添加以下配置设置该服务的集群 cloud: nacos: server-addr: localhost:8848 # naco ...

  3. java 注解&含义

    简介 随着 Spring Cloud 统一 java 编程. 注解可以完成很多基础项目的配置. 有的时候看不懂注解,也就看不懂代码 Example @Service 即将类交给Spring进行管理,一 ...

  4. java中对于数组的扩充,使用了反射机制

    简介 java中对于数组的扩充,使用了反射机制 code package com; import java.lang.reflect.Array; import java.util.Arrays; p ...

  5. 成熟的前端项目后期需要做的两件事儿 关于 eslint

    简介 就是 npm run fix 修改js 错误 npm run fix:style 修改 css 错误

  6. FCC(Federal Communications Commission)授权许可及其FCC ID查询和订阅有兴趣公司的FCC批文

    FCC(Federal Communications Commission 45 L Street NE. Link . Phone: 1-888-225-5322) 美国联邦通讯委员会 An FCC ...

  7. linux 笔记 (3)

    $:符号代表一个shell变量. echo:打印输出 *:代表任意字符串 ?:代表单个字符 su:切换用户 grep:在文件中搜索字符串 ^:匹配行首 grep -n '^a' test.txt:匹配 ...

  8. [原创]《C#高级GDI+实战:从零开发一个流程图》第08章:增加菱形、平行四边形、圆角矩形,文本居中显示

    一.前言 前面的课程我们已经完成了形状和连线的抽象,并独立出了画布控件,基础已经打好,下面就要添砖加瓦了.我们本节课程就来添加一些不同的形状,如:菱形.平行四边形.圆角矩形等.而且我们前面发现形状内的 ...

  9. LangChain框架入门04:10分钟优雅接入主流大模型

    一个 AI 应用的核心就是它所依赖的大语言模型,LangChain 框架本身不内置任何大模型,但它通过定义统一的接口规范,可以将各种第三方大语言模型接入进来.本文将详细介绍如何在 LangChain ...

  10. JBOSS应用中间件

    首先:JBOSS是EJB的服务器,就像TOMCAT是JSP的服务器一样 软件名称JBoss 开发商Redhat 软件语言java 支持标准EJB 1.1.EJB 2.0.EJB3.0 JBOSS是一个 ...