NOTE: This repository is extremely experimental and may change radically. You probably don't want to be here unless you talk to me. Please see issue #1 for some design notes and feel free to provide input.
An experiment to integrate Buck2, Sapling, and Nix together in a harmonious way. Because this uses a pre-release Buck as well as our own Buck prelude to integrate with Nix, we're on our own.
You MUST have direnv installed. Everything else — including the
correct tool versions — will be populated in your shell by direnv
automatically when you move here.
There are some design notes in the buck/
directory. This is an experiment.
Nothing is stable and everything is permitted. Do not taunt happy fun ball.
direnv
installed into your shell- nix 2.14.0 or newer
trusted-users
includes your$USER
direnv
will warn you if either 2 or 3 are not satisfied when you move into
this directory. See .envrc for details. The automated setup tool
also warns you about these facts.
Experiment: what if we used nix run
as an "setup tool" to setup direnv
and nix
's configuration? In other words, use it to bootstrap the development
environment? And what if I wrote it in Rust to learn more of it?
Run this command from your $HOME
(or any directory, but it won't touch the
current working dir):
nix run \
--tarball-ttl 0 \
--accept-flake-config \
'github:thoughtpolice/buck2-nix?dir=buck/nix#setup'
This tool will set up everything to build this repository correctly, and (by
default) clone a copy of the source code for you, under $HOME
. I hope. The
goal is that Nix along with the above command should be able to completely
bootstrap your working environment. If it doesn't work, please
let me know. Check out the source code under
./buck/nix/setup/
Assuming the setup tool worked with the default configuration to clone under
$HOME
:
cd $HOME/buck2-nix.sl
This will activate direnv
automatically — assuming nothing exploded
— and buck --version
should now work. This early "bootstrap phase" is
intended to be as lightweight as possible, with the minimal tooling needed for
everything else to work; so only buck
and other critical tools are installed
into your shell environment at this point.
Now, build whole repo. The build is automatically configured (via flake configuration) to use my upstream binary cache — this is why you being a trusted user is so strongly emphasized, so it's fully automatic — to download all tools needed on demand.
buck build ... # equivalent to root//...
Much like how Nix works, in this design, Buck only commands Nix to downloads
things as they're needed; e.g. rust-stable
will only be downloaded through
nix build
the moment it's needed for a Buck rule, and a target using that rule
was demanded. So if you only build one component of the repository, only a small
subset of Nix paths are downloaded. This "lazy" design is a distinct difference
from a typical direnv
setup with Nix Flakes, which are "eager" to put things
in your shell environment immediately.
And so, the very first time you run this, you'll see many Nix paths downloading into your store from the binary cache.
Now, clean buck-out/
, then kill the buck2d
daemon
buck clean
You can finally move out of the directory, and buck
will go away:
cd $HOME