From 3fef735ad0382272f55cce06aefa489bcfaa2eb9 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Tue, 4 Jan 2022 20:30:55 +0000 Subject: [PATCH] Support no_std on the generated crate --- .github/workflows/build.yml | 2 +- c-bindings-gen/src/main.rs | 17 ++++++++++++++++- lightning-c-bindings/src/c_types/mod.rs | 6 ++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 64bc90c..4a42cc3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: run: | # Note that the version tags aren't checked into git touch src/version.rs - RUSTFLAGS="--cfg=c_bindings" cargo check + RUSTFLAGS="--cfg=c_bindings" cargo check --features std - name: Install cbindgen run: cargo install --force cbindgen - name: Checkout Rust-Lightning git diff --git a/c-bindings-gen/src/main.rs b/c-bindings-gen/src/main.rs index da1ca4f..c6a74f6 100644 --- a/c-bindings-gen/src/main.rs +++ b/c-bindings-gen/src/main.rs @@ -33,7 +33,15 @@ mod blocks; use types::*; use blocks::*; -const DEFAULT_IMPORTS: &'static str = "\nuse std::str::FromStr;\nuse std::ffi::c_void;\nuse core::convert::Infallible;\nuse bitcoin::hashes::Hash;\nuse crate::c_types::*;\n"; +const DEFAULT_IMPORTS: &'static str = " +use alloc::str::FromStr; +use core::ffi::c_void; +use core::convert::Infallible; +use bitcoin::hashes::Hash; +use crate::c_types::*; +#[cfg(feature=\"no-std\")] +use alloc::{vec::Vec, boxed::Box}; +"; // ************************************* // *** Manually-expanded conversions *** @@ -1726,6 +1734,12 @@ fn convert_file<'a, 'b>(libast: &'a FullLibraryAST, crate_types: &CrateTypes<'a> writeln!(out, "#![allow(unused_braces)]").unwrap(); // TODO: We need to map deny(missing_docs) in the source crate(s) //writeln!(out, "#![deny(missing_docs)]").unwrap(); + + writeln!(out, "#![cfg_attr(not(feature = \"std\"), no_std)]").unwrap(); + writeln!(out, "#[cfg(not(any(feature = \"std\", feature = \"no-std\")))]").unwrap(); + writeln!(out, "compile_error!(\"at least one of the `std` or `no-std` features must be enabled\");").unwrap(); + writeln!(out, "extern crate alloc;").unwrap(); + writeln!(out, "pub mod version;").unwrap(); writeln!(out, "pub mod c_types;").unwrap(); writeln!(out, "pub mod bitcoin;").unwrap(); @@ -1972,6 +1986,7 @@ fn main() { let mut derived_templates = std::fs::OpenOptions::new().write(true).create(true).truncate(true) .open(&args[2]).expect("Unable to open new header file"); + writeln!(&mut derived_templates, "{}", DEFAULT_IMPORTS).unwrap(); let mut header_file = std::fs::OpenOptions::new().write(true).create(true).truncate(true) .open(&args[3]).expect("Unable to open new header file"); let mut cpp_header_file = std::fs::OpenOptions::new().write(true).create(true).truncate(true) diff --git a/lightning-c-bindings/src/c_types/mod.rs b/lightning-c-bindings/src/c_types/mod.rs index 9e928a6..0bd976b 100644 --- a/lightning-c-bindings/src/c_types/mod.rs +++ b/lightning-c-bindings/src/c_types/mod.rs @@ -20,6 +20,8 @@ use core::ffi::c_void; pub(crate) use std::io::{self, Cursor, Read}; #[cfg(feature = "no-std")] pub(crate) use core2::io::{self, Cursor, Read}; +#[cfg(feature = "no-std")] +use alloc::{boxed::Box, vec::Vec, string::String}; #[repr(C)] /// A dummy struct of which an instance must never exist. @@ -192,6 +194,7 @@ pub enum IOError { Other, UnexpectedEof, } +#[cfg(feature = "std")] impl IOError { pub(crate) fn from_rust(err: std::io::Error) -> Self { match err.kind() { @@ -576,6 +579,9 @@ impl TakePointer<*mut T> for *mut T { pub(crate) mod ObjOps { + #[cfg(feature = "no-std")] + use alloc::boxed::Box; + #[inline] #[must_use = "returns new dangling pointer"] pub(crate) fn heap_alloc(obj: T) -> *mut T { -- 2.30.2