tvl-depot/tools/cheddar/build.rs
Vincent Ambo 5e6685c689 feat(cheddar): Add a build script that injects BAT_SYNTAXES
The BAT_SYNTAXES environment variable is injected during Nix builds
and points to the build result of //third_party/bat_syntaxes, which is
included in the cheddar binary.

During development this is a bit annoying: Opening a Nix shell will
set the right variable, but it will also mess with the Cargo
environment in ways that make it annoying to use (*and* require a
pre-build of all dependencies as required by naersk).

For an easier development flow, this adds a build script that
automatically runs Nix, fetches the path to the syntax set and sets
the environment variable. It is a no-op if the variable is already
set.

This makes for a smoother development experience when working on
cheddar in a depot checkout.

Change-Id: Ib5435518897e3443247edd9f362821c0b9ff756b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3081
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
2021-05-03 20:18:33 +00:00

50 lines
1.7 KiB
Rust

//! Build script that can be used outside of Nix builds to inject the
//! BAT_SYNTAXES variable when building in development mode.
//!
//! Note that this script assumes that cheddar is in a checkout of the
//! TVL depot.
use std::process::Command;
static BAT_SYNTAXES: &str = "BAT_SYNTAXES";
static ERROR_MESSAGE: &str = r#"Failed to build syntax set.
When building during development, cheddar expects to be in a checkout
of the TVL depot. This is required to automatically build the syntax
highlighting files that are needed at compile time.
As cheddar can not automatically detect the location of the syntax
files, you must set the `BAT_SYNTAXES` environment variable to the
right path.
The expected syntax files are at //third_party/bat_syntaxes in the
depot."#;
fn main() {
// Do nothing if the variable is already set (e.g. via Nix)
if let Ok(_) = std::env::var(BAT_SYNTAXES) {
return;
}
// Otherwise ask Nix to build it and inject the result.
let output = Command::new("nix-build")
.arg("-A").arg("third_party.bat_syntaxes")
// ... assuming cheddar is at //tools/cheddar ...
.arg("../..")
.output()
.expect(ERROR_MESSAGE);
if !output.status.success() {
eprintln!("{}\nNix output: {}", ERROR_MESSAGE, String::from_utf8_lossy(&output.stderr));
return;
}
let out_path = String::from_utf8(output.stdout)
.expect("Nix returned invalid output after building syntax set");
// Return an instruction to Cargo that will set the environment
// variale during rustc calls.
//
// https://doc.rust-lang.org/cargo/reference/build-scripts.html#cargorustc-envvarvalue
println!("cargo:rustc-env={}={}", BAT_SYNTAXES, out_path.trim());
}