Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
53f94fc
Port build script to Rust and output bindings to `OUT_DIR`.
reitermarkus Nov 27, 2019
61cf615
Move crate to root again.
reitermarkus Nov 28, 2019
460ae9a
Remove duplicate header.
reitermarkus Nov 29, 2019
2fd4011
Use `RUSTC_LINKER` variable.
reitermarkus Nov 29, 2019
a5c0a41
Use rustified enums.
reitermarkus Dec 18, 2019
45775df
Remove profiles.
reitermarkus Dec 19, 2019
596b7c5
Allow building with ESP8266 SDK.
reitermarkus Dec 28, 2019
8c8d220
Set `IDF_TARGET` for ESP8266.
reitermarkus Dec 28, 2019
21c5a57
Set `target_device` in `build.rs`.
reitermarkus Jan 5, 2020
5400a00
Update dependencies.
reitermarkus Apr 30, 2020
a95ec62
Fix nested components.
reitermarkus May 1, 2020
7ec4e0c
Update to ESP IDF 4.2.
reitermarkus May 1, 2020
3b20fe2
Don't special-case `wifi_mode_t`.
reitermarkus May 1, 2020
0dd13d3
Change crate name.
reitermarkus May 1, 2020
3d9d449
Refactor build script.
reitermarkus Jul 1, 2020
20dca82
Add CI config.
reitermarkus Jul 2, 2020
7428b64
Install IDF on CI.
reitermarkus Jul 2, 2020
2136453
Build documentation.
reitermarkus Jul 2, 2020
2f9124c
Upload documentation.
reitermarkus Jul 2, 2020
f116739
Set default toolchain.
reitermarkus Jul 2, 2020
527fa48
Remove previous documentation before uploading.
reitermarkus Jul 2, 2020
157d89a
Use `libc` crate instead of redefining types.
reitermarkus Jul 2, 2020
7ca091c
Add documentation badge.
reitermarkus Jul 2, 2020
bd7478e
Remove `defaults` feature.
reitermarkus Jul 2, 2020
69b21e7
Don't enable default features for `libc`.
reitermarkus Jul 2, 2020
cba5085
Remove `build.sh`.
reitermarkus Jul 2, 2020
f3232fc
Exclude `.github` directory in `Cargo.toml`.
reitermarkus Jul 2, 2020
9a7f5e5
Print warning for unsupported targets.
reitermarkus Jul 2, 2020
c513d51
Add documentation link for crates.io.
reitermarkus Jul 2, 2020
b8dc256
Update dependency.
reitermarkus Jul 2, 2020
109ebf3
Bump version to 0.1.1.
reitermarkus Jul 2, 2020
f257ce8
Support IDF 4.3.
reitermarkus Feb 21, 2021
29c3190
Update `bindgen` to 0.57.
reitermarkus Mar 15, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .cargo/config

This file was deleted.

47 changes: 47 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
on: [pull_request, push]

name: CI

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- name: Set up Toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: nightly
components: rustfmt, clippy
default: true
- name: Install Cross
run: cargo install --git https://github.com/rust-embedded/cross --force
- name: Install ESP IDF
run: |
IDF_PATH="$(mktemp -d)"
git clone --recursive --branch release/v4.3 https://github.com/espressif/esp-idf "${IDF_PATH}"
echo "IDF_PATH=${IDF_PATH}" >> "${GITHUB_ENV}"

IDF_TOOLS_PATH="$(mktemp -d)"
echo "IDF_TOOLS_PATH=${IDF_TOOLS_PATH}" >> "${GITHUB_ENV}"
- name: Build
uses: actions-rs/cargo@v1
with:
use-cross: true
command: build
args: --target xtensa-esp32-none-elf
- name: Documentation
uses: actions-rs/cargo@v1
with:
use-cross: true
command: doc
args: --target xtensa-esp32-none-elf --no-deps
- name: Upload Documentation
uses: JamesIves/github-pages-deploy-action@releases/v3
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH: gh-pages
FOLDER: target/xtensa-esp32-none-elf/doc
CLEAN: true
if: ${{ github.ref == 'refs/heads/master' }}
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
/target
/build
/Cargo.lock
**/*.rs.bk
4 changes: 0 additions & 4 deletions .gitmodules

This file was deleted.

21 changes: 17 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
[workspace]
members = [
"esp-idf-sys",
]
[package]
name = "esp-idf-bindgen"
version = "0.1.1"
authors = ["Markus Reiter <me@reitermark.us>"]
edition = "2018"
description = "Automatically generated Rust bindings for the ESP IDF (Espressif IoT Development Framework)"
repository = "https://github.com/reitermarkus/esp-idf-bindgen"
documentation = "https://reitermarkus.github.io/esp-idf-bindgen/esp_idf_bindgen/index.html"
license = "MIT OR Apache-2.0"
exclude = ["/.github/*"]

[dependencies]
libc = { version = "0.2", default-features = false }

[build-dependencies]
bindgen = "0.57"
globwalk = "0.8"
3 changes: 3 additions & 0 deletions Cross.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[target.xtensa-esp32-none-elf]
image = "reitermarkus/cross:xtensa-esp32-none-elf"
env = { volumes = ["IDF_PATH", "IDF_TOOLS_PATH"] }
21 changes: 0 additions & 21 deletions LICENSE

This file was deleted.

11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# Rust bindings for esp-idf (Espressif's IoT Development Framework)
# Rust bindings for the ESP IDF (Espressif IoT Development Framework)

[![crate](http://meritbadge.herokuapp.com/esp-idf-sys)](https://crates.io/crates/esp-idf-sys)
[![docs](https://docs.rs/esp-idf-sys/badge.svg)](https://docs.rs/esp-idf-sys/)
[![Crates.io](https://img.shields.io/crates/v/esp-idf-bindgen.svg)](https://crates.io/crates/esp-idf-bindgen)
[![Documentation](https://img.shields.io/badge/docs-master-4d76ae)](https://reitermarkus.github.io/esp-idf-bindgen/esp_idf_bindgen/index.html)


## Building

For building, the ESP toolchain must be in the `PATH` and `IDF_PATH` must be set.
47 changes: 0 additions & 47 deletions bindgen.sh

This file was deleted.

135 changes: 135 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
use std::{
env,
error::Error,
ffi::OsStr,
fs::read_to_string,
io::{BufReader, BufRead, Write},
os::unix::ffi::OsStrExt,
path::PathBuf,
process::{Command, Stdio},
};

use bindgen::EnumVariation;

fn main() -> Result<(), Box<dyn Error>> {
println!("cargo:rerun-if-changed=src/bindings.h");
println!("cargo:rerun-if-changed=src/sdkconfig.h");

let (idf_target, linker) = match env::var("TARGET")?.as_ref() {
"xtensa-esp32-none-elf" => {
println!(r#"cargo:rustc-cfg=target_device="esp32""#);
("esp32".to_string(), env::var("RUSTC_LINKER").unwrap_or("xtensa-esp32-elf-ld".to_string()))
},
"xtensa-esp8266-none-elf" => {
println!(r#"cargo:rustc-cfg=target_device="esp8266""#);
("esp8266".to_string(), env::var("RUSTC_LINKER").unwrap_or("xtensa-lx106-elf-ld".to_string()))
},
target => {
println!("cargo:warning=Generating ESP IDF bindings for target '{}' it not supported. The resulting crate will be empty.", target);
return Ok(())
},
};

let idf_path = PathBuf::from(env::var("IDF_PATH").expect("IDF_PATH not set"));

let sysroot = Command::new(linker)
.arg("--print-sysroot")
.output()
.map(|mut output| {
// Remove newline from end.
output.stdout.pop();
PathBuf::from(OsStr::from_bytes(&output.stdout))
.canonicalize().expect("failed to canonicalize sysroot")
})
.expect("failed getting sysroot");

let component_includes =
globwalk::GlobWalkerBuilder::from_patterns(
&idf_path,
&["components/*/include"],
)
.build()?
.filter_map(Result::ok)
.map(|d| d.into_path());

let component_additional_includes = globwalk::GlobWalkerBuilder::from_patterns(
&idf_path,
&["components/*/component.mk"],
)
.build()?
.filter_map(Result::ok)
.flat_map(|makefile| {
let path = makefile.into_path();
let component_path = path.parent().unwrap();

let mut contents = read_to_string(&path).expect("failed reading component.mk").replace("$(info ", "$(warn ");
// Define these variables since they affect `COMPONENT_ADD_INCLUDEDIRS`.
contents.insert_str(0, r"
CONFIG_SYSVIEW_ENABLE :=
CONFIG_AWS_IOT_SDK :=
CONFIG_BT_ENABLED :=
CONFIG_BLUEDROID_ENABLED :=
");
contents.push_str("\n$(info ${COMPONENT_ADD_INCLUDEDIRS})");

let mut child = Command::new("make")
.current_dir(&component_path)
.arg("-f")
.arg("-")
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::null())
.env("IDF_TARGET", &idf_target)
.env("SOC_NAME", &idf_target)
.env("COMPONENT_PATH", &component_path)
.spawn()
.expect("make failed");

let mut stdin = child.stdin.take().unwrap();
let stdout = child.stdout.take().unwrap();

writeln!(stdin, "{}", contents).unwrap();

BufReader::new(stdout).lines()
.filter_map(Result::ok)
.map(|s| s.trim_end().to_string())
.filter(|s| !s.is_empty())
.flat_map(|s| {
let s = s.split(' ');
let s = s.map(|s| s.to_string());
s.collect::<Vec<_>>().into_iter()
})
.map(move |s| path.parent().unwrap().join(s))
.filter(|s| s.is_dir())
});

let mut includes = component_includes.chain(component_additional_includes)
.map(|include| format!("-I{}", include.display()))
.collect::<Vec<_>>();

includes.sort();
includes.dedup();

let bindings = bindgen::Builder::default()
.use_core()
.layout_tests(false)
.ctypes_prefix("libc")
.default_enum_style(EnumVariation::Rust { non_exhaustive: false } )
.header("src/bindings.h")
.clang_arg(format!("--sysroot={}", sysroot.display()))
.clang_arg(format!("-I{}/include", sysroot.display()))
.clang_arg("-Isrc")
.clang_arg("-D__bindgen")
.clang_args(&["-target", "xtensa"])
.clang_args(&["-x", "c"])
.clang_args(includes);

eprintln!("{:?}", bindings.command_line_flags());

let out_path = PathBuf::from(env::var("OUT_DIR")?);
bindings.generate()
.expect("Failed to generate bindings")
.write_to_file(out_path.join("bindings.rs"))?;

Ok(())
}
1 change: 0 additions & 1 deletion esp-idf
Submodule esp-idf deleted from 055943
14 changes: 0 additions & 14 deletions esp-idf-sys/Cargo.toml

This file was deleted.

17 changes: 0 additions & 17 deletions esp-idf-sys/src/bindings.h

This file was deleted.

Loading