codegen: tidy up

- Document the need for external rustfmt invocation.
- Remove reexports.
- Remove `write_to_file`.
- Avoid allocating strings when using bindgen to write bindings.
reviewable/pr1203/r1
Tamir Duberstein 1 week ago
parent e16f0482f8
commit 9916092f5c

@ -31,8 +31,9 @@ jobs:
sudo apt -y install libelf-dev libc6-dev libc6-dev-{arm64,armel,loong64,riscv64,ppc64el,s390x,mips}-cross sudo apt -y install libelf-dev libc6-dev libc6-dev-{arm64,armel,loong64,riscv64,ppc64el,s390x,mips}-cross
- run: cargo xtask codegen - run: cargo xtask codegen
- run: cargo xtask public-api --bless # aya-ebpf-bindings aren't emitted directly from bindgen and so aren't formatted.
- run: cargo fmt --all - run: cargo fmt --all
- run: cargo xtask public-api --bless
- id: libbpf - id: libbpf
working-directory: xtask/libbpf working-directory: xtask/libbpf

@ -9,8 +9,6 @@ use std::{
use tempfile::tempdir; use tempfile::tempdir;
use thiserror::Error; use thiserror::Error;
use crate::bindgen;
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
#[error("error executing bpftool")] #[error("error executing bpftool")]
@ -44,7 +42,7 @@ pub fn generate<T: AsRef<str>>(
.map(|s| s.as_ref().into()) .map(|s| s.as_ref().into())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let mut bindgen = bindgen::bpf_builder(); let mut bindgen = crate::bindgen::bpf_builder();
let (additional_flags, ctypes_prefix) = extract_ctypes_prefix(&additional_flags); let (additional_flags, ctypes_prefix) = extract_ctypes_prefix(&additional_flags);
if let Some(prefix) = ctypes_prefix { if let Some(prefix) = ctypes_prefix {

@ -1,22 +1,2 @@
use std::{
fs::{File, create_dir_all},
io::{self, Write},
path::Path,
};
pub mod bindgen; pub mod bindgen;
pub mod generate; pub mod generate;
pub use generate::{InputFile, generate};
pub fn write_to_file<T: AsRef<Path>>(path: T, code: &str) -> Result<(), io::Error> {
// Create parent directories if they don't exist already
if let Some(parent) = path.as_ref().parent() {
if !parent.exists() {
create_dir_all(parent)?;
}
}
let mut file = File::create(path)?;
file.write_all(code.as_bytes())
}

@ -1,7 +1,10 @@
use std::path::{Path, PathBuf}; use std::{
fs::create_dir_all,
path::{Path, PathBuf},
};
use anyhow::{Context as _, Result}; use anyhow::{Context as _, Result};
use aya_tool::{bindgen, write_to_file}; use aya_tool::bindgen;
use crate::codegen::{Architecture, SysrootOptions}; use crate::codegen::{Architecture, SysrootOptions};
@ -26,10 +29,10 @@ fn codegen_internal_btf_bindings(libbpf_dir: &Path) -> Result<()> {
bindgen = bindgen.allowlist_type(x); bindgen = bindgen.allowlist_type(x);
} }
let bindings = bindgen.generate().context("bindgen failed")?.to_string(); let bindings = bindgen.generate().context("bindgen failed")?;
// write the bindings, with the original helpers removed // write the bindings, with the original helpers removed
write_to_file(generated.join("btf_internal_bindings.rs"), &bindings)?; bindings.write_to_file(generated.join("btf_internal_bindings.rs"))?;
Ok(()) Ok(())
} }
@ -47,6 +50,7 @@ fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<()> {
} = opts; } = opts;
let dir = PathBuf::from("aya-obj"); let dir = PathBuf::from("aya-obj");
let generated = dir.join("src/generated"); let generated = dir.join("src/generated");
create_dir_all(&generated)?;
let builder = || { let builder = || {
let mut bindgen = bindgen::user_builder() let mut bindgen = bindgen::user_builder()
@ -223,13 +227,10 @@ fn codegen_bindings(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<()> {
}; };
bindgen = bindgen.clang_args(["-I", sysroot.to_str().unwrap()]); bindgen = bindgen.clang_args(["-I", sysroot.to_str().unwrap()]);
let bindings = bindgen.generate().context("bindgen failed")?.to_string(); let bindings = bindgen.generate().context("bindgen failed")?;
// write the bindings, with the original helpers removed // write the bindings, with the original helpers removed
write_to_file( bindings.write_to_file(generated.join(format!("linux_bindings_{arch}.rs")))?;
generated.join(format!("linux_bindings_{arch}.rs")),
&bindings.to_string(),
)?;
} }
Ok(()) Ok(())

@ -1,12 +1,12 @@
use std::{ use std::{
ffi::OsString, ffi::OsString,
fs::create_dir_all, fs::{File, create_dir_all},
path::{Path, PathBuf}, path::{Path, PathBuf},
process::Command, process::Command,
}; };
use anyhow::{Context as _, Result}; use anyhow::{Context as _, Result};
use aya_tool::{bindgen, write_to_file}; use aya_tool::bindgen;
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::ToTokens; use quote::ToTokens;
use syn::{Item, parse_str}; use syn::{Item, parse_str};
@ -132,7 +132,8 @@ pub fn codegen(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<()> {
}; };
bindgen = bindgen.clang_args(["-I", sysroot.to_str().unwrap()]); bindgen = bindgen.clang_args(["-I", sysroot.to_str().unwrap()]);
let bindings = bindgen.generate().context("bindgen failed")?.to_string(); let bindings = bindgen.generate().context("bindgen failed")?;
let bindings = bindings.to_string();
let mut tree = parse_str::<syn::File>(&bindings).unwrap(); let mut tree = parse_str::<syn::File>(&bindings).unwrap();
@ -143,21 +144,26 @@ pub fn codegen(opts: &SysrootOptions, libbpf_dir: &Path) -> Result<()> {
} }
let generated = dir.join("src").join(arch.to_string()); let generated = dir.join("src").join(arch.to_string());
if !generated.exists() { create_dir_all(&generated)?;
create_dir_all(&generated)?;
}
// write the bindings, with the original helpers removed // write the bindings, with the original helpers removed
write_to_file( //
generated.join("bindings.rs"),
&tree.to_token_stream().to_string(),
)?;
// write the new helpers as expanded by expand_helpers() // write the new helpers as expanded by expand_helpers()
write_to_file( for (path, code) in [
generated.join("helpers.rs"), (
&format!("use super::bindings::*; {helpers}"), generated.join("bindings.rs"),
)?; &tree.to_token_stream().to_string(),
),
(
generated.join("helpers.rs"),
&format!("use super::bindings::*; {helpers}"),
),
] {
use std::io::Write as _;
let mut file = File::create(path)?;
file.write_all(code.as_bytes())?;
}
} }
Ok(()) Ok(())

Loading…
Cancel
Save