icu_freertos/lib.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
//! This crate is a shim that enables one to use icu4x on Cortex-M + FreeRTOS by setting up the
//! relevant Rust runtime hooks.
//!
//! Note that compiling to this platform needs Rust nightly, and this crate attempts to
//! build across multiple nightly versions.
//!
//! This crate has a build script that will attempt to detect the nightly version and configure
//! things appropriately, where possible. Older nightlies will end up setting the
//! `--cfg needs_alloc_error_handler` flag: if using a custom build system and a nightly from
//! 2022 or earlier, please set this flag.
// https://github.com/unicode-org/icu4x/blob/main/documents/process/boilerplate.md#library-annotations
#![no_std]
#![cfg_attr(
not(test),
deny(
clippy::indexing_slicing,
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::exhaustive_structs,
clippy::exhaustive_enums,
missing_debug_implementations,
)
)]
#![allow(clippy::upper_case_acronyms)]
#![cfg_attr(
all(target_os = "none", needs_alloc_error_handler),
feature(alloc_error_handler)
)]
// Necessary to for symbols to be linked in
extern crate icu_capi;
// CFG it off so that it doesn't break the --all-features build due to needing unstable rust
#[cfg(target_os = "none")]
mod stuff {
extern crate alloc;
use core::panic::PanicInfo;
use freertos_rust::FreeRtosAllocator;
#[global_allocator]
static GLOBAL: FreeRtosAllocator = FreeRtosAllocator;
#[cfg(needs_alloc_error_handler)] // this defaults to the panic handler on newer nightlies
#[alloc_error_handler]
fn alloc_error(_layout: alloc::alloc::Layout) -> ! {
cortex_m::asm::bkpt();
loop {}
}
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
loop {}
}
}
// Needed for rust runtime stuff
//
// renamed so you can't accidentally use it
#[cfg(not(target_os = "none"))]
extern crate std as rust_std;