exit 1
fi
+SKIP_TESTS_ARGUMENT=$3
+RUN_CPP_TESTS=true
+
+if [ ! -z "$SKIP_TESTS_ARGUMENT" ]; then
+ if [ "$SKIP_TESTS_ARGUMENT" != "skip-tests" ]; then
+ echo "To skip tests, usage must be: $0 path-to-rust-lightning allow-std skip-tests"
+ exit 1
+ else
+ RUN_CPP_TESTS=false
+ fi
+fi
+
export LC_ALL=C
# On reasonable systems, we can use realpath here, but OSX is a diva with 20-year-old software.
case "$ENV_TARGET" in
"x86_64"*)
export RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=sandybridge"
- export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -march=sandybridge -mcpu=sandybridge -mtune=sandybridge"
+ export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -march=sandybridge -mtune=sandybridge"
export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS"
;;
"aarch64_apple_darwin")
*)
# Assume this isn't targeted at another host and build for the host's CPU.
export RUSTFLAGS="$BASE_RUSTFLAGS -C target-cpu=native"
- export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -mcpu=native"
+ export BASE_HOST_CFLAGS="$BASE_HOST_CFLAGS -march=native -mtune=native"
export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS"
;;
esac
set -x
mv include/lightningpp_new.hpp include/lightningpp.hpp
-# Finally, sanity-check the generated C and C++ bindings with demo apps:
-# Naively run the C demo app:
-gcc $LOCAL_CFLAGS -Wall -g -pthread demo.c target/debug/libldk.a -ldl -lm
-./a.out
+if $RUN_CPP_TESTS; then
+ # Finally, sanity-check the generated C and C++ bindings with demo apps:
+ # Naively run the C demo app:
+ gcc $LOCAL_CFLAGS -Wall -g -pthread demo.c target/debug/libldk.a -ldl -lm
+ ./a.out
+
+ # And run the C++ demo app
+ if [ "$2" = "true" ]; then
+ g++ $LOCAL_CFLAGS -std=c++11 -Wall -g -pthread demo.cpp -Ltarget/debug/ -lldk -ldl
+ LD_LIBRARY_PATH=target/debug/ ./a.out > /dev/null
+ fi
+
+ # Finally, run the C++ demo app with our native networking library
+ # in valgrind to test memory model correctness and lack of leaks.
+ gcc $LOCAL_CFLAGS -fPIC -std=c99 -Wall -g -pthread -I../ldk-net ../ldk-net/ldk_net.c -c -o ldk_net.o
+ if [ "$2" = "true" ]; then
+ g++ $LOCAL_CFLAGS -std=c++11 -Wall -g -pthread -DREAL_NET -I../ldk-net ldk_net.o demo.cpp target/debug/libldk.a -ldl -lm
+ if [ -x "`which valgrind`" -a "$(uname -m)" != "ppc64le" ]; then
+ valgrind --error-exitcode=4 --memcheck:leak-check=full --show-leak-kinds=all ./a.out
+ echo
+ else
+ echo "WARNING: Please install valgrind for more testing"
+ ./a.out
+ fi
+ fi
+
+
+ # Test a statically-linked C++ version, tracking the resulting binary size and runtime
+ # across debug, LTO, and cross-language LTO builds (using the same compiler each time).
+ 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
+ fi
-# And run the C++ demo app
-if [ "$2" = "true" ]; then
- g++ $LOCAL_CFLAGS -std=c++11 -Wall -g -pthread demo.cpp -Ltarget/debug/ -lldk -ldl
- LD_LIBRARY_PATH=target/debug/ ./a.out > /dev/null
+else
+ echo "Skipping tests!"
fi
-# Finally, run the C++ demo app with our native networking library
-# in valgrind to test memory model correctness and lack of leaks.
-gcc $LOCAL_CFLAGS -fPIC -std=c99 -Wall -g -pthread -I../ldk-net ../ldk-net/ldk_net.c -c -o ldk_net.o
-if [ "$2" = "true" ]; then
- g++ $LOCAL_CFLAGS -std=c++11 -Wall -g -pthread -DREAL_NET -I../ldk-net ldk_net.o demo.cpp target/debug/libldk.a -ldl -lm
- if [ -x "`which valgrind`" -a "$(uname -m)" != "ppc64le" ]; then
- valgrind --error-exitcode=4 --memcheck:leak-check=full --show-leak-kinds=all ./a.out
- echo
- else
- echo "WARNING: Please install valgrind for more testing"
- ./a.out
+function REALLY_PIN_CC {
+ # -Zbuild-std fails if we have any dependencies of build-deps, which
+ # cc added in 1.0.80, thus we pin back to 1.0.79 to avoid that.
+ cargo update -p cc --precise "1.0.79" --verbose
+ ( cargo build --features=std -v --release -Zbuild-std=std,panic_abort > /dev/null 2>&1 ) || echo -n
+ ( cargo build --features=std -v --release --target aarch64-apple-darwin -Zbuild-std=std,panic_abort > /dev/null 2>&1 ) || echo -n
+ # Sadly, std also depends on cc, and we can't pin it in that tree
+ # directly. Instead, we have to delete the file out of the cargo
+ # registry and build --offline to avoid it using the latest version.
+ NEW_CC_DEP="$CARGO_HOME"
+ [ "$NEW_CC_DEP" = "" ] && NEW_CC_DEP="$HOME"
+ if [ -f "$NEW_CC_DEP/.cargo/registry/cache/github.com-"*/cc-1.0.79.crate ]; then
+ mv "$NEW_CC_DEP/.cargo/registry/cache/github.com-"*/cc-1.0.79.crate ./
fi
-fi
-
-
-# Test a statically-linked C++ version, tracking the resulting binary size and runtime
-# across debug, LTO, and cross-language LTO builds (using the same compiler each time).
-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
-fi
+ rm -f "$NEW_CC_DEP/.cargo/registry/cache/github.com-"*/cc-*.crate
+ [ -f ./cc-1.0.79.crate ] && mv ./cc-1.0.79.crate "$NEW_CC_DEP/.cargo/registry/cache/github.com-"*/
+}
# Then, check with memory sanitizer, if we're on Linux and have rustc nightly
if [ "$HOST_PLATFORM" = "x86_64-unknown-linux-gnu" ]; then
LLVM_V=$(rustc +nightly --version --verbose | grep "LLVM version" | awk '{ print substr($3, 0, 2); }')
if [ -x "$(which clang-$LLVM_V)" ]; then
cargo +nightly clean
- cargo +nightly rustc $CARGO_BUILD_ARGS -Zbuild-std=std,panic_abort --target x86_64-unknown-linux-gnu -v -- -Zsanitizer=memory -Zsanitizer-memory-track-origins -Cforce-frame-pointers=yes
+
+ REALLY_PIN_CC
+ cargo +nightly rustc --offline $CARGO_BUILD_ARGS -Zbuild-std=std,panic_abort --target x86_64-unknown-linux-gnu -v -- -Zsanitizer=memory -Zsanitizer-memory-track-origins -Cforce-frame-pointers=yes
mv target/x86_64-unknown-linux-gnu/debug/libldk.* target/debug/
# Sadly, std doesn't seem to compile into something that is memsan-safe as of Aug 2020,
fi
fi
else
- CLANG_LLVM_V=$(clang --version | head -n1 | awk '{ print substr($4, 0, 2); }')
+ # Output is something like clang version 17.0.3 (Fedora 17.0.3-1.fc39) or Debian clang version 14.0.6
+ CLANG_LLVM_V=$(clang --version | head -n1 | awk '{ print substr($3, 0, 2); }')
+ [ "$CLANG_LLVM_V" = "ve" ] && CLANG_LLVM_V=$(clang --version | head -n1 | awk '{ print substr($4, 0, 2); }')
if [ -x "$(which ld.lld)" ]; then
LLD_LLVM_V="$(ld.lld --version | awk '{ print $2; }')"
if [ "$LLD_LLVM_V" = "LLD" ]; then # eg if the output is "Debian LLD ..."
EXTRA_TARGETS=( $LDK_C_BINDINGS_EXTRA_TARGETS )
EXTRA_CCS=( $LDK_C_BINDINGS_EXTRA_TARGET_CCS )
+EXTRA_LINK_LTO=( $LDK_C_BINDINGS_EXTRA_TARGET_LINK_LTO )
if [ ${#EXTRA_TARGETS[@]} != ${#EXTRA_CCS[@]} ]; then
echo "LDK_C_BINDINGS_EXTRA_TARGETS and LDK_C_BINDINGS_EXTRA_TARGET_CCS didn't have the same number of elements!"
EXTRA_ENV_TARGET=$(echo "${EXTRA_TARGETS[$IDX]}" | sed 's/-/_/g')
export CFLAGS_$EXTRA_ENV_TARGET="$BASE_CFLAGS"
export CC_$EXTRA_ENV_TARGET=${EXTRA_CCS[$IDX]}
- RUSTFLAGS="$BASE_RUSTFLAGS -C embed-bitcode=yes -C lto -C linker=${EXTRA_CCS[$IDX]}" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target "${EXTRA_TARGETS[$IDX]}"
+ EXTRA_RUSTFLAGS=""
+ case "$EXTRA_ENV_TARGET" in
+ "x86_64"*)
+ export CFLAGS_$EXTRA_ENV_TARGET="$BASE_CFLAGS -march=sandybridge -mtune=sandybridge"
+ EXTRA_RUSTFLAGS="-C target-cpu=sandybridge"
+ ;;
+ esac
+ [ "${EXTRA_LINK_LTO[$IDX]}" != "" ] && EXTRA_RUSTFLAGS="-C linker-plugin-lto"
+ RUSTFLAGS="$BASE_RUSTFLAGS -C embed-bitcode=yes -C lto -C linker=${EXTRA_CCS[$IDX]} $EXTRA_RUSTFLAGS" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS -v --release --target "${EXTRA_TARGETS[$IDX]}"
done
if [ "$CLANGPP" != "" -a "$LLD" != "" ]; then
LINK_ARG_FLAGS="-C link-arg=-fuse-ld=$LLD"
export LDK_CLANG_PATH=$(which $CLANG)
if [ "$MACOS_SDK" != "" ]; then
+ REALLY_PIN_CC
export CLANG="$(pwd)/../deterministic-build-wrappers/clang-lto-link-osx"
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"
- 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
+ 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 --offline -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=""
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
+ 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=-march=sandybridge -C link-arg=-mtune=sandybridge" CARGO_PROFILE_RELEASE_LTO=true cargo build $CARGO_BUILD_ARGS --offline -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
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
+ 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=-mtune=sandybridge" cargo build $CARGO_BUILD_ARGS -v --release
if [ "$2" = "true" ]; then
$CLANGPP $LOCAL_CFLAGS -flto -fuse-ld=$LLD -O2 -c demo.cpp -o demo.o