X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=genbindings.sh;h=34982335a58067de41476b736a71f40aa3248c62;hb=15635d01527607e724993ee20bab906ef22d832c;hp=31b6bd0a09f27d63bc5773d03398efe882962c24;hpb=c014ce6a2df808ffec747f9a327c7f97bb1e3d08;p=ldk-c-bindings diff --git a/genbindings.sh b/genbindings.sh index 31b6bd0..3498233 100755 --- a/genbindings.sh +++ b/genbindings.sh @@ -53,14 +53,20 @@ fi BASE_HOST_CFLAGS="$BASE_CFLAGS" -if [ "$HOST_OSX" = "true" ]; then +if [ "$MACOS_SDK" = "" -a "$HOST_OSX" = "true" ]; then + MACOS_SDK="$(xcrun --show-sdk-path)" + [ "$MACOS_SDK" = "" ] && exit 1 +fi + +if [ "$MACOS_SDK" != "" ]; then export MACOSX_DEPLOYMENT_TARGET=10.9 - LOCAL_CFLAGS="$LOCAL_CFLAGS --target=$HOST_PLATFORM -isysroot$(xcrun --show-sdk-path) -mmacosx-version-min=10.9" - BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS --target=$HOST_PLATFORM -isysroot$(xcrun --show-sdk-path) -mmacosx-version-min=10.9" - # Targeting aarch64 appears to be supported only starting with Big Sur, so check it before use - clang -o /dev/null $BASE_HOST_CFLAGS --target=aarch64-apple-darwin -mcpu=apple-a14 genbindings_path_map_test_file.c && - export CFLAGS_aarch64_apple_darwin="$BASE_HOST_CFLAGS --target=aarch64-apple-darwin -mcpu=apple-a14" || - echo "WARNING: Can not build targeting aarch64-apple-darin. Upgrade to Big Sur or try upstream clang" + BASE_HOST_OSX_CFLAGS="$BASE_HOST_CFLAGS -isysroot$MACOS_SDK -mmacosx-version-min=10.9" + export CFLAGS_aarch64_apple_darwin="$BASE_HOST_OSX_CFLAGS --target=aarch64-apple-darwin -mcpu=apple-a14" + export CFLAGS_x86_64_apple_darwin="$BASE_HOST_OSX_CFLAGS --target=x86_64-apple-darwin -march=sandybridge -mtune=sandybridge" + if [ "$HOST_OSX" = "true" ]; then + LOCAL_CFLAGS="$LOCAL_CFLAGS --target=$HOST_PLATFORM -isysroot$MACOS_SDK -mmacosx-version-min=10.9" + BASE_HOST_CFLAGS="$BASE_HOST_OSX_CFLAGS --target=$HOST_PLATFORM" + fi fi rm genbindings_path_map_test_file.c @@ -68,16 +74,19 @@ rm genbindings_path_map_test_file.c case "$ENV_TARGET" in "x86_64"*) export RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=sandybridge" - export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -march=sandybridge -mcpu=sandybridge -mtune=sandybridge" + export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -march=sandybridge -mcpu=sandybridge -mtune=sandybridge" + export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS" ;; "aarch64_apple_darwin") export RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=apple-a14" - export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -mcpu=apple-a14" + export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -mcpu=apple-a14" + export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS" ;; *) # Assume this isn't targeted at another host and build for the host's CPU. export RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=native" - export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -mcpu=native" + export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -mcpu=native" + export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS" ;; esac @@ -147,7 +156,7 @@ function is_gnu_sed(){ function add_crate() { pushd "$LIGHTNING_PATH/$1" - RUSTC_BOOTSTRAP=1 cargo rustc --profile=check --no-default-features $3 -- --cfg=c_bindings -Zunpretty=expanded > /tmp/$1-crate-source.txt + RUSTC_BOOTSTRAP=1 cargo rustc --profile=check -Z avoid-dev-deps --no-default-features $3 -- --cfg=c_bindings -Zunpretty=expanded > /tmp/$1-crate-source.txt popd if [ "$HOST_OSX" = "true" ]; then sed -i".original" "1i\\ @@ -180,13 +189,15 @@ echo > /tmp/crate-source.txt if [ "$2" = "true" ]; then add_crate lightning lightning --features=std add_crate "lightning-persister" "lightning_persister" - add_crate "lightning-background-processor" "lightning_background_processor" + add_crate "lightning-background-processor" "lightning_background_processor" --features=std add_crate "lightning-invoice" "lightning_invoice" --features=std + add_crate "lightning-rapid-gossip-sync" "lightning_rapid_gossip_sync" --features=std CARGO_BUILD_ARGS="--features=std" else add_crate lightning lightning --features=no-std drop_crate "lightning-persister" - drop_crate "lightning-background-processor" + add_crate "lightning-background-processor" "lightning_background_processor" --features=no-std + add_crate "lightning-rapid-gossip-sync" "lightning_rapid_gossip_sync" --features=no-std add_crate "lightning-invoice" "lightning_invoice" --features=no-std CARGO_BUILD_ARGS="--features=no-std" fi @@ -209,7 +220,7 @@ EOF cd lightning-c-bindings RUSTFLAGS="$RUSTFLAGS --cfg=test_mod_pointers" cargo build $CARGO_BUILD_ARGS -if [ "$CFLAGS_aarch64_apple_darwin" != "" ]; then +if [ "$CFLAGS_aarch64_apple_darwin" != "" -a "$HOST_OSX" = "true" ]; then RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=apple-a14" cargo build $CARGO_BUILD_ARGS --target aarch64-apple-darwin fi cbindgen -v --config cbindgen.toml -o include/lightning.h >/dev/null 2>&1 @@ -220,6 +231,9 @@ cbindgen -v --config cbindgen.toml -o include/lightning.h >/dev/null 2>&1 if is_gnu_sed; then sed -i 's/typedef LDKnative.*Import.*LDKnative.*;//g' include/lightning.h + # UnsafeCell is `repr(transparent)` so should be ignored here + sed -i 's/LDKUnsafeCell<\(.*\)> /struct \1 /g' include/lightning.h + # stdlib.h doesn't exist in clang's wasm sysroot, and cbindgen # doesn't actually use it anyway, so drop the import. sed -i 's/#include /#include "ldk_rust_types.h"/g' include/lightning.h @@ -227,6 +241,9 @@ else # OSX sed is for some reason not compatible with GNU sed sed -i '' 's/typedef LDKnative.*Import.*LDKnative.*;//g' include/lightning.h + # UnsafeCell is `repr(transparent)` so should be ignored by cbindgen + sed -i '' 's/LDKUnsafeCell<\(.*\)> /struct \1 /g' include/lightning.h + # stdlib.h doesn't exist in clang's wasm sysroot, and cbindgen # doesn't actually use it anyway, so drop the import. sed -i '' 's/#include /#include "ldk_rust_types.h"/g' include/lightning.h @@ -267,7 +284,7 @@ while read LINE; do echo "Unable to find method declaration for $LINE" exit 1 fi - RETVAL="$(echo "$METHOD" | sed 's/[ ]*\([A-Za-z0-9 _]*\)(\*\(.*\)).*/\1/' | sed 's/^struct LDK/LDK::/g' | tr -d ' ')" + RETVAL="$(echo "$METHOD" | sed 's/[ ]*\([A-Za-z0-9 _]*\)(\*\(.*\)).*/\1/' | sed -E 's/^(struct|enum) LDK/LDK::/g' | tr -d ' ')" [ "$RETVAL" = "LDK::SecretKey" ] && RETVAL="LDKSecretKey" [ "$RETVAL" = "LDK::PublicKey" ] && RETVAL="LDKPublicKey" [ "$RETVAL" = "LDK::ThirtyTwoBytes" ] && RETVAL="LDKThirtyTwoBytes" @@ -331,9 +348,9 @@ fi if [ "$2" = "true" ]; then clang++ $LOCAL_CFLAGS -std=c++11 demo.cpp target/debug/libldk.a -ldl strip ./a.out + time ./a.out echo " C++ Bin size and runtime w/o optimization:" ls -lha a.out - time ./a.out > /dev/null fi # Then, check with memory sanitizer, if we're on Linux and have rustc nightly @@ -439,8 +456,8 @@ if [ "$CLANG" != "" -a "$CLANGPP" = "" ]; then echo "You should create a symlink called clang++-$RUSTC_LLVM_V pointing to $CLANG in $(dirname $CLANG)" fi -# Finally, if we're on OSX or on Linux, build the final debug binary with address sanitizer (and leave it there) -if [ "$HOST_PLATFORM" = "x86_64-unknown-linux-gnu" -o "$HOST_PLATFORM" = "x86_64-apple-darwin" ]; then +# Finally, if we're on Linux, build the final debug binary with address sanitizer (and leave it there) +if [ "$HOST_PLATFORM" = "x86_64-unknown-linux-gnu" ]; then if [ "$CLANGPP" != "" ]; then if is_gnu_sed; then sed -i.bk 's/,"cdylib"]/]/g' Cargo.toml @@ -449,9 +466,6 @@ if [ "$HOST_PLATFORM" = "x86_64-unknown-linux-gnu" -o "$HOST_PLATFORM" = "x86_64 sed -i .bk 's/,"cdylib"]/]/g' Cargo.toml fi - if [ "$CFLAGS_aarch64_apple_darwin" != "" ]; then - RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=apple-a14" RUSTC_BOOTSTRAP=1 cargo rustc $CARGO_BUILD_ARGS --target aarch64-apple-darwin -v -- -Zsanitizer=address -Cforce-frame-pointers=yes || ( mv Cargo.toml.bk Cargo.toml; exit 1) - fi RUSTFLAGS="$RUSTFLAGS --cfg=test_mod_pointers" RUSTC_BOOTSTRAP=1 cargo rustc $CARGO_BUILD_ARGS -v -- -Zsanitizer=address -Cforce-frame-pointers=yes || ( mv Cargo.toml.bk Cargo.toml; exit 1) mv Cargo.toml.bk Cargo.toml @@ -473,7 +487,7 @@ if [ "$HOST_PLATFORM" = "x86_64-unknown-linux-gnu" -o "$HOST_PLATFORM" = "x86_64 echo "WARNING: Please install clang-$RUSTC_LLVM_V and clang++-$RUSTC_LLVM_V to build with address sanitizer" fi else - echo "WARNING: Can't use address sanitizer on non-Linux, non-OSX non-x86 platforms" + echo "WARNING: Can't use address sanitizer on non-Linux, non-x86 platforms" fi # Now build with LTO on on both C++ and rust, but without cross-language LTO: @@ -485,9 +499,9 @@ if [ "$2" = "true" ]; then fi strip ./a.out +time ./a.out echo "C++ Bin size and runtime with only RL (LTO) optimized:" ls -lha a.out -time ./a.out > /dev/null if [ "$CLANGPP" != "" ]; then # If we can use cross-language LTO, use it for building C dependencies (i.e. libsecp256k1) as well @@ -495,7 +509,7 @@ if [ "$CLANGPP" != "" ]; then # The cc-rs crate tries to force -fdata-sections and -ffunction-sections on, which # breaks -fembed-bitcode, so we turn off cc-rs' default flags and specify exactly # what we want here. - export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -fPIC -fembed-bitcode -march=sandybridge -mcpu=sandybridge -mtune=sandybridge" + export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -fPIC -fembed-bitcode" export CRATE_CC_NO_DEFAULTS=true fi @@ -504,9 +518,9 @@ if [ "$2" = "false" -a "$(rustc --print target-list | grep wasm32-wasi)" != "" ] echo "int main() {}" > genbindings_wasm_test_file.c if clang -nostdlib -o /dev/null --target=wasm32-wasi -Wl,--no-entry genbindings_wasm_test_file.c > /dev/null 2>&1; then # And if it does, build a WASM binary without capturing errors - export CFLAGS_wasm32_wasi="$BASE_CFLAGS -target wasm32 -O1" + export CFLAGS_wasm32_wasi="$BASE_CFLAGS -target wasm32-wasi -O1" RUSTFLAGS="$BASE_RUSTFLAGS -C opt-level=1 --cfg=test_mod_pointers" cargo build $CARGO_BUILD_ARGS -v --target=wasm32-wasi - export CFLAGS_wasm32_wasi="$BASE_CFLAGS -fembed-bitcode -target wasm32 -Oz" + export CFLAGS_wasm32_wasi="$BASE_CFLAGS -fembed-bitcode -target wasm32-wasi -Oz" RUSTFLAGS="$BASE_RUSTFLAGS -C embed-bitcode=yes -C opt-level=z -C linker-plugin-lto -C lto" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target=wasm32-wasi else echo "Cannot build WASM lib as clang does not seem to support the wasm32-wasi target" @@ -536,34 +550,44 @@ if [ "$CLANGPP" != "" -a "$LLD" != "" ]; then # packaging than simply shipping the rustup binaries (eg Debian should Just Work # here). LINK_ARG_FLAGS="-C link-arg=-fuse-ld=$LLD" - if [ "$HOST_OSX" = "true" ]; then - export LDK_CLANG_PATH=$(which $CLANG) + export LDK_CLANG_PATH=$(which $CLANG) + if [ "$MACOS_SDK" != "" ]; then export CLANG="$(pwd)/../deterministic-build-wrappers/clang-lto-link-osx" - for ARG in "CFLAGS_aarch64_apple_darwin"; do + for ARG in $CFLAGS_aarch64_apple_darwin; do MANUAL_LINK_CFLAGS="$MANUAL_LINK_CFLAGS -C link-arg=$ARG" done export CFLAGS_aarch64_apple_darwin="$CFLAGS_aarch64_apple_darwin -O3 -fPIC -fembed-bitcode" - LINK_ARG_FLAGS="$LINK_ARG_FLAGS -C link-arg="-isysroot$(xcrun --show-sdk-path)" -C link-arg=-mmacosx-version-min=10.9" - RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=apple-a14 -C embed-bitcode=yes -C linker-plugin-lto -C lto -C linker=$CLANG $LINK_ARG_FLAGS -C link-arg=-mcpu=apple-a14" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target aarch64-apple-darwin + RUSTC_BOOTSTRAP=1 RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=apple-a14 -C embed-bitcode=yes -C linker-plugin-lto -C lto -C linker=$CLANG $MANUAL_LINK_CFLAGS $LINK_ARG_FLAGS -C link-arg=-mcpu=apple-a14" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target aarch64-apple-darwin -Zbuild-std=std,panic_abort + if [ "$HOST_OSX" != "true" ]; then + # If we're not on OSX but can build OSX binaries, build the x86_64 OSX release now + MANUAL_LINK_CFLAGS="" + for ARG in $CFLAGS_x86_64_apple_darwin; do + MANUAL_LINK_CFLAGS="$MANUAL_LINK_CFLAGS -C link-arg=$ARG" + done + export CFLAGS_x86_64_apple_darwin="$CFLAGS_x86_64_apple_darwin -O3 -fPIC -fembed-bitcode" + RUSTC_BOOTSTRAP=1 RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=sandybridge -C embed-bitcode=yes -C linker-plugin-lto -C lto -C linker=$CLANG $MANUAL_LINK_CFLAGS $LINK_ARG_FLAGS -C link-arg=-mcpu=sandybridge -C link-arg=-mtune=sandybridge" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target x86_64-apple-darwin -Zbuild-std=std,panic_abort + fi fi # If we're on an M1 don't bother building X86 binaries if [ "$HOST_PLATFORM" != "aarch64-apple-darwin" ]; then - export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -O3 -fPIC -fembed-bitcode -march=sandybridge -mcpu=sandybridge -mtune=sandybridge" + [ "$HOST_OSX" != "true" ] && export CLANG="$LDK_CLANG_PATH" + export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -O3 -fPIC -fembed-bitcode" # Rust doesn't recognize CFLAGS changes, so we need to clean build artifacts cargo clean --release CARGO_PROFILE_RELEASE_LTO=true RUSTFLAGS="$RUSTFLAGS -C embed-bitcode=yes -C linker-plugin-lto -C lto -C linker=$CLANG $LINK_ARG_FLAGS -C link-arg=-march=sandybridge -C link-arg=-mcpu=sandybridge -C link-arg=-mtune=sandybridge" cargo build $CARGO_BUILD_ARGS -v --release if [ "$2" = "true" ]; then - $CLANGPP $LOCAL_CFLAGS -flto -fuse-ld=$LLD -O2 demo.cpp target/release/libldk.a -ldl + $CLANGPP $LOCAL_CFLAGS -flto -fuse-ld=$LLD -O2 -c demo.cpp -o demo.o + $CLANGPP $LOCAL_CFLAGS -flto -fuse-ld=$LLD -Wl,--lto-O2 -Wl,-O2 -O2 demo.o target/release/libldk.a -ldl strip ./a.out + time ./a.out echo "C++ Bin size and runtime with cross-language LTO:" ls -lha a.out - time ./a.out > /dev/null fi fi else if [ "$CFLAGS_aarch64_apple_darwin" != "" ]; then RUSTFLAGS="$BASE_RUSTFLAGS -C embed-bitcode=yes -C lto -C target-cpu=apple-a14" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target aarch64-apple-darwin fi - echo "WARNING: Building with cross-language LTO is not avilable without clang-$RUSTC_LLVM_V" + echo "WARNING: Building with cross-language LTO is not avilable without clang-$RUSTC_LLVM_V and lld-$RUSTC_LLVM_V" fi