Buck2
This repo contains the code for the Buck2 build system - the successor to the original Buck build system.
- To understand why Buck2 might be interesting, see this explainer or our introductory blog post.
- For our user-facing documentation see https://buck2.build/.
We're keen for you to give Buck2 a go and let us know any problems you run into.
Getting started
You can either download the latest buck2
binary, or build from source.
Buck2 is written in Rust, which requires rustup to compile.
You can either build buck2
from a clone of the Buck2 repo:
git clone https://github.com/facebook/buck2.git
cd buck2/
cargo install --path=app/buck2
Or alternatively install it directly from GitHub:
rustup install nightly-2023-04-23
cargo +nightly-2023-04-23 install --git https://github.com/facebook/buck2.git buck2
Build uses prebuilt protoc
binary from
protoc-bin-vendored crate.
If these binaries to do not work on your machine (for example, when building for NixOS),
path to protoc
binary and protobuf include path can be specified via
BUCK2_BUILD_PROTOC
and BUCK2_BUILD_PROTOC_INCLUDE
environment variables.
To build a project with buck2
, go to the getting started guide.
Terminology conventions
Frequently used terms and their definitions can be found in the glossary page.
Coding conventions
Beyond the obvious (well-tested, easy to read) we prefer guidelines that are automatically enforced, e.g. through Rustfmt, Clippy or the custom linter we have written. Some rules:
- Use the utilities from Gazebo where they are useful, in particular,
dupe
. - Prefer
to_owned
to convert&str
toString
. - Qualify
anyhow::Result
rather thanuse anyhow::Result
. - Most errors should be returned as
anyhow::Result
. Inspecting errors outside tests and the top-level error handler is strongly discouraged. - Most errors should be constructed with
thiserror
derivingenum
values, not rawanyhow!
. - We use the
derivative
library to derive thePartialEq
andHash
traits when some fields should be ignored. - Prefer
use crate::foo::bar
overuse super::bar
oruse crate::foo::*
, apart from test modules which often haveuse super::*
at the top. - Modules should either have submodules or types/functions/constants, but not both.
- Prefer
anyhow::Error
for checking internal invariants that are maintained between multiple files, whilepanic!
/unreachable!
are reasonable if the invariant is file-local.
Error messages
- Names (of variables, targets, files, etc) should be quoted with backticks,
e.g.
Variable `x` not defined
. - Lists should use square brackets, e.g.
Available targets: [`aa`, `bb`]
. - Error messages should start with an upper case letter. Error messages should not end with a period.
License
Buck2 is both MIT and Apache License, Version 2.0 licensed, as found in the LICENSE-MIT and LICENSE-APACHE files.