X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=genbindings.sh;h=dcfc5ac9a3199593c0cb0b33bd399a276b4f59ad;hb=73fe6e643d55ca08c900f30fb0f68819015c1398;hp=b7d7566a081b7cffb1d95c8f080d84f971c13183;hpb=05557192c52dbcce57a8ab5b3a27e622e55c5a9b;p=ldk-c-bindings diff --git a/genbindings.sh b/genbindings.sh index b7d7566..dcfc5ac 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 @@ -141,9 +150,13 @@ OUT_F="$(pwd)/lightning-c-bindings/include/ldk_rust_types.h" OUT_CPP="$(pwd)/lightning-c-bindings/include/lightningpp.hpp" BIN="$(pwd)/c-bindings-gen/target/release/c-bindings-gen" +function is_gnu_sed(){ + sed --version >/dev/null 2>&1 +} + 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\\ @@ -155,20 +168,20 @@ pub mod $2 { echo "}" >> /tmp/$1-crate-source.txt cat /tmp/$1-crate-source.txt >> /tmp/crate-source.txt rm /tmp/$1-crate-source.txt - if [ "$HOST_OSX" = "true" ]; then + if is_gnu_sed; then + sed -E -i 's|#*'$1' = \{ .*|'$1' = \{ path = "'"$LIGHTNING_PATH"'/'$1'", default-features = false }|' lightning-c-bindings/Cargo.toml + else # OSX sed is for some reason not compatible with GNU sed sed -E -i '' 's|#*'$1' = \{ .*|'$1' = \{ path = "'"$LIGHTNING_PATH"'/'$1'", default-features = false }|' lightning-c-bindings/Cargo.toml - else - sed -E -i 's|#*'$1' = \{ .*|'$1' = \{ path = "'"$LIGHTNING_PATH"'/'$1'", default-features = false }|' lightning-c-bindings/Cargo.toml fi } function drop_crate() { - if [ "$HOST_OSX" = "true" ]; then + if is_gnu_sed; then + sed -E -i 's|'$1' = \{ (.*)|#'$1' = \{ \1|' lightning-c-bindings/Cargo.toml + else # OSX sed is for some reason not compatible with GNU sed sed -E -i '' 's|'$1' = \{ (.*)|#'$1' = \{ \1|' lightning-c-bindings/Cargo.toml - else - sed -E -i 's|'$1' = \{ (.*)|#'$1' = \{ \1|' lightning-c-bindings/Cargo.toml fi } @@ -176,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 @@ -205,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 @@ -213,22 +228,29 @@ cbindgen -v --config cbindgen.toml -o include/lightning.h >/dev/null 2>&1 # cbindgen is relatively braindead when exporting typedefs - # it happily exports all our typedefs for private types, even with the # generics we specified in C mode! So we drop all those types manually here. -if [ "$HOST_OSX" = "true" ]; then - # OSX sed is for some reason not compatible with GNU sed - sed -i '' 's/typedef LDKnative.*Import.*LDKnative.*;//g' include/lightning.h +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 + sed -i 's/#include /#include "ldk_rust_types.h"/g' include/lightning.h else - sed -i 's/typedef LDKnative.*Import.*LDKnative.*;//g' include/lightning.h + # 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 + sed -i '' 's/#include /#include "ldk_rust_types.h"/g' include/lightning.h fi # Build C++ class methods which call trait methods +echo "Updating C++ header, this may take some time, especially on macOS" set +x # Echoing every command is very verbose here OLD_IFS="$IFS" export IFS='' @@ -262,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" @@ -326,18 +348,38 @@ 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 +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 + 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 if cargo +nightly --version >/dev/null 2>&1; 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, @@ -434,18 +476,16 @@ 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 [ "$HOST_OSX" = "true" ]; then + if is_gnu_sed; then + sed -i.bk 's/,"cdylib"]/]/g' Cargo.toml + else # OSX sed is for some reason not compatible with GNU sed sed -i .bk 's/,"cdylib"]/]/g' Cargo.toml - else - 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 @@ -467,7 +507,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: @@ -479,9 +519,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 @@ -489,7 +529,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 @@ -498,9 +538,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" @@ -530,31 +570,45 @@ 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 + REALLY_PIN_CC 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 --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="" + 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 --offline -v --release --target x86_64-apple-darwin -Zbuild-std=std,panic_abort + fi fi - export CFLAGS_$ENV_TARGET="$BASE_HOST_CFLAGS -O3 -fPIC -fembed-bitcode -march=sandybridge -mcpu=sandybridge -mtune=sandybridge" - # 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 - strip ./a.out - echo "C++ Bin size and runtime with cross-language LTO:" - ls -lha a.out - time ./a.out > /dev/null + # If we're on an M1 don't bother building X86 binaries + if [ "$HOST_PLATFORM" != "aarch64-apple-darwin" ]; then + [ "$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 -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 + 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