Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revamp gen_header using cargo-expand #3092

Merged
merged 3 commits into from
Dec 29, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
14 changes: 7 additions & 7 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,12 +185,6 @@ jobs:
toolchain: stable
override: true

- name: Install cbindgen
uses: actions-rs/cargo@v1
with:
command: install
args: cbindgen

- name: Build FFI
uses: actions-rs/cargo@v1
env:
Expand All @@ -208,7 +202,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 @@ -232,6 +226,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
7 changes: 2 additions & 5 deletions capi/cbindgen.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,8 @@ header = """/*
* Copyright 2021 Sean McArthur. MIT License.
* Generated by gen_header.sh. Do not edit directly.
*/"""
include_guard = "_HYPER_H"
bossmc marked this conversation as resolved.
Show resolved Hide resolved
pragma_once = true
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
6 changes: 2 additions & 4 deletions capi/include/hyper.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
* Generated by gen_header.sh. Do not edit directly.
*/

#ifndef _HYPER_H
#define _HYPER_H
#pragma once

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

/*
Return in iter functions to continue iterating.
Expand Down Expand Up @@ -759,5 +759,3 @@ void hyper_waker_wake(struct hyper_waker *waker);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus

#endif /* _HYPER_H */