[TS] Handle from-hu string array conversions
[ldk-java] / genbindings.sh
index 5576b8dba3f17c93d7bf958aa02417de3dcbd60e..fbc237f74747507ee3406b31f49666593d21b983 100755 (executable)
@@ -6,6 +6,7 @@ usage() {
        echo "debug should either be true, false, or leaks"
        echo "debug of leaks turns on leak tracking on an optimized release bianry"
        echo "android_web should either be true or false and indicates if we build for android (Java) or web (WASM)"
        echo "debug should either be true, false, or leaks"
        echo "debug of leaks turns on leak tracking on an optimized release bianry"
        echo "android_web should either be true or false and indicates if we build for android (Java) or web (WASM)"
+       echo "Note that web currently generates the same results as !web (ie Node.JS)"
        exit 1
 }
 [ "$1" = "" ] && usage
        exit 1
 }
 [ "$1" = "" ] && usage
@@ -15,65 +16,227 @@ usage() {
 set -e
 set -x
 
 set -e
 set -x
 
-if [ "$CC" != "" ]; then
-       COMMON_COMPILE="$CC -std=c11 -Wall -Wextra -Wno-unused-parameter -Wno-ignored-qualifiers -Wno-unused-function -Wno-nullability-completeness -Wno-pointer-sign -Wdate-time -ffile-prefix-map=$(pwd)="
-else
+function is_gnu_sed(){
+  sed --version >/dev/null 2>&1
+}
+
+if [ "$CC" = "" ]; then
        CC=clang
        CC=clang
-       COMMON_COMPILE="clang -std=c11 -Wall -Wextra -Wno-unused-parameter -Wno-ignored-qualifiers -Wno-unused-function -Wno-nullability-completeness -Wno-pointer-sign -Wdate-time -ffile-prefix-map=$(pwd)="
 fi
 
 fi
 
+TARGET_STRING="$LDK_TARGET"
+if [ "$TARGET_STRING" = "" ]; then
+       # We assume clang-style $CC --version here, but worst-case we just get an empty suffix
+       TARGET_STRING="$($CC --version | grep Target | awk '{ print $2 }')"
+fi
+
+IS_MAC=false
+[ "$($CC --version | grep apple-darwin)" != "" ] && IS_MAC=true
+IS_APPLE_CLANG=false
+[ "$($CC --version | grep "Apple clang version")" != "" ] && IS_APPLE_CLANG=true
+
+case "$TARGET_STRING" in
+       "x86_64-pc-linux"*)
+               LDK_TARGET_SUFFIX="_Linux-amd64"
+               LDK_JAR_TARGET=true
+               ;;
+       "x86_64-apple-darwin"*)
+               LDK_TARGET_SUFFIX="_MacOSX-x86_64"
+               LDK_JAR_TARGET=true
+               IS_MAC=true
+               ;;
+       "aarch64-apple-darwin"*)
+               LDK_TARGET_CPU="apple-a14"
+               LDK_TARGET_SUFFIX="_MacOSX-aarch64"
+               LDK_JAR_TARGET=true
+               IS_MAC=true
+               ;;
+       *)
+               LDK_TARGET_SUFFIX="_${TARGET_STRING}"
+esac
+if [ "$LDK_TARGET_CPU" = "" ]; then
+       LDK_TARGET_CPU="sandybridge"
+fi
+
+COMMON_COMPILE="$CC -std=c11 -Wall -Wextra -Wno-unused-parameter -Wno-ignored-qualifiers -Wno-unused-function -Wno-nullability-completeness -Wno-pointer-sign -Wdate-time -ffile-prefix-map=$(pwd)="
+[ "$IS_MAC" = "true" -a "$2" != "wasm" ] && COMMON_COMPILE="$COMMON_COMPILE --target=$TARGET_STRING -mcpu=$LDK_TARGET_CPU"
+
 DEBUG_ARG="$3"
 if [ "$3" = "leaks" ]; then
        DEBUG_ARG="true"
 fi
 
 cp "$1/lightning-c-bindings/include/lightning.h" ./
 DEBUG_ARG="$3"
 if [ "$3" = "leaks" ]; then
        DEBUG_ARG="true"
 fi
 
 cp "$1/lightning-c-bindings/include/lightning.h" ./
-if [ "$(rustc --version --verbose | grep "host:")" = "host: x86_64-apple-darwin" ]; then
-       # OSX sed is for some reason not compatible with GNU sed
-       sed -i '' "s/TransactionOutputs/C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ/g" ./lightning.h
+if is_gnu_sed; then
+       sed -i "s/TransactionOutputs/C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ/g" ./lightning.h
 else
 else
-       sed -i "s/TransactionOutputs/C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZ/g" ./lightning.h
+       # OSX sed is for some reason not compatible with GNU sed
+       sed -i '' "s/TransactionOutputs/C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZ/g" ./lightning.h
+fi
+echo "#define LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ" > header.c
+echo "#define CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free" >> header.c
+
+
+if [ "$LDK_GARBAGECOLLECTED_GIT_OVERRIDE" = "" ]; then
+       export LDK_GARBAGECOLLECTED_GIT_OVERRIDE=$(git describe --tag --dirty)
+fi
+if [ "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:0:1}" != "v" ]; then
+       echo "Version tag should start with a v" > /dev/stderr
+       exit 1
 fi
 
 fi
 
-if [ "$2" != "wasm" ]; then
-       TARGET_STRING="$LDK_TARGET"
-       if [ "$TARGET_STRING" = "" ]; then
-               # We assume clang-style $CC --version here, but worst-case we just get an empty suffix
-               TARGET_STRING="$($CC --version | grep Target | awk '{ print $2 }')"
+
+if [ "$2" = "c_sharp" ]; then
+       echo "Creating C# bindings..."
+       mkdir -p c_sharp/src/org/ldk/{enums,structs,impl}
+       rm -f c_sharp/src/org/ldk/{enums,structs,impl}/*.cs
+       ./genbindings.py "./lightning.h" c_sharp/src/org/ldk/impl c_sharp/src/org/ldk c_sharp/ $DEBUG_ARG c_sharp $4 $TARGET_STRING
+       rm -f c_sharp/bindings.c
+       if [ "$3" = "true" ]; then
+               echo "#define LDK_DEBUG_BUILD" > c_sharp/bindings.c
+       elif [ "$3" = "leaks" ]; then
+               # For leak checking we use release libldk which doesn't expose
+               # __unmangle_inner_ptr, but the C code expects to be able to call it.
+               echo "#define __unmangle_inner_ptr(a) (a)" > c_sharp/bindings.c
        fi
        fi
-       case "$TARGET_STRING" in
-               "x86_64-pc-linux"*)
-                       LDK_TARGET_SUFFIX="_Linux-amd64"
-                       LDK_JAR_TARGET=true
-                       ;;
-               "x86_64-apple-darwin"*)
-                       LDK_TARGET_SUFFIX="_MacOSX-x86_64"
-                       LDK_JAR_TARGET=true
-                       ;;
-               "aarch64-apple-darwin"*)
-                       LDK_TARGET_SUFFIX="_MacOSX-aarch64"
-                       LDK_JAR_TARGET=true
-                       ;;
-               *)
-                       LDK_TARGET_SUFFIX="_${TARGET_STRING}"
-       esac
-       if [ "$LDK_TARGET_CPU" = "" ]; then
-               LDK_TARGET_CPU="sandybridge"
+       cat header.c >> c_sharp/bindings.c
+       cat header.c >> c_sharp/bindings.c
+       cat c_sharp/bindings.c.body >> c_sharp/bindings.c
+
+       IS_MAC=false
+       [ "$($CC --version | grep apple-darwin)" != "" ] && IS_MAC=true
+       IS_APPLE_CLANG=false
+       [ "$($CC --version | grep "Apple clang version")" != "" ] && IS_APPLE_CLANG=true
+
+       # Compiling C# bindings with Mono
+       MONO_COMPILE="-out:csharpldk.dll -langversion:3 -t:library c_sharp/src/org/ldk/enums/*.cs c_sharp/src/org/ldk/impl/*.cs c_sharp/src/org/ldk/util/*.cs c_sharp/src/org/ldk/structs/*.cs"
+       if [ "$3" = "true" ]; then
+               mono-csc $MONO_COMPILE
+       else
+               mono-csc -o $MONO_COMPILE
        fi
 
        fi
 
-       if [ "$LDK_GARBAGECOLLECTED_GIT_OVERRIDE" = "" ]; then
-               export LDK_GARBAGECOLLECTED_GIT_OVERRIDE=$(git describe --tag --dirty)
+       echo "Building C# bindings..."
+       COMPILE="$COMMON_COMPILE -Isrc/main/jni -pthread -fPIC"
+       LINK="-ldl -shared"
+       [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
+       [ "$IS_MAC" = "true" ] && COMPILE="$COMPILE -mmacosx-version-min=10.9"
+       [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -fuse-ld=lld"
+       [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && echo "WARNING: Need at least upstream clang 13!"
+       [ "$IS_MAC" = "false" -a "$3" != "false" ] && LINK="$LINK -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,malloc -Wl,-wrap,free"
+
+       exit 0 # Sadly compilation doesn't currently work
+       if [ "$3" = "true" ]; then
+               $COMPILE $LINK -o liblightningjni_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ $2 c_sharp/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
+       else
+               $COMPILE -o bindings.o -c -flto -O3 -I"$1"/lightning-c-bindings/include/ $2 c_sharp/bindings.c
+               $COMPILE $LINK -o liblightningjni_release$LDK_TARGET_SUFFIX.so -flto -O3 -Wl,--lto-O3 -Wl,-O3 -Wl,--version-script=c_sharp/libcode.version -I"$1"/lightning-c-bindings/include/ $2 bindings.o "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a -lm
+               [ "$IS_APPLE_CLANG" != "true" ] && llvm-strip liblightningjni_release$LDK_TARGET_SUFFIX.so
        fi
        fi
-       if [ "${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:0:1}" != "v" ]; then
-               echo "Version tag should start with a v" > /dev/stderr
-               exit 1
+elif [ "$2" = "python" ]; then
+       echo "Creating Python bindings..."
+       mkdir -p python/src/{enums,structs,impl}
+       rm -f python/src/{enums,structs,impl}/*.py
+       ./genbindings.py "./lightning.h" python/src/impl python/src python/ $DEBUG_ARG python $4 $TARGET_STRING
+       rm -f python/bindings.c
+       if [ "$3" = "true" ]; then
+               echo "#define LDK_DEBUG_BUILD" > python/bindings.c
+       elif [ "$3" = "leaks" ]; then
+               # For leak checking we use release libldk which doesn't expose
+               # __unmangle_inner_ptr, but the C code expects to be able to call it.
+               echo "#define __unmangle_inner_ptr(a) (a)" > python/bindings.c
        fi
        fi
+       echo "#define LDKCVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ" >> python/bindings.c
+       echo "#define CVec_C2Tuple_ThirtyTwoBytesCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free" >> python/bindings.c
+       cat python/bindings.c.body >> python/bindings.c
 
 
-       if [ "$(rustc --version --verbose | grep "host:")" = "host: x86_64-apple-darwin" ]; then
-               # OSX sed is for some reason not compatible with GNU sed
-               sed -i '' "s/^    <version>.*<\/version>/    <version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" pom.xml
+       IS_MAC=false
+       [ "$($CC --version | grep apple-darwin)" != "" ] && IS_MAC=true
+       IS_APPLE_CLANG=false
+       [ "$($CC --version | grep "Apple clang version")" != "" ] && IS_APPLE_CLANG=true
+
+       echo "Building Python bindings..."
+       COMPILE="$COMMON_COMPILE -Isrc/main/jni -pthread -fPIC"
+       LINK="-ldl -shared"
+       [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
+       [ "$IS_MAC" = "true" ] && COMPILE="$COMPILE -mmacosx-version-min=10.9"
+       [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -fuse-ld=lld"
+       [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && echo "WARNING: Need at least upstream clang 13!"
+       [ "$IS_MAC" = "false" -a "$3" != "false" ] && LINK="$LINK -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,malloc -Wl,-wrap,free"
+
+       exit 0 # Sadly compilation doesn't currently work
+       if [ "$3" = "true" ]; then
+               $COMPILE $LINK -o liblightningpython_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ $2 c_sharp/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
+       else
+               $COMPILE -o bindings.o -c -flto -O3 -I"$1"/lightning-c-bindings/include/ $2 c_sharp/bindings.c
+               $COMPILE $LINK -o liblightningpython_release$LDK_TARGET_SUFFIX.so -Wl,--version-script=python/libcode.version -flto -O3 -Wl,--lto-O3 -Wl,-O3 -I"$1"/lightning-c-bindings/include/ $2 bindings.o "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a -lm
+               [ "$IS_APPLE_CLANG" != "true" ] && llvm-strip liblightningpython_release$LDK_TARGET_SUFFIX.so
+       fi
+elif [ "$2" = "wasm" ]; then
+       echo "Creating TS bindings..."
+       mkdir -p ts/{enums,structs}
+       rm -f ts/{enums,structs,}/*.{mjs,mts,mts.part}
+       if [ "$4" = "false" ]; then
+               ./genbindings.py "./lightning.h" ts ts ts $DEBUG_ARG typescript node wasm
+       else
+               ./genbindings.py "./lightning.h" ts ts ts $DEBUG_ARG typescript browser wasm
+       fi
+       rm -f ts/bindings.c
+       sed -i 's/^  "version": .*/  "version": "'${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}'",/g' ts/package.json
+       sed -i 's/^  "version": .*/  "version": "'${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}'",/g' node-net/package.json
+       sed -i 's/^    "lightningdevkit": .*/    "lightningdevkit": "'${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}'"/g' node-net/package.json
+       if [ "$3" = "true" ]; then
+               echo "#define LDK_DEBUG_BUILD" > ts/bindings.c
+       elif [ "$3" = "leaks" ]; then
+               # For leak checking we use release libldk which doesn't expose
+               # __unmangle_inner_ptr, but the C code expects to be able to call it.
+               echo "#define __unmangle_inner_ptr(a) (a)" > ts/bindings.c
+       fi
+       cat header.c >> ts/bindings.c
+       cat ts/bindings.c.body >> ts/bindings.c
+
+       echo "Building TS bindings..."
+       COMPILE="$COMMON_COMPILE -flto -Wl,--no-entry -nostdlib --target=wasm32-wasi -Wl,-z -Wl,stack-size=$((8*1024*1024)) -Wl,--initial-memory=$((16*1024*1024)) -Wl,--max-memory=$((1024*1024*1024)) -Wl,--global-base=4096"
+       # We only need malloc and assert/abort, but for now just use WASI for those:
+       EXTRA_LINK=/usr/lib/wasm32-wasi/libc.a
+       [ "$3" != "false" ] && COMPILE="$COMPILE -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,reallocarray -Wl,-wrap,malloc -Wl,-wrap,aligned_alloc -Wl,-wrap,free"
+       if [ "$3" = "true" ]; then
+               WASM_FILE=liblightningjs_debug.wasm
+               $COMPILE -o liblightningjs_debug.wasm -g -O1 -I"$1"/lightning-c-bindings/include/ ts/bindings.c "$1"/lightning-c-bindings/target/wasm32-wasi/debug/libldk.a $EXTRA_LINK
        else
        else
+               WASM_FILE=liblightningjs_release.wasm
+               $COMPILE -o liblightningjs_release.wasm -s -Oz -I"$1"/lightning-c-bindings/include/ ts/bindings.c "$1"/lightning-c-bindings/target/wasm32-wasi/release/libldk.a $EXTRA_LINK
+       fi
+
+       if [ -x "$(which tsc)" ]; then
+               cd ts
+               for F in structs/*; do
+                       cat imports.mts.part | grep -v " $(basename -s .mts $F)[ ,]" | cat - $F > $F.tmp
+                       mv $F.tmp $F
+               done
+               rm imports.mts.part
+               tsc --types node --typeRoots .
+               cp ../$WASM_FILE liblightningjs.wasm
+               cp ../README.md README.md
+               cd ../node-net
+               tsc --types node --typeRoots .
+               echo Ready to publish!
+               if [ -x "$(which node)" ]; then
+                       NODE_V="$(node --version)"
+                       if [ "${NODE_V:1:2}" -gt 14 ]; then
+                               cd ../ts
+                               node --stack_trace_limit=200 --trace-uncaught test/node.mjs
+                               cd ../node-net
+                               node --stack_trace_limit=200 --trace-uncaught test/test.mjs
+                       fi
+               fi
+       fi
+else
+       if is_gnu_sed; then
                sed -i "s/^    <version>.*<\/version>/    <version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" pom.xml
                sed -i "s/^    <version>.*<\/version>/    <version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" pom.xml
+       else
+         # OSX sed is for some reason not compatible with GNU sed
+               sed -i '' "s/^    <version>.*<\/version>/    <version>${LDK_GARBAGECOLLECTED_GIT_OVERRIDE:1:100}<\/version>/g" pom.xml
        fi
 
        echo "Creating Java bindings..."
        fi
 
        echo "Creating Java bindings..."
@@ -81,9 +244,9 @@ if [ "$2" != "wasm" ]; then
        rm -f src/main/java/org/ldk/{enums,structs}/*.java
        rm -f src/main/jni/*.h
        if [ "$4" = "true" ]; then
        rm -f src/main/java/org/ldk/{enums,structs}/*.java
        rm -f src/main/jni/*.h
        if [ "$4" = "true" ]; then
-               ./genbindings.py "./lightning.h" src/main/java/org/ldk/impl src/main/java/org/ldk src/main/jni/ $DEBUG_ARG android $4
+               ./genbindings.py "./lightning.h" src/main/java/org/ldk/impl src/main/java/org/ldk src/main/jni/ $DEBUG_ARG android $4 $TARGET_STRING
        else
        else
-               ./genbindings.py "./lightning.h" src/main/java/org/ldk/impl src/main/java/org/ldk src/main/jni/ $DEBUG_ARG java $4
+               ./genbindings.py "./lightning.h" src/main/java/org/ldk/impl src/main/java/org/ldk src/main/jni/ $DEBUG_ARG java $4 $TARGET_STRING
        fi
        rm -f src/main/jni/bindings.c
        if [ "$3" = "true" ]; then
        fi
        rm -f src/main/jni/bindings.c
        if [ "$3" = "true" ]; then
@@ -93,30 +256,30 @@ if [ "$2" != "wasm" ]; then
                # __unmangle_inner_ptr, but the C code expects to be able to call it.
                echo "#define __unmangle_inner_ptr(a) (a)" > src/main/jni/bindings.c
        fi
                # __unmangle_inner_ptr, but the C code expects to be able to call it.
                echo "#define __unmangle_inner_ptr(a) (a)" > src/main/jni/bindings.c
        fi
-       echo "#define LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ" >> src/main/jni/bindings.c
-       echo "#define CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free" >> src/main/jni/bindings.c
+       cat header.c >> src/main/jni/bindings.c
+       cat header.c >> src/main/jni/bindings.c
        cat src/main/jni/bindings.c.body >> src/main/jni/bindings.c
        javac -h src/main/jni src/main/java/org/ldk/enums/*.java src/main/java/org/ldk/impl/*.java
        rm src/main/java/org/ldk/enums/*.class src/main/java/org/ldk/impl/bindings*.class
 
        cat src/main/jni/bindings.c.body >> src/main/jni/bindings.c
        javac -h src/main/jni src/main/java/org/ldk/enums/*.java src/main/java/org/ldk/impl/*.java
        rm src/main/java/org/ldk/enums/*.class src/main/java/org/ldk/impl/bindings*.class
 
-       IS_MAC=false
-       [ "$($CC --version | grep apple-darwin)" != "" ] && IS_MAC=true
-       IS_APPLE_CLANG=false
-       [ "$($CC --version | grep "Apple clang version")" != "" ] && IS_APPLE_CLANG=true
-
        echo "Building Java bindings..."
        echo "Building Java bindings..."
-       COMPILE="$COMMON_COMPILE -mcpu=$LDK_TARGET_CPU -Isrc/main/jni -pthread -ldl -shared -fPIC"
-       [ "$IS_MAC" = "false" ] && COMPILE="$COMPILE -Wl,--no-undefined"
+       COMPILE="$COMMON_COMPILE -Isrc/main/jni -pthread -fPIC"
+       LINK="-ldl -shared"
+       [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined"
        [ "$IS_MAC" = "true" ] && COMPILE="$COMPILE -mmacosx-version-min=10.9"
        [ "$IS_MAC" = "true" ] && COMPILE="$COMPILE -mmacosx-version-min=10.9"
-       [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && COMPILE="$COMPILE -fuse-ld=lld"
+       [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -fuse-ld=lld"
        [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && echo "WARNING: Need at least upstream clang 13!"
        [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && echo "WARNING: Need at least upstream clang 13!"
-       [ "$IS_MAC" = "false" -a "$3" != "false" ] && COMPILE="$COMPILE -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,malloc -Wl,-wrap,free"
+       [ "$IS_MAC" = "false" -a "$3" != "false" ] && LINK="$LINK -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,malloc -Wl,-wrap,free"
        if [ "$3" = "true" ]; then
        if [ "$3" = "true" ]; then
-               $COMPILE -o liblightningjni_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ $2 src/main/jni/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
+               $COMPILE $LINK -o liblightningjni_debug$LDK_TARGET_SUFFIX.so -g -fsanitize=address -shared-libasan -rdynamic -I"$1"/lightning-c-bindings/include/ $2 src/main/jni/bindings.c "$1"/lightning-c-bindings/target/$LDK_TARGET/debug/libldk.a -lm
        else
        else
+               [ "$IS_MAC" = "false" ] && LINK="$LINK -Wl,--no-undefined -flto -Wl,-O3 -Wl,--lto-O3"
+               [ "$IS_MAC" = "false" ] && COMPILE="$COMPILE -flto"
+               [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && LINK="$LINK -flto -Wl,-O3 -Wl,--lto-O3"
+               [ "$IS_MAC" = "true" -a "$IS_APPLE_CLANG" = "false" ] && COMPILE="$COMPILE -flto"
                LDK_LIB="$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a
                if [ "$IS_MAC" = "false" -a "$4" = "false" ]; then
                LDK_LIB="$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a
                if [ "$IS_MAC" = "false" -a "$4" = "false" ]; then
-                       COMPILE="$COMPILE -Wl,--version-script=libcode.version -fuse-ld=lld"
+                       LINK="$LINK -Wl,--version-script=libcode.version -fuse-ld=lld"
                        # __cxa_thread_atexit_impl is used to more effeciently cleanup per-thread local storage by rust libstd.
                        # However, it is not available on glibc versions 2.17 or earlier, and rust libstd has a null-check and
                        # fallback in case it is missing.
                        # __cxa_thread_atexit_impl is used to more effeciently cleanup per-thread local storage by rust libstd.
                        # However, it is not available on glibc versions 2.17 or earlier, and rust libstd has a null-check and
                        # fallback in case it is missing.
@@ -142,7 +305,7 @@ if [ "$2" != "wasm" ]; then
                                echo "Archive contained non-object files!"
                                exit 1
                        fi
                                echo "Archive contained non-object files!"
                                exit 1
                        fi
-                       if [ "$(ar t "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a | grep ldk.ldk.*-cgu.*.rcgu.o | wc -l)" != "1" ]; then
+                       if [ "$(ar t "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a | grep ldk.*-cgu.*.rcgu.o | wc -l)" != "1" ]; then
                                echo "Archive contained more than one LDK object file"
                                exit 1
                        fi
                                echo "Archive contained more than one LDK object file"
                                exit 1
                        fi
@@ -150,14 +313,16 @@ if [ "$2" != "wasm" ]; then
                        rm -f tmp/*
                        ar x --output=tmp "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a
                        pushd tmp
                        rm -f tmp/*
                        ar x --output=tmp "$1"/lightning-c-bindings/target/$LDK_TARGET/release/libldk.a
                        pushd tmp
-                       llvm-dis ldk.ldk.*-cgu.*.rcgu.o
-                       sed -i 's/br i1 icmp eq (i8\* @__cxa_thread_atexit_impl, i8\* null)/br i1 icmp eq (i8* null, i8* null)/g' ldk.ldk.*-cgu.*.rcgu.o.ll
-                       llvm-as ldk.ldk.*-cgu.*.rcgu.o.ll -o ./libldk.bc
+                       llvm-dis ldk*-cgu.*.rcgu.o
+                       sed -i 's/br i1 icmp eq (i8\* @__cxa_thread_atexit_impl, i8\* null)/br i1 icmp eq (i8* null, i8* null)/g' ldk*-cgu.*.rcgu.o.ll
+                       llvm-as ldk*-cgu.*.rcgu.o.ll -o ./libldk.bc
                        ar q libldk.a *.o
                        popd
                        LDK_LIB="tmp/libldk.bc tmp/libldk.a"
                fi
                        ar q libldk.a *.o
                        popd
                        LDK_LIB="tmp/libldk.bc tmp/libldk.a"
                fi
-               $COMPILE -o liblightningjni_release$LDK_TARGET_SUFFIX.so -flto -O3 -I"$1"/lightning-c-bindings/include/ $2 src/main/jni/bindings.c $LDK_LIB
+               $COMPILE -o bindings.o -c -O3 -I"$1"/lightning-c-bindings/include/ $2 src/main/jni/bindings.c
+               $COMPILE $LINK -o liblightningjni_release$LDK_TARGET_SUFFIX.so -O3 -I"$1"/lightning-c-bindings/include/ $2 bindings.o $LDK_LIB -lm
+               [ "$IS_APPLE_CLANG" != "true" ] && llvm-strip liblightningjni_release$LDK_TARGET_SUFFIX.so
                if [ "$IS_MAC" = "false" -a "$4" = "false" ]; then
                        GLIBC_SYMBS="$(objdump -T liblightningjni_release$LDK_TARGET_SUFFIX.so | grep GLIBC_ | grep -v "GLIBC_2\.2\." | grep -v "GLIBC_2\.3\(\.\| \)" | grep -v "GLIBC_2.\(14\|17\) " || echo)"
                        if [ "$GLIBC_SYMBS" != "" ]; then
                if [ "$IS_MAC" = "false" -a "$4" = "false" ]; then
                        GLIBC_SYMBS="$(objdump -T liblightningjni_release$LDK_TARGET_SUFFIX.so | grep GLIBC_ | grep -v "GLIBC_2\.2\." | grep -v "GLIBC_2\.3\(\.\| \)" | grep -v "GLIBC_2.\(14\|17\) " || echo)"
                        if [ "$GLIBC_SYMBS" != "" ]; then
@@ -177,60 +342,4 @@ if [ "$2" != "wasm" ]; then
                        cp liblightningjni_release$LDK_TARGET_SUFFIX.so src/main/resources/liblightningjni$LDK_TARGET_SUFFIX.nativelib
                fi
        fi
                        cp liblightningjni_release$LDK_TARGET_SUFFIX.so src/main/resources/liblightningjni$LDK_TARGET_SUFFIX.nativelib
                fi
        fi
-else
-       echo "Creating TS bindings..."
-       mkdir -p ts/{enums,structs}
-       rm -f ts/{enums,structs,}/*.{mjs,mts,mts.part}
-       if [ "$4" = "false" ]; then
-               ./genbindings.py "./lightning.h" ts ts ts $DEBUG_ARG typescript node
-       else
-               ./genbindings.py "./lightning.h" ts ts ts $DEBUG_ARG typescript browser
-       fi
-       rm -f ts/bindings.c
-       if [ "$3" = "true" ]; then
-               echo "#define LDK_DEBUG_BUILD" > ts/bindings.c
-       elif [ "$3" = "leaks" ]; then
-               # For leak checking we use release libldk which doesn't expose
-               # __unmangle_inner_ptr, but the C code expects to be able to call it.
-               echo "#define __unmangle_inner_ptr(a) (a)" > ts/bindings.c
-       fi
-       echo "#define LDKCVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ LDKCVec_TransactionOutputsZ" >> ts/bindings.c
-       echo "#define CVec_C2Tuple_TxidCVec_C2Tuple_u32TxOutZZZZ_free CVec_TransactionOutputsZ_free" >> ts/bindings.c
-       cat ts/bindings.c.body >> ts/bindings.c
-
-       echo "Building TS bindings..."
-       COMPILE="$COMMON_COMPILE -flto -Wl,--no-entry -nostdlib --target=wasm32-wasi -Wl,-z -Wl,stack-size=$((8*1024*1024)) -Wl,--initial-memory=$((16*1024*1024)) -Wl,--max-memory=$((1024*1024*1024)) -Wl,--global-base=4096"
-       # We only need malloc and assert/abort, but for now just use WASI for those:
-       #EXTRA_LINK=/usr/lib/wasm32-wasi/libc.a
-       EXTRA_LINK=
-       [ "$3" != "false" ] && COMPILE="$COMPILE -Wl,-wrap,calloc -Wl,-wrap,realloc -Wl,-wrap,reallocarray -Wl,-wrap,malloc -Wl,-wrap,free"
-       if [ "$3" = "true" ]; then
-               WASM_FILE=liblightningjs_debug.wasm
-               $COMPILE -o liblightningjs_debug.wasm -g -I"$1"/lightning-c-bindings/include/ ts/bindings.c "$1"/lightning-c-bindings/target/wasm32-wasi/debug/libldk.a $EXTRA_LINK
-       else
-               WASM_FILE=liblightningjs_release.wasm
-               $COMPILE -o liblightningjs_release.wasm -s -Os -I"$1"/lightning-c-bindings/include/ ts/bindings.c "$1"/lightning-c-bindings/target/wasm32-wasi/release/libldk.a $EXTRA_LINK
-       fi
-
-       if [ -x "$(which tsc)" ]; then
-               cd ts
-               for F in structs/*; do
-                       cat imports.mts.part | grep -v " $(basename -s .mts $F)[ ,]" | cat - $F > $F.tmp
-                       mv $F.tmp $F
-               done
-               rm imports.mts.part
-               if [ "$4" = "true" ]; then
-                       tsc
-               else
-                       tsc --types node --typeRoots .
-                       if [ -x "$(which node)" ]; then
-                               NODE_V="$(node --version)"
-                               if [ "${NODE_V:1:2}" -gt 14 ]; then
-                                       rm -f liblightningjs.wasm
-                                       ln -s "$(pwd)"/../$WASM_FILE liblightningjs.wasm
-                                       node test/node.mjs
-                               fi
-                       fi
-               fi
-       fi
 fi
 fi