# Getting Started ## Requirements | Dependency | Version | Notes | |---|---|---| | CMake | ≥ 3.21 | | | C++ compiler | GCC ≥ 11, Clang ≥ 13 | C++20 required | | nanobind | ≥ 2.1 | auto-fetched; Python ≥ 3.8 | | Catch2 | v3 | auto-fetched for tests | | OpenCV | ≥ 4 | optional; only for examples 09/12/13 | ## Build ```bash cmake -B build # core + tests + C++ examples cmake --build build --parallel ctest --test-dir build # run all tests including example smoke tests ``` Enable Python bindings: ```bash cmake -B build -DKPN_BUILD_PYTHON=ON cmake --build build --parallel ``` Skip examples: ```bash cmake -B build -DKPN_BUILD_EXAMPLES=OFF ``` ## Your first pipeline Three functions — source, transform, sink — wired into a `Network`: ```cpp --8<-- "examples/01_hello_pipeline/main.cpp:basic_node_fns" ``` Create nodes, connect them, build and run: ```cpp --8<-- "examples/01_hello_pipeline/main.cpp:network_build" ``` That's it. Types are inferred from function signatures. The channel between `src` and `dbl` carries `int`; the channel between `dbl` and `prn` also carries `int`. A type mismatch is a compile error. ## Named ports For nodes with multiple inputs or outputs, name the ports for clarity: ```cpp --8<-- "examples/02_named_ports/main.cpp:named_port_creation" ``` Wire by name instead of index: ```cpp --8<-- "examples/02_named_ports/main.cpp:named_port_network" ``` ## Multi-output nodes Return a `std::tuple` to fan out to multiple downstream nodes: ```cpp --8<-- "examples/03_multi_output/main.cpp:multi_output_fn" ``` Wire each tuple element to its own downstream node: ```cpp --8<-- "examples/03_multi_output/main.cpp:fanout_network" ```