From 468b9af4cc5dbc21805f0bd01247d11321ba8450 Mon Sep 17 00:00:00 2001 From: Andy Caldwell Date: Thu, 29 Dec 2022 17:02:52 +0000 Subject: [PATCH] chore(ffi): Revamp `gen_header` using `cargo-expand` (#3092) --- .github/workflows/CI.yml | 14 +++---- capi/cbindgen.toml | 5 +-- capi/gen_header.sh | 89 ++++++++-------------------------------- capi/include/hyper.h | 1 + 4 files changed, 25 insertions(+), 84 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 4ce4f5f66e..f08af14d75 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -167,12 +167,6 @@ jobs: - name: Install Rust uses: dtolnay/rust-toolchain@stable - - name: Install cbindgen - uses: actions-rs/cargo@v1 - with: - command: install - args: cbindgen - - name: Build FFI uses: actions-rs/cargo@v1 env: @@ -190,7 +184,7 @@ jobs: RUSTFLAGS: --cfg hyper_unstable_ffi with: command: test - args: --features full,ffi --lib + args: --features server,client,http1,http2,ffi --lib ffi-header: name: Verify hyper.h is up to date @@ -208,6 +202,12 @@ jobs: command: install args: cbindgen + - name: Install cargo-expand + uses: actions-rs/cargo@v1 + with: + command: install + args: cargo-expand + - name: Build FFI uses: actions-rs/cargo@v1 env: diff --git a/capi/cbindgen.toml b/capi/cbindgen.toml index d1a58234b5..615df080f6 100644 --- a/capi/cbindgen.toml +++ b/capi/cbindgen.toml @@ -7,9 +7,6 @@ header = """/* */""" include_guard = "_HYPER_H" no_includes = true -sys_includes = ["stdint.h", "stddef.h"] +sys_includes = ["stdint.h", "stddef.h", "stdbool.h"] cpp_compat = true documentation_style = "c" - -[parse.expand] -crates = ["hyper-capi"] diff --git a/capi/gen_header.sh b/capi/gen_header.sh index d0b9c13a32..7a08d3e6ff 100755 --- a/capi/gen_header.sh +++ b/capi/gen_header.sh @@ -6,101 +6,44 @@ set -e CAPI_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -WORK_DIR=$(mktemp -d) - -# check if tmp dir was created -if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then - echo "Could not create temp dir" - exit 1 -fi - header_file_backup="$CAPI_DIR/include/hyper.h.backup" function cleanup { - rm -rf "$WORK_DIR" + rm -rf "$WORK_DIR" || true rm "$header_file_backup" || true } trap cleanup EXIT -mkdir "$WORK_DIR/src" - -# Fake a library -cat > "$WORK_DIR/src/lib.rs" << EOF -#[path = "$CAPI_DIR/../src/ffi/mod.rs"] -pub mod ffi; -EOF - -# And its Cargo.toml -cat > "$WORK_DIR/Cargo.toml" << EOF -[package] -name = "hyper" -version = "0.0.0" -edition = "2018" -publish = false - -[dependencies] -# Determined which dependencies we need by running the "cargo rustc" command -# below and watching the compile error output for references to unknown imports, -# until we didn't get any errors. -bytes = "1" -futures-channel = "0.3" -futures-util = { version = "0.3", default-features = false, features = ["alloc"] } -libc = { version = "0.2", optional = true } -http = "0.2" -http-body = "0.4" -tokio = { version = "1", features = ["rt"] } - -[features] -default = [ - "client", - "ffi", - "http1", -] +WORK_DIR=$(mktemp -d) -http1 = [] -client = [] -ffi = ["libc", "tokio/rt"] -EOF +# check if tmp dir was created +if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi cp "$CAPI_DIR/include/hyper.h" "$header_file_backup" -#cargo metadata --no-default-features --features ffi --format-version 1 > "$WORK_DIR/metadata.json" - -cd "${WORK_DIR}" || exit 2 - # Expand just the ffi module -if ! output=$(RUSTFLAGS='--cfg hyper_unstable_ffi' cargo rustc -- -Z unpretty=expanded 2>&1 > expanded.rs); then - # As of April 2021 the script above prints a lot of warnings/errors, and - # exits with a nonzero return code, but hyper.h still gets generated. - # - # However, on Github Actions, this will result in automatic "annotations" - # being added to files not related to a PR, so if this is `--verify` mode, - # then don't show it. - # - # But yes show it when using it locally. - if [[ "--verify" != "$1" ]]; then - echo "$output" - fi +if ! RUSTFLAGS='--cfg hyper_unstable_ffi' cargo expand --features client,http1,http2,ffi ::ffi 2> $WORK_DIR/expand_stderr.err > $WORK_DIR/expanded.rs; then + cat $WORK_DIR/expand_stderr.err fi -# Replace the previous copy with the single expanded file -rm -rf ./src -mkdir src -mv expanded.rs src/lib.rs - - # Bindgen! if ! cbindgen \ --config "$CAPI_DIR/cbindgen.toml" \ --lockfile "$CAPI_DIR/../Cargo.lock" \ --output "$CAPI_DIR/include/hyper.h" \ - "${@}"; then + "${@}"\ + $WORK_DIR/expanded.rs 2> $WORK_DIR/cbindgen_stderr.err; then bindgen_exit_code=$? if [[ "--verify" == "$1" ]]; then - echo "diff generated (<) vs backup (>)" - diff "$CAPI_DIR/include/hyper.h" "$header_file_backup" + echo "Changes from previous header (old < > new)" + diff -u "$header_file_backup" "$CAPI_DIR/include/hyper.h" + else + echo "cbindgen failed:" + cat $WORK_DIR/cbindgen_stderr.err fi exit $bindgen_exit_code fi diff --git a/capi/include/hyper.h b/capi/include/hyper.h index d41ccaaccd..591cb9771c 100644 --- a/capi/include/hyper.h +++ b/capi/include/hyper.h @@ -8,6 +8,7 @@ #include #include +#include /* Return in iter functions to continue iterating.