Skip to content

Commit

Permalink
chore(ffi): Revamp gen_header using cargo-expand (#3092)
Browse files Browse the repository at this point in the history
  • Loading branch information
bossmc authored Dec 29, 2022
1 parent 3e41a4e commit 468b9af
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 84 deletions.
14 changes: 7 additions & 7 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand All @@ -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:
Expand Down
5 changes: 1 addition & 4 deletions capi/cbindgen.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
89 changes: 16 additions & 73 deletions capi/gen_header.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions capi/include/hyper.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

/*
Return in iter functions to continue iterating.
Expand Down

0 comments on commit 468b9af

Please sign in to comment.