As I understand it, "cargo rustc" in gen_header.sh generates a ton of errors, but still manages to generate an object that can be used by cbindgen to generate hyper.h. However, I tried to make a separate change to add more fields to hyper.h, and learned that "cargo rustc" stops if it reaches 50 errors, which I reached. I was able to buy some headroom and fix a number of the compilation errors by adding imports to the fake Cargo.toml we generate in gen_header.sh. I wasn't sure how to resolve imports like "crate::Result" which appear to reference the top-level src/error.rs, and print an error when they are compiled in gen_header.sh. But I only need to buy headroom under the 50 error count for now, which I was able to do by adding the imports. It is possible that someone more familiar with Rust than me could look at this and know what to change to get the total number of errors to zero.
101 lines
2.3 KiB
Bash
Executable File
101 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# This script regenerates hyper.h. As of April 2021, it only works with the
|
|
# nightly build of Rust.
|
|
|
|
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 "$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",
|
|
]
|
|
|
|
http1 = []
|
|
client = []
|
|
ffi = ["libc", "tokio/rt"]
|
|
EOF
|
|
|
|
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 unstable-options --pretty=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.
|
|
echo "$output"
|
|
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
|
|
bindgen_exit_code=$?
|
|
if [[ "--verify" == "$1" ]]; then
|
|
echo "diff generated (<) vs backup (>)"
|
|
diff "$CAPI_DIR/include/hyper.h" "$header_file_backup"
|
|
fi
|
|
exit $bindgen_exit_code
|
|
fi
|
|
|
|
exit 0
|