This example shows how to create dora operators and custom nodes with C++.
Dora provides a C++ API (dora-node-api-cxx / dora-operator-api-cxx, documented in the C++ API reference); it is bridged from dora's Rust API via the cxx crate. It also provides a C API. The node-rust-api and operator-rust-api folders use the C++ API, while the node-c-api and operator-c-api folders use the C API. Both approaches work, so you can choose the API that fits your application better.
To try it out, you can use the run.rs binary. It performs all required build steps and then starts the dataflow. Use the following command to run it: cargo run --example cxx-dataflow.
For a manual build, follow these steps:
- Create a
buildfolder in this directory - Build the C++ variants (
node-rust-api,operator-rust-api), which are bridged from the Rust API with thecxxcrate:This only builds the crates. Producing thecargo build -p dora-node-api-cxx cargo build -p dora-operator-api-cxxbuild/node_rust_apiandbuild/operator_rust_apiartifacts thatdataflow.ymlexpects additionally requires copying the generated bridge sources intobuild/under the names the C++ sources include:dora-node-api-cxx'starget/cxxbridge/.../src/lib.rs.cc→build/node-bridge.ccandlib.rs.h→build/dora-node-api.h, thedora-operator-api-cxxequivalents →build/operator-bridge.ccandbuild/dora-operator-api.h, plus thebuild/operator.hshim. Then compile thenode-rust-api/operator-rust-apisources against them, linking-l dora_node_api_cxxand-l dora_operator_api_cxx -L ../../target/debug(from this directory), and build the operator as a shared library.run.rsdoes all of this, so running it is the simplest way to build the C++ variants. - The steps below build only the C-API variants (
node_c_api,operator_c_api).dataflow.ymlalso needs the C++ artifacts above, so the C-API half alone is not enough to run the example end to end. - Compile the
dora-node-api-ccrate into a static library.- Run
cargo build -p dora-node-api-c --release - The resulting staticlib is then available under
../../target/release/libdora_node_api_c.a.
- Run
- Compile the
node-c-api/main.cc(e.g. usingclang++) and link the staticlib- For example, use the following command:
clang++ node-c-api/main.cc <FLAGS> -std=c++14 -ldora_node_api_c -L ../../target/release --output build/node_c_api - The
<FLAGS>depend on the operating system and the libraries that the C node uses. The following flags are required for each OS:- Linux:
-lm -lrt -ldl -pthread - macOS:
-framework CoreServices -framework Security -l System -l resolv -l pthread -l c -l m - Windows:
Also: On Windows, the output file should have an
-ladvapi32 -luserenv -lkernel32 -lws2_32 -lbcrypt -lncrypt -lschannel -lntdll -liphlpapi -lcfgmgr32 -lcredui -lcrypt32 -lcryptnet -lfwpuclnt -lgdi32 -lmsimg32 -lmswsock -lole32 -loleaut32 -lopengl32 -lsecur32 -lshell32 -lsynchronization -luser32 -lwinspool -Wl,-nodefaultlib:libcmt -D_DLL -lmsvcrt.exeextension:--output build/c_node.exe
- Linux:
- For example, use the following command:
- Compile the
operator-c-api/operator.ccfile into a shared library. The operator calls into thedora-operator-api-cstaticlib, so build that and link it too:- For example, use the following commands:
Omit the
cargo build -p dora-operator-api-c --release clang++ -c operator-c-api/operator.cc -std=c++14 -o build/operator_c_api.o -fPIC clang++ -shared build/operator_c_api.o -o build/liboperator_c_api.so -ldora_operator_api_c -L ../../target/release-fPICargument on Windows. Replace theliboperator_c_api.soname with the shared library standard library prefix/extensions used on your OS, e.g..dllon Windows.
- For example, use the following commands:
Build the dora CLI:
- Build the
doraexecutable usingcargo build -p dora-cli --release- This is the only dora binary you need: it embeds the coordinator and the
daemon, and hosts shared-library operators like the one above through its
dora runtimesubcommand, which the daemon spawns for you.
- This is the only dora binary you need: it embeds the coordinator and the
daemon, and hosts shared-library operators like the one above through its
Run the dataflow:
-
Run the dataflow with the CLI built above:
../../target/release/dora run dataflow.yml