forge
ExploreLog in

Tahinli/forge

public
0 watching
★ 0
1.6 KiB
1//! Compiles style/main.scss into OUT_DIR and emits FORGE_BUILD_SHA for the binary. Each static
2//! asset also gets a content hash (FORGE_MAIN_CSS_V, FORGE_NAV_JS_V) that the page links use as
3//! their cache-busting query, so an unchanged file keeps its URL and a changed one gets a new one.
4
5use std::{env, fs, path::PathBuf};
6
7use hex::encode;
8use sha2::{Digest, Sha256};
9
10/// First 12 hex characters of the SHA-256 of `bytes`.
11fn content_version(bytes: &[u8]) -> String {
12 encode(Sha256::digest(bytes))[..12].to_string()
13}
14
15fn main() {
16 println!("cargo:rerun-if-env-changed=FORGE_BUILD_SHA");
17 println!("cargo:rerun-if-changed=../../style");
18 println!("cargo:rerun-if-changed=assets/nav.js");
19
20 let sha = env::var("FORGE_BUILD_SHA").unwrap_or_else(|_| "dev".to_string());
21 println!("cargo:rustc-env=FORGE_BUILD_SHA={sha}");
22
23 let manifest =
24 PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR is set by cargo"));
25 let out = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR is set by cargo"));
26 let css = grass::from_path(
27 manifest.join("../../style/main.scss"),
28 &grass::Options::default(),
29 )
30 .unwrap_or_else(|e| panic!("compiling style/main.scss: {e}"));
31 println!(
32 "cargo:rustc-env=FORGE_MAIN_CSS_V={}",
33 content_version(css.as_bytes())
34 );
35 fs::write(out.join("main.css"), css).expect("writing compiled stylesheet to OUT_DIR");
36
37 let nav = fs::read(manifest.join("assets/nav.js")).expect("reading assets/nav.js");
38 println!("cargo:rustc-env=FORGE_NAV_JS_V={}", content_version(&nav));
39}