Add ability to get the LDK and LDK-C-Bindings version
authorMatt Corallo <git@bluematt.me>
Sun, 2 May 2021 18:37:45 +0000 (18:37 +0000)
committerMatt Corallo <git@bluematt.me>
Sun, 2 May 2021 19:34:43 +0000 (19:34 +0000)
c-bindings-gen/src/main.rs
genbindings.sh
lightning-c-bindings/cbindgen.toml
lightning-c-bindings/demo.c
lightning-c-bindings/demo.cpp

index c2ef30fbcf83a9e0c37204e1ee1b0f9466756ba4..7d26edce5a4a4bd3bf694300a3dcddadc794b429 100644 (file)
@@ -1422,6 +1422,7 @@ fn convert_file<'a, 'b>(libast: &'a FullLibraryAST, crate_types: &CrateTypes<'a>
                        writeln!(out, "#![allow(unused_braces)]").unwrap();
                        // TODO: We need to map deny(missing_docs) in the source crate(s)
                        //writeln!(out, "#![deny(missing_docs)]").unwrap();
+                       writeln!(out, "pub mod version;").unwrap();
                        writeln!(out, "pub mod c_types;").unwrap();
                        writeln!(out, "pub mod bitcoin;").unwrap();
                } else {
index ea725bd5d1f96e1666baa958c7b01ced987b96e5..2a5e985e99355b71010484d3d3f11c246f8824da 100755 (executable)
@@ -13,6 +13,7 @@ fi
 ORIG_PWD="$(pwd)"
 cd "$1"
 LIGHTNING_PATH="$(pwd)"
+LIGHTNING_GIT="$(git describe --tag --dirty)"
 cd "$ORIG_PWD"
 
 # Generate (and reasonably test) C bindings
@@ -25,6 +26,42 @@ cd c-bindings-gen && cargo build --release && cd ..
 mv lightning-c-bindings/src/c_types/mod.rs ./
 mv lightning-c-bindings/src/bitcoin ./
 
+# Before we try to sed the Cargo.toml, generate version define tags
+# (ignoring any files that we're about to generate)
+
+git checkout lightning-c-bindings/src
+git checkout lightning-c-bindings/include
+BINDINGS_GIT="$(git describe --tag --dirty)"
+echo -e "#ifndef _LDK_HEADER_VER" > lightning-c-bindings/include/ldk_ver.h
+echo -e "static inline int _ldk_strncmp(const char *s1, const char *s2, uint64_t n) {" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\tif (n && *s1 != *s2) return 1;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\twhile (n && *s1 != 0 && *s2 != 0) {" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t\ts1++; s2++; n--;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t\tif (n && *s1 != *s2) return 1;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t}" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\treturn 0;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "}" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "#define _LDK_HEADER_VER \"$LIGHTNING_GIT\"" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "#define _LDK_C_BINDINGS_HEADER_VER \"$BINDINGS_GIT\"" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "static inline const char* check_get_ldk_version() {" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\tLDKStr bin_ver = _ldk_get_compiled_version();" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\tif (_ldk_strncmp(_LDK_HEADER_VER, (const char*)bin_ver.chars, bin_ver.len) != 0) {" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t// Version mismatch, we don't know what we're running!" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t\treturn 0;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t}" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\treturn _LDK_HEADER_VER;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "}" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "static inline const char* check_get_ldk_bindings_version() {" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\tLDKStr bin_ver = _ldk_c_bindings_get_compiled_version();" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\tif (_ldk_strncmp(_LDK_C_BINDINGS_HEADER_VER, (const char*)bin_ver.chars, bin_ver.len) != 0) {" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t// Version mismatch, we don't know what we're running!" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t\treturn 0;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\t}" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "\treturn _LDK_C_BINDINGS_HEADER_VER;" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "}" >> lightning-c-bindings/include/ldk_ver.h
+echo -e "#endif /* _LDK_HEADER_VER */" >> lightning-c-bindings/include/ldk_ver.h
+
 rm -rf lightning-c-bindings/src
 
 mkdir -p lightning-c-bindings/src/{c_types,lightning}
@@ -34,7 +71,7 @@ mv ./bitcoin lightning-c-bindings/src/
 # Finally, run the c-bindings-gen binary, building fresh bindings.
 OUT="$(pwd)/lightning-c-bindings/src"
 OUT_TEMPL="$(pwd)/lightning-c-bindings/src/c_types/derived.rs"
-OUT_F="$(pwd)/lightning-c-bindings/include/rust_types.h"
+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"
 
@@ -83,6 +120,15 @@ add_crate "lightning-invoice" "lightning_invoice"
 
 cat /tmp/crate-source.txt | RUST_BACKTRACE=1 "$BIN" "$OUT/" "$OUT_TEMPL" "$OUT_F" "$OUT_CPP"
 
+echo -e '#[no_mangle]' >> lightning-c-bindings/src/version.rs
+echo -e 'pub extern "C" fn _ldk_get_compiled_version() -> crate::c_types::Str {' >> lightning-c-bindings/src/version.rs
+echo -e '\t"'"$LIGHTNING_GIT"'".into()' >> lightning-c-bindings/src/version.rs
+echo -e '}' >> lightning-c-bindings/src/version.rs
+echo -e '#[no_mangle]' >> lightning-c-bindings/src/version.rs
+echo -e 'pub extern "C" fn _ldk_c_bindings_get_compiled_version() -> crate::c_types::Str {' >> lightning-c-bindings/src/version.rs
+echo -e '\t"'"$BINDINGS_GIT"'".into()' >> lightning-c-bindings/src/version.rs
+echo -e '}' >> lightning-c-bindings/src/version.rs
+
 # Set path to include our rustc wrapper as well as cbindgen
 PATH="$(pwd)/deterministic-build-wrappers:$PATH:~/.cargo/bin"
 # Now cd to lightning-c-bindings, build the generated bindings, and call cbindgen to build a C header file
@@ -110,18 +156,18 @@ if [ "$HOST_PLATFORM" = "host: x86_64-apple-darwin" ]; then
 
        # 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 <stdlib.h>//g' include/lightning.h
+       sed -i '' 's/#include <stdlib.h>/#include <ldk_rust_types.h>/g' include/lightning.h
 else
        sed -i 's/typedef LDKnative.*Import.*LDKnative.*;//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 <stdlib.h>//g' include/lightning.h
+       sed -i 's/#include <stdlib.h>/#include <ldk_rust_types.h>/g' include/lightning.h
 fi
 
 # Finally, sanity-check the generated C and C++ bindings with demo apps:
 
-LOCAL_CFLAGS="-Wall -Wno-nullability-completeness -pthread"
+LOCAL_CFLAGS="-Wall -Wno-nullability-completeness -pthread -Iinclude/"
 
 # Naively run the C demo app:
 gcc $LOCAL_CFLAGS -Wall -g -pthread demo.c target/debug/libldk.a -ldl
index b9e49b3602890cbb8be374f8addaa7e12f2677fb..bcbe2641dc4a39e161d877b98f14d22253c1a014 100644 (file)
@@ -1,6 +1,7 @@
 language = "C"
 include_guard = "LDK_C_BINDINGS_H"
 autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */"
+trailer = "#include <ldk_ver.h>"
 include_version = true
 namespace = "LDK"
 
index 2e4d363f0310f484cc93d2127013978bdbc51222..2a45e4644157a903313c419fa09632563e2db205 100644 (file)
@@ -1,5 +1,4 @@
-#include "include/rust_types.h"
-#include "include/lightning.h"
+#include <lightning.h>
 
 #include <assert.h>
 #include <stdio.h>
index f2641094b2b6602c959e4e3adb145d968750c298..4bc3115e9715295ce96d1ffa0cf1f3b372d6120e 100644 (file)
@@ -1,6 +1,5 @@
 extern "C" {
-#include "include/rust_types.h"
-#include "include/lightning.h"
+#include <lightning.h>
 }
 #include "include/lightningpp.hpp"