summaryrefslogtreecommitdiff
path: root/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..9272c07
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,70 @@
+fn main() {
+ linker_be_nice();
+ // make sure linkall.x is the last linker script (otherwise might cause problems with flip-link)
+ println!("cargo:rustc-link-arg=-Tlinkall.x");
+}
+
+fn linker_be_nice() {
+ let args: Vec<String> = std::env::args().collect();
+ if args.len() > 1 {
+ let kind = &args[1];
+ let what = &args[2];
+
+ match kind.as_str() {
+ "undefined-symbol" => match what.as_str() {
+ what if what.starts_with("_defmt_") => {
+ eprintln!();
+ eprintln!(
+ "💡 `defmt` not found - make sure `defmt.x` is added as a linker script and you have included `use defmt_rtt as _;`"
+ );
+ eprintln!();
+ }
+ "_stack_start" => {
+ eprintln!();
+ eprintln!("💡 Is the linker script `linkall.x` missing?");
+ eprintln!();
+ }
+ what if what.starts_with("esp_rtos_") => {
+ eprintln!();
+ eprintln!(
+ "💡 `esp-radio` has no scheduler enabled. Make sure you have initialized `esp-rtos` or provided an external scheduler."
+ );
+ eprintln!();
+ }
+ "embedded_test_linker_file_not_added_to_rustflags" => {
+ eprintln!();
+ eprintln!(
+ "💡 `embedded-test` not found - make sure `embedded-test.x` is added as a linker script for tests"
+ );
+ eprintln!();
+ }
+ "free"
+ | "malloc"
+ | "calloc"
+ | "get_free_internal_heap_size"
+ | "malloc_internal"
+ | "realloc_internal"
+ | "calloc_internal"
+ | "free_internal" => {
+ eprintln!();
+ eprintln!(
+ "💡 Did you forget the `esp-alloc` dependency or didn't enable the `compat` feature on it?"
+ );
+ eprintln!();
+ }
+ _ => (),
+ },
+ // we don't have anything helpful for "missing-lib" yet
+ _ => {
+ std::process::exit(1);
+ }
+ }
+
+ std::process::exit(0);
+ }
+
+ println!(
+ "cargo:rustc-link-arg=--error-handling-script={}",
+ std::env::current_exe().unwrap().display()
+ );
+}