Skip to content

Commit 399dfcd

Browse files
committed
fix: generate bindings by passing argument
1 parent fd6a812 commit 399dfcd

File tree

2 files changed

+76
-10
lines changed

2 files changed

+76
-10
lines changed

stm32-bindings-gen/src/lib.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ impl ParseCallbacks for UppercaseCallbacks {
1919
pub struct Options {
2020
pub out_dir: PathBuf,
2121
pub sources_dir: PathBuf,
22+
pub target_triple: String,
2223
}
2324

2425
pub struct Gen {
@@ -48,14 +49,25 @@ impl Gen {
4849
// The bindgen::Builder is the main entry point
4950
// to bindgen, and lets you build up options for
5051
// the resulting bindings.
51-
let bindings = bindgen::Builder::default()
52+
let target_flag = format!("--target={}", self.opts.target_triple);
53+
let include_arg = format!(
54+
"-I{}/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc",
55+
self.opts.sources_dir.to_str().unwrap()
56+
);
57+
let mut builder = bindgen::Builder::default()
5258
.parse_callbacks(Box::new(UppercaseCallbacks))
53-
// Force Clang to use the same 32-bit target layout as the firmware.
54-
.clang_args(["--target=thumbv8m.main-none-eabihf", "-mthumb"])
55-
.clang_arg(format!(
56-
"-I{}/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc",
57-
self.opts.sources_dir.to_str().unwrap()
58-
))
59+
// Force Clang to use the same layout as the selected target.
60+
.clang_arg(&target_flag)
61+
.clang_arg(&include_arg);
62+
if self
63+
.opts
64+
.target_triple
65+
.to_ascii_lowercase()
66+
.starts_with("thumb")
67+
{
68+
builder = builder.clang_arg("-mthumb");
69+
}
70+
let bindings = builder
5971
// The input header we would like to generate
6072
// bindings for.
6173
.header("stm32-bindings-gen/inc/wpan-wba.h")

stm32-bindings-gen/src/main.rs

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,70 @@
1-
use std::path::PathBuf;
1+
use std::{env, path::PathBuf, process};
22

33
use stm32_bindings_gen::{Gen, Options};
44

55
fn main() {
66
let out_dir = PathBuf::from("build/stm32-bindings");
77
let sources_dir = PathBuf::from("sources");
8-
9-
// let args: Vec<String> = args().collect();
8+
let target_triple = resolve_target_triple();
109

1110
let opts = Options {
1211
out_dir,
1312
sources_dir,
13+
target_triple,
1414
};
1515
Gen::new(opts).run_gen();
1616
}
17+
18+
fn resolve_target_triple() -> String {
19+
let mut args = env::args().skip(1);
20+
let mut positional: Option<String> = None;
21+
22+
while let Some(arg) = args.next() {
23+
match arg.as_str() {
24+
"--help" | "-h" => {
25+
eprintln!("Usage: stm32-bindings-gen [--target <triple>] [triple]");
26+
process::exit(0);
27+
}
28+
"--target" => {
29+
let value = args.next().unwrap_or_else(|| {
30+
eprintln!("Expected a value after --target");
31+
process::exit(1);
32+
});
33+
let trimmed = value.trim();
34+
if trimmed.is_empty() {
35+
eprintln!("Target triple cannot be empty.");
36+
process::exit(1);
37+
}
38+
return trimmed.to_string();
39+
}
40+
_ => {
41+
if let Some(value) = arg.strip_prefix("--target=") {
42+
let trimmed = value.trim();
43+
if trimmed.is_empty() {
44+
eprintln!("Target triple cannot be empty.");
45+
process::exit(1);
46+
}
47+
return trimmed.to_string();
48+
}
49+
if positional.is_none() {
50+
let trimmed = arg.trim();
51+
if !trimmed.is_empty() {
52+
positional = Some(trimmed.to_string());
53+
}
54+
}
55+
}
56+
}
57+
}
58+
59+
positional
60+
.or_else(|| env::var("BINDGEN_TARGET").ok())
61+
.and_then(|s| {
62+
let trimmed = s.trim();
63+
if trimmed.is_empty() {
64+
None
65+
} else {
66+
Some(trimmed.to_string())
67+
}
68+
})
69+
.unwrap_or_else(|| "thumbv8m.main-none-eabihf".to_string())
70+
}

0 commit comments

Comments
 (0)