From 678a274544b2d1a8d62b4e4bca533c93b7c65026 Mon Sep 17 00:00:00 2001 From: Gregor Reitzenstein Date: Sun, 29 Aug 2021 10:09:41 +0200 Subject: [PATCH] Make the build script smarter --- Cargo.toml | 2 ++ build.rs | 42 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bb9d54c..06fedc3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,6 +67,8 @@ genawaiter = "0.99" [build-dependencies] capnpc = "0.14" +# Used in build.rs to iterate over all files in schema/ +walkdir = "2" [dev-dependencies] futures-test = "0.3" diff --git a/build.rs b/build.rs index 52ba140..603ed95 100644 --- a/build.rs +++ b/build.rs @@ -1,5 +1,39 @@ -fn main() { - ::capnpc::CompilerCommand::new().file("schema/connection.capnp").run().unwrap(); - ::capnpc::CompilerCommand::new().file("schema/api.capnp").run().unwrap(); - ::capnpc::CompilerCommand::new().file("schema/auth.capnp").run().unwrap(); +use walkdir::{WalkDir, DirEntry}; + +fn is_hidden(entry: &DirEntry) -> bool { + entry.file_name() + .to_str() + .map(|s| s.starts_with(".")) + .unwrap_or(false) +} + +fn main() { + // Tell cargo to only run this script if the schema files or this script have changed + println!("cargo:rerun-if-changed=schema"); + + let mut compile_command = ::capnpc::CompilerCommand::new(); + + // Set parent module of all generated schema files. + // i.e. a file "user.capnp" will result in module "schema::user" + compile_command.default_parent_module(vec!["schema".into()]); + + for entry in WalkDir::new("schema") + .max_depth(2) + .into_iter() + .filter_entry(|e| !is_hidden(e)) + .filter_map(Result::ok) // Filter all entries that access failed on + .filter(|e| !e.file_type().is_dir()) // Filter directories + // Filter non-schema files + .filter(|e| e.file_name() + .to_str() + .map(|s| s.ends_with(".capnp")) + .unwrap_or(false) + ) + { + println!("Collecting schema file {}", entry.path().display()); + compile_command.file(entry.path()); + } + + println!("Compiling schemas..."); + compile_command.run().expect("Failed to generate API code"); }