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>
This commit is contained in:
parent
d311af9bc0
commit
5e6685c689
1 changed files with 50 additions and 0 deletions
50
tools/cheddar/build.rs
Normal file
50
tools/cheddar/build.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
//! 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());
|
||||||
|
}
|
Loading…
Reference in a new issue