Generate code using a script, not build.rs

Otherwise it's just too rust-analyzer-unfriendly
This commit is contained in:
Peter Cai 2025-03-02 21:36:26 -05:00
parent ba82e349a1
commit c1196a2e42
7 changed files with 20 additions and 19 deletions

1
.gitignore vendored
View file

@ -1 +1,2 @@
/target
/generated

1
Cargo.lock generated
View file

@ -640,7 +640,6 @@ dependencies = [
"bytes",
"fixed",
"nix",
"protogen",
"sendfd",
"serde",
"serde_derive",

View file

@ -21,6 +21,3 @@ tokio = { version = "1.43.0", features = [ "fs", "net", "rt", "rt-multi-thread",
toml = "0.8.20"
tracing = "0.1.41"
tracing-subscriber = "0.3.19"
[build-dependencies]
protogen = { version = "0.1.0", path = "protogen" }

View file

@ -1,9 +0,0 @@
fn main() {
let out_dir = std::env::var_os("OUT_DIR").unwrap();
protogen::generate_from_dir(&out_dir, "proto");
println!("cargo::rerun-if-changed=build.rs");
println!("cargo::rerun-if-changed=proto");
println!("cargo::rerun-if-changed=protogen");
}

3
generate.sh Executable file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env sh
cargo run -p protogen

View file

@ -1,4 +1,4 @@
use std::path::Path;
use std::{env, path::Path};
use quick_xml::events::Event;
use quote::{format_ident, quote};
@ -7,6 +7,17 @@ use types::{WlArgType, WlInterface, WlMsg, WlMsgType};
mod types;
pub fn main() {
let proto_path = env::current_dir()
.expect("current dir undefined")
.join("proto");
let generated_path = env::current_dir()
.expect("current dir undefined")
.join("generated");
std::fs::create_dir(&generated_path).ok();
generate_from_dir(&generated_path, &proto_path);
}
pub fn generate_from_dir(out_dir: impl AsRef<Path>, p: impl AsRef<Path>) {
let proto_mods_dir = out_dir.as_ref().join("proto_generated");
std::fs::remove_dir_all(&proto_mods_dir).ok();
@ -36,10 +47,8 @@ pub fn generate_from_dir(out_dir: impl AsRef<Path>, p: impl AsRef<Path>) {
.ok();
}
//let file_name_ident: Vec<_> = file_names.iter().map(|name| format_ident!("{name}")).collect();
let main_gen = quote! {
#( include!(concat!(env!("OUT_DIR"), "/proto_generated/", #file_names, ".rs")); )*
#( include!(concat!("../generated/proto_generated/", #file_names, ".rs")); )*
fn wl_init_parsers(event_parsers: &mut HashMap<(WlObjectType, u16), &'static dyn WlMsgParserFn>, request_parsers: &mut HashMap<(WlObjectType, u16), &'static dyn WlMsgParserFn>) {
#( #add_parsers_fn(event_parsers, request_parsers); )*

View file

@ -236,5 +236,6 @@ pub fn lookup_known_object_type(name: &str) -> Option<WlObjectType> {
/// The default object ID of wl_display
pub const WL_DISPLAY_OBJECT_ID: u32 = 1;
// Include code generated by build.rs
include!(concat!(env!("OUT_DIR"), "/proto_generated.rs"));
// Include code generated by protogen
// Note: to generate this, run generate.sh at the project root.
include!("../generated/proto_generated.rs");