diff --git a/.gitignore b/.gitignore index ed070c9c8..451814e44 100644 --- a/.gitignore +++ b/.gitignore @@ -34,5 +34,3 @@ rln package-lock.json node_modules/ /.update.timestamp - -libwaku diff --git a/Makefile b/Makefile index 596d77f0a..9edb9980b 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,8 @@ DOCKER_IMAGE_NIM_PARAMS ?= -d:chronicles_colors:none -d:insecure bridge \ test \ clean \ + libwaku.so \ + wrappers \ libbacktrace ifeq ($(NIM_PARAMS),) @@ -128,7 +130,7 @@ rlnlib: ifeq ($(RLN), true) cargo build --manifest-path vendor/rln/Cargo.toml endif - + test2: | build deps installganache echo -e $(BUILD_MSG) "build/$@" && \ $(ENV_SCRIPT) nim test2 $(NIM_PARAMS) waku.nims @@ -185,3 +187,17 @@ ifneq ($(USE_LIBBACKTRACE), 0) endif endif # "variables.mk" was not included + +libwaku.so: | build deps + echo -e $(BUILD_MSG) "build/$@" && \ + $(ENV_SCRIPT) nim c --app:lib --noMain --nimcache:nimcache/libwaku $(NIM_PARAMS) -o:build/$@.0 wrappers/libwaku.nim && \ + rm -f build/$@ && \ + ln -s $@.0 build/$@ + +# libraries for dynamic linking of non-Nim objects +EXTRA_LIBS_DYNAMIC := -L"$(CURDIR)/build" -lwaku -lm +wrappers: | build deps libwaku.so + echo -e $(BUILD_MSG) "build/C_wrapper_example" && \ + $(CC) wrappers/wrapper_example.c -Wl,-rpath,'$$ORIGIN' $(EXTRA_LIBS_DYNAMIC) -g -o build/C_wrapper_example + echo -e $(BUILD_MSG) "build/go_wrapper_example" && \ + go build -ldflags "-linkmode external -extldflags '$(EXTRA_LIBS_DYNAMIC)'" -o build/go_wrapper_example wrappers/wrapper_example.go #wrappers/cfuncs.go diff --git a/vendor/nim-libbacktrace/vendor/libbacktrace-upstream/libtool b/vendor/nim-libbacktrace/vendor/libbacktrace-upstream/libtool index 880292b46..ddbf1b1d3 100755 --- a/vendor/nim-libbacktrace/vendor/libbacktrace-upstream/libtool +++ b/vendor/nim-libbacktrace/vendor/libbacktrace-upstream/libtool @@ -2,7 +2,7 @@ # libtool - Provide generalized library-building support services. # Generated automatically by config.status (libbacktrace) version-unused -# Libtool was configured on host fv-az190-125: +# Libtool was configured on host fv-az129-187: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, diff --git a/wrappers/README.md b/wrappers/README.md new file mode 100644 index 000000000..4ecd2ff3f --- /dev/null +++ b/wrappers/README.md @@ -0,0 +1,9 @@ +# libwaku + +Exposes a C API that can be used by other environments other than C. + +## Running + +``` +make wrappers +``` diff --git a/wrappers/libwaku.h b/wrappers/libwaku.h new file mode 100644 index 000000000..dce2deaa3 --- /dev/null +++ b/wrappers/libwaku.h @@ -0,0 +1,14 @@ +#ifndef __LIBWAKU_H__ +#define __LIBWAKU_H__ + +#include +#include + +// Initialize Nim +void NimMain(); + +char* info(const char* wakuNode); + +void echo(); + +#endif //__LIBWAKU_H__ diff --git a/wrappers/libwaku.nim b/wrappers/libwaku.nim new file mode 100644 index 000000000..936233e1d --- /dev/null +++ b/wrappers/libwaku.nim @@ -0,0 +1,38 @@ +# libwaku +# +# Exposes a C API that can be used by other environment than C. + +# TODO Start a node +# TODO Mock info call +# TODO Write header file +# TODO Write example C code file +# TODO Wrap info call +# TODO Init a node + +# proc info*(node: WakuNode): WakuInfo = +proc info(foo: cstring): cstring {.exportc, dynlib.} = + echo "info about node" + echo foo + return foo + +proc echo() {.exportc.} = + echo "echo" + +# TODO Here at the moment, start the node +# Then do info call +# WIP +#proc main() {.async.} = +# let +# rng = crypto.newRng() +# conf = WakuNodeConf.load() +# (extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId, +# Port(uint16(conf.tcpPort) + conf.portsShift), +# Port(uint16(conf.udpPort) + conf.portsShift)) +# node = WakuNode.init(conf.nodeKey, conf.listenAddress, +# Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort) +# +# await node.start() +# +#main() + + # When main done stuff diff --git a/wrappers/wrapper_example.c b/wrappers/wrapper_example.c new file mode 100644 index 000000000..33bec5db3 --- /dev/null +++ b/wrappers/wrapper_example.c @@ -0,0 +1,14 @@ +#include +#include + +#include "libwaku.h" + +void NimMain(); + +int main(int argc, char* argv[]) { + char* string; + NimMain(); + //echo(); + string = info("hello there"); + printf("Info: %s", string); +} diff --git a/wrappers/wrapper_example.go b/wrappers/wrapper_example.go new file mode 100644 index 000000000..4291e2dd0 --- /dev/null +++ b/wrappers/wrapper_example.go @@ -0,0 +1,35 @@ +package main + +import ( + "fmt" + "runtime" +) + +/* +#include + +// Passing "-lwaku" to the Go linker through "-extldflags" is not enough. We need it in here, for some reason. +#cgo LDFLAGS: -Wl,-rpath,'$ORIGIN' -L${SRCDIR}/../build -lwaku +#include "libwaku.h" + +*/ +import "C" + +// Arrange that main.main runs on main thread. +func init() { + runtime.LockOSThread() +} + +func Start() { + C.NimMain() + + messageC := C.CString("Calling info") + fmt.Println("Start nim-waku") + var str = C.info(messageC) + fmt.Println("Info", str) +} + +func main() { + fmt.Println("Hi main") + Start() +}