tvl-depot/tools/cheddar/build.rs
sterni c8ecea1032 docs(cheddar): fix typo in build.rs comment
Change-Id: Id323b4a187b3837d60ac6b8917f3e8571954b8e6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3119
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
2021-05-12 15:38:57 +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
// variable during rustc calls.
//
// https://doc.rust-lang.org/cargo/reference/build-scripts.html#cargorustc-envvarvalue
println!("cargo:rustc-env={}={}", BAT_SYNTAXES, out_path.trim());
}