diff --git a/core/embed/rust/build.rs b/core/embed/rust/build.rs index b41cf8b835..3128194666 100644 --- a/core/embed/rust/build.rs +++ b/core/embed/rust/build.rs @@ -57,18 +57,34 @@ const DEFAULT_BINDGEN_MACROS_COMMON: &[&str] = &[ ]; fn add_bindgen_macros<'a>( - clang_args: &mut Vec<&'a str>, + clang_args: &mut Vec, envvar: Option<&'a str>, test_envvar: Option<&'a str>, ) { - match envvar { - Some(envvar) => clang_args.extend(envvar.split(',')), - None => { - println!("{}", test_envvar.unwrap()); - let test_macros_env = test_envvar.unwrap().split(','); - clang_args.extend(DEFAULT_BINDGEN_MACROS_COMMON.iter()); - clang_args.extend(test_macros_env); - } + if let Some(envvar) = envvar { + clang_args.extend(envvar.split(',').map(String::from)); + return; + } + clang_args.extend(DEFAULT_BINDGEN_MACROS_COMMON.iter().map(|s| s.to_string())); + if let Some(envvar) = test_envvar { + clang_args.extend(envvar.split(',').map(String::from)); + return; + } + + let mut model_dirs: Vec<&str> = vec![]; + // always include Bolt as the baseline + model_dirs.push("../models/T2T1"); + #[cfg(feature = "layout_caesar")] + model_dirs.push("../models/T3B1"); + #[cfg(feature = "layout_delizia")] + model_dirs.push("../models/T3T1"); + #[cfg(feature = "layout_eckhart")] + model_dirs.push("../models/T3W1"); + for model_dir in model_dirs { + let macros = PathBuf::from(model_dir).join("test_bindgen_macros.txt"); + let contents = std::fs::read_to_string(¯os) + .unwrap_or_else(|_| panic!("Failed to read {:?}", macros)); + clang_args.extend(contents.split(",\n").map(String::from)); } } @@ -118,7 +134,7 @@ fn prepare_bindings() -> bindgen::Builder { let build_dir_include = format!("-I{}", build_dir()); - let mut clang_args: Vec<&str> = Vec::new(); + let mut clang_args: Vec = Vec::new(); let bindgen_macros_env = env::var("BINDGEN_MACROS").ok(); let test_macros_env = env::var("TEST_BINDGEN_MACROS").ok(); @@ -133,12 +149,12 @@ fn prepare_bindings() -> bindgen::Builder { bindings = bindings.clang_args(&["-DFRAMEBUFFER"]); } - clang_args.push(&build_dir_include); + clang_args.push(build_dir_include); // Pass in correct include paths and defines. if is_firmware() { - clang_args.push("-nostdinc"); - clang_args.push("-fshort-enums"); // Make sure enums use the same size as in C + clang_args.push("-nostdinc".to_string()); + clang_args.push("-fshort-enums".to_string()); // Make sure enums use the same size as in C // Append gcc-arm-none-eabi's include paths. let cc_output = Command::new("arm-none-eabi-gcc") @@ -161,7 +177,7 @@ fn prepare_bindings() -> bindgen::Builder { bindings = bindings.clang_args(include_args); } else { - clang_args.push("-fno-short-enums"); + clang_args.push("-fno-short-enums".to_string()); } bindings = bindings.clang_args(&clang_args);